- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将此矩阵 data 放入列中使用此 Python 代码:
#!/usr/local/bin/env python
import numpy as np
import Tkinter #Used for file import
import tkFileDialog #Used for file import
import os
import scipy
import scipy.optimize as optimize
root = Tkinter.Tk()
root.withdraw() #use to hide tkinter window
filename = os.getcwd()
background = os.getcwd()
filename = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a file')
background = tkFileDialog.askopenfile(parent=root,mode='rb',title='Choose a background')
filename = filename.name
#filename = r'bb1e03'
#background = r'bb1e03_background'
T0 = np.loadtxt(filename, unpack=False)
bg = np.loadtxt(background, unpack=False)
T = T0-bg # background subtraction?
#T = T.clip(min=0)
T[T<0]=0
T = np.flipud(T)
N, M = T.shape
datax = np.arange(N)
def gaussian(x, height, center, width, offset):
return height*np.exp(-(x - center)**2/(2*width**2)) + offset
def three_gaussians(x, h1, c1, w1, h2, c2, w2, h3, c3, w3, offset):
return (gaussian(x, h1, c1, w1, offset=0) +
gaussian(x, h2, c2, w2, offset=0) +
gaussian(x, h3, c3, w3, offset=0) + offset)
def two_gaussians(x, h1, c1, w1, h2, c2, w2, offset):
return three_gaussians(x, h1, c1, w1, h2, c2, w2, 0,0,1, offset)
def one_gaussian(x,h1,c1,w1, offset):
return (gaussian(x, h1, c1, w1, offset=0)+offset)
#errfunc3 = lambda p, x, y: (three_gaussians(x, *p) - y)**2
#errfunc2 = lambda p, x, y: (two_gaussians(x, *p) - y)**2
#errfunc1 = lambda p, x, y: (one_gaussian(x, *p) - y)**2
#output files for fit parameters
outfile1 = open('results_1gau.txt', 'w')
outfile2 = open('results_2gau.txt', 'w')
outfile3 = open('results_3gau.txt', 'w')
outfile1.write('column\th1\tc1\tw1\toffset\n')
outfile2.write('column\th1\tc1\tw1\th2\tc2\tw2\toffset\n')
outfile3.write('column\th1\tc1\tw1\th2\tc2\tw2\th3\tc3\tw3\toffset\n')
# new matrices for fitted data
datafit1 = np.empty_like(T)
datafit2 = np.empty_like(T)
datafit3 = np.empty_like(T)
for n in xrange(M):
Mmax = T[:,n].max()
guess1 = [0.5*Mmax, N/10., 10., 0.]
guess2 = [0.5*Mmax, N/10., 10., 0.5*Mmax, N/10., 10., 0.]
guess3 = [0.5*Mmax, N/10., 10., 0.5*Mmax, N/10., 10.,
0.5*Mmax, N/10., 10., 0]
#optim3, success = optimize.leastsq(errfunc3, guess3[:],
# args=(datax, data[:,n]))
#optim2, success = optimize.leastsq(errfunc2, guess2[:],
# args=(datax, data[:,n]))
try:
optim1, pcov = optimize.curve_fit(one_gaussian, datax, T[:,n], guess1)
except:
optim1 = [0, 0, 1, 0]
try:
optim2, pcov = optimize.curve_fit(two_gaussians, datax, T[:,n], guess2)
except:
optim2 = [0, 0, 1, 0, 0, 1, 0]
try:
optim3, pcov = optimize.curve_fit(three_gaussians, datax, T[:,n], guess3)
except:
optim3 = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0]
# write parameters to file (1 gau)
s = '{}'.format(n)
for x in guess1:
s += '\t{:g}'.format(x)
outfile1.write(s + '\n')
# write parameters to file (2 gau)
s = '{}'.format(n)
for x in guess2:
s += '\t{:g}'.format(x)
outfile2.write(s + '\n')
# write parameters to file (3 gau)
s = '{}'.format(n)
for x in guess3:
s += '\t{:g}'.format(x)
outfile3.write(s + '\n')
# fill new matrices with fitted data
datafit1[:,n] = one_gaussian(datax, *optim1)
datafit2[:,n] = two_gaussians(datax, *optim2)
datafit3[:,n] = three_gaussians(datax, *optim3)
T = datafit1
我已经阅读了大部分与拟合相关的帖子,但我找不到我的代码有什么问题。它应该可以工作,但最终的矩阵“T”仅显示具有常数的列,而不是漂亮的平滑高斯形状曲线。请看看并告诉我我做错了什么。我在其他程序中尝试过,例如 OriginLab,并且拟合效果很好。
谢谢。
最佳答案
您遇到了向曲线拟合算法提供错误猜测 的经典问题。这完全是由于您不必要地颠倒矩阵 T 然后没有考虑高斯的新位置(称为 center
的参数,传递给 gaussian()
- 我记得 this code)。
你看,当我对你的原始数据进行拟合时会发生以下情况:
T = T0-bg # background subtraction?
fitparams_me, fitparams_you = [], []
for colind in xrange(16,19):
column = T[:,colind]
guess = column.max(), column.argmax(), 3, 0 # Good guess for a SINGLE gaussian
popt, pcov = optimize.curve_fit(one_gaussian, datax, column, p0=guess)
fitparams_me.append(popt)
print(fitparams_me)
显示:
[array([ 365.40098996, 91.24095009, 1.11390434, -0.99632476]),
array([ 348.4327168 , 92.0262556 , 1.26650618, -1.08018819]),
array([ 413.21526868, 90.8569241 , 1.0445618 , -1.0565371 ])]
这些导致非常适合。
现在这就是您正在做的事情:您首先将矩阵上下颠倒,但您一直假设峰值位于第一行。然而,情况已不再如此,这段代码强调了这一点:
T = np.flipud(T)
for colind in xrange(16,19):
column = T[:,colind]
guess = column.max(), column.argmax(), 3, 0 # Good guess for a SINGLE gaussian
your_guess = [0.5*Mmax, N/10., 10., 0.]
print guess[1], your_guess[1]
popt, pcov = optimize.curve_fit(one_gaussian, datax, column, p0=your_guess)
fitparams_you.append(popt)
# printed results:
932 102.4
931 102.4
932 102.4
因此,每次我仍然正确猜测最大值出现的位置,但您假设它始终在数据的第 102 行附近(形状为 1024, 1024
)。
你的曲线拟合结果与我的大不相同也就不足为奇了:
>>> print(fitparams_you)
[array([ -1.640e-07, 1.024e+02, 1.000e+01, 2.046e-10]),
array([ -1.640e-07, 1.024e+02, 1.000e+01, 2.046e-10]),
array([ -1.640e-07, 1.024e+02, 1.000e+01, 2.046e-10])]
只需翻转您的列即可轻松解决:
popt, pcov = optimize.curve_fit(one_gaussian, datax, column[::-1], p0=your_guess)
或者您可以尝试使用 argmax
等技巧使您的算法更健壮。
关于python - 高斯拟合无法使用 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28394406/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!