• 拟合未知数量的参数在本例中，我们尝试重现一些测量数据measData。在本例中，measData由函数measuredData(x, a=.2, b=-2, c=-.8, d=.1)生成。我练习，我们可能以某种方式测量了measData，所以我们不知道数学上是如何...
拟合未知数量的参数在本例中，我们尝试重现一些测量数据measData。在本例中，measData由函数measuredData(x, a=.2, b=-2, c=-.8, d=.1)生成。我练习，我们可能以某种方式测量了measData，所以我们不知道数学上是如何描述的。因此适合。我们用多项式拟合，多项式由函数polynomFit(inp, *args)描述。由于我们要尝试不同阶的多项式，所以在输入参数的数量上要灵活是很重要的。自变量(在您的例子中是x和y)被编码在inp的“列/第二维度”。import numpy as npimport matplotlibimport matplotlib.pyplot as pltfrom scipy.optimize import curve_fitdef measuredData(inp, a=.2, b=-2, c=-.8, d=.1):x=inp[:,0]y=inp[:,1]return a+b*x+c*x**2+d*x**3 +ydef polynomFit(inp, *args):x=inp[:,0]y=inp[:,1]res=0for order in range(len(args)):print(14,order,args[order],x)res+=args[order] * x**orderreturn res +yinpData=np.linspace(0,10,20).reshape(-1,2)inpDataStr=['({:.1f},{:.1f})'.format(a,b) for a,b in inpData]measData=measuredData(inpData)fig, ax = plt.subplots()ax.plot(np.arange(inpData.shape[0]), measData, label='measuered', marker='o', linestyle='none' )for order in range(5):print(27,inpData)print(28,measData)popt, pcov = curve_fit(polynomFit, xdata=inpData, ydata=measData, p0=[0]*(order+1) )fitData=polynomFit(inpData,*popt)ax.plot(np.arange(inpData.shape[0]), fitData, label='polyn. fit, order '+str(order), linestyle='--' )ax.legend( loc='upper left', bbox_to_anchor=(1.05, 1))print(order, popt)ax.set_xticklabels(inpDataStr, rotation=90)结果：
展开全文
• It works fine with the test code I created but when I try to implement this on my actual data I keep getting the following error TypeError: only arrays length -1 can be converted to python scalars ...
I have been trying to use scipy.optimize curve_fit using multiple variables. It works fine with the test code I created but when I try to implement this on my actual data I keep getting the following errorTypeError:  only arrays length -1 can be converted to python scalarsThe shape of the arrays and the data types of their elements in my test code and actual code are exactly the same so I am confused as to why I get this error.Test code:import numpy as npimport scipyfrom scipy.optimize import curve_fitdef func(x,a,b,c):return a+b*x[0]**2+c*x[1]x_0=np.array([1,2,3,4])x_1=np.array([5,6,7,8])X=scipy.array([x_0,x_1])Y=func(X,3.1,2.2,2.1)popt, pcov=curve_fit(func,X,Y)Actual code:f=open("Exp_Fresnal.csv", 'rb')reader=csv.reader(f)for row in reader:Qz.append(row[0])Ref.append(row[1])Ref_F.append(row[2])Qz_arr,Ref_Farr=scipy.array((Qz)),scipy.array((Ref_F))x=scipy.array([Qz_arr,Ref_Farr]def func(x,d,sig_int,sig_cp):return x[1]*(x[0]*d*(math.exp((-sig_int**2)*(x[0]**2)/2)/(1-cmath.exp(complex(0,1)*x[0]*d)*math.exp((-sig_cp**2)*(x[0]**2)/2))))**2Y=scipy.array((Ref))popt, pcov=curve_fit(func,x,Y)EDITHere is the full error messageTraceback (most recent call last):File "DCM_03.py", line 46, in popt, pcov=curve_fit(func,x,Y)File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 651, in curve_fitres = leastsq(func, p0, args=args, full_output=1, **kwargs)File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 377, in leastsqshape, dtype = _check_func('leastsq', 'func', func, x0, args, n)File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_funcres = atleast_1d(thefunc(*((x0[:numinputs],) + args)))File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 453, in _general_functionreturn function(xdata, *params) - ydataFile "DCM_03.py", line 40, in funcreturn (0.062/(2*x))**4*(x*d*(math.exp((-sig_int**2)*(x**2)/2)/(1-cmath.exp(complex(0,1)*x*d)*math.exp((-sig_cp**2)*(x**2)/2))))**2TypeError: only length-1 arrays can be converted to Python scalars解决方案I figured out the issue. The problem for some reason was the use of math.exp and cmath.exp in the fitting function func. In place of these functions I used np.exp(). I am not completely sure the reason why though.
展开全文
• 本文介绍如何使用python实现多变量线性回归，文章参考NG的视频和黄海广博士的笔记现在对房价模型增加更多的特征，例如房间数楼层等，构成一个含有多个变量的模型，模型中的特征为(x1,x2,...,xn)表示为：引入x0=1，则...
本文介绍如何使用python实现多变量线性回归，文章参考NG的视频和黄海广博士的笔记现在对房价模型增加更多的特征，例如房间数楼层等，构成一个含有多个变量的模型，模型中的特征为(x1,x2,...,xn)表示为：引入x0=1，则公式转化为：1、加载训练数据数据格式为：X1,X2,Y2104,3,3999001600,3,3299002400,3,3690001416,2,232000将数据逐行读取，用逗号切分，并放入np.array#加载数据#加载数据def load_exdata(filename):data = []with open(filename, 'r') as f:for line in f.readlines():line = line.split(',')current = [int(item) for item in line]#5.5277,9.1302data.append(current)return datadata = load_exdata('ex1data2.txt');data = np.array(data,np.int64)x = data[:,(0,1)].reshape((-1,2))y = data[:,2].reshape((-1,1))m = y.shape[0]# Print out some data pointsprint('First 10 examples from the dataset: \n')print(' x = ',x[range(10),:],'\ny=',y[range(10),:])First 10 examples from the dataset:x = [[2104 3][1600 3][2400 3][1416 2][3000 4][1985 4][1534 3][1427 3][1380 3][1494 3]]y= [[399900][329900][369000][232000][539900][299900][314900][198999][212000][242500]]2、通过梯度下降求解theta(1)在多维特征问题的时候，要保证特征具有相近的尺度，这将帮助梯度下降算法更快地收敛。解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间，最简单的方法就是(X - mu) / sigma，其中mu是平均值，sigma是标准差。(2)损失函数和单变量一样，依然计算损失平方和均值我们的目标和单变量线性回归问题中一样，是要找出使得代价函数最小的一系列参数。多变量线性回归的批量梯度下降算法为：求导数后得到：(3)向量化计算向量化计算可以加快计算速度，怎么转化为向量化计算呢？在多变量情况下，损失函数可以写为：对theta求导后得到：(1/2*m) *(X.T.dot(X.dot(theta) -y))因此，theta迭代公式为：theta = theta -(alpha/m) *(X.T.dot(X.dot(theta) -y))(4)完整代码如下：#特征缩放def featureNormalize(X):X_norm = X;mu = np.zeros((1,X.shape[1]))sigma = np.zeros((1,X.shape[1]))for i in range(X.shape[1]):mu[0,i] = np.mean(X[:,i]) # 均值sigma[0,i] = np.std(X[:,i])     # 标准差#     print(mu)#     print(sigma)X_norm  = (X - mu) / sigmareturn X_norm,mu,sigma#计算损失def computeCost(X, y, theta):m = y.shape[0]#     J = (np.sum((X.dot(theta) - y)**2)) / (2*m)C = X.dot(theta) - yJ2 = (C.T.dot(C))/ (2*m)return J2#梯度下降def gradientDescent(X, y, theta, alpha, num_iters):m = y.shape[0]#print(m)# 存储历史误差J_history = np.zeros((num_iters, 1))for iter in range(num_iters):# 对J求导，得到 alpha/m * (WX - Y)*x(i)， (3,m)*(m,1)  X (m,3)*(3,1) = (m,1)theta = theta - (alpha/m) * (X.T.dot(X.dot(theta) - y))J_history[iter] = computeCost(X, y, theta)return J_history,thetaiterations = 10000  #迭代次数alpha = 0.01    #学习率x = data[:,(0,1)].reshape((-1,2))y = data[:,2].reshape((-1,1))m = y.shape[0]x,mu,sigma = featureNormalize(x)X = np.hstack([x,np.ones((x.shape[0], 1))])# X = X[range(2),:]# y = y[range(2),:]theta = np.zeros((3, 1))j = computeCost(X,y,theta)J_history,theta = gradientDescent(X, y, theta, alpha, iterations)print('Theta found by gradient descent',theta)Theta found by gradient descent [[ 109447.79646964][ -6578.35485416][ 340412.65957447]]绘制迭代收敛图plt.plot(J_history)plt.ylabel('lost');plt.xlabel('iter count')plt.title('convergence graph')使用模型预测结果def predict(data):testx = np.array(data)testx = ((testx - mu) / sigma)testx = np.hstack([testx,np.ones((testx.shape[0], 1))])price = testx.dot(theta)print('price is %d ' % (price))predict([1650,3])price is 293081
展开全文
• John Lyon..26这个问题的公认答案提供您只需传入x和y点...注意:下面的代码已经过修改,可以进行多变量拟合,但是情节图像是早期非多变量答案的一部分.import numpyimport matplotlib.pyplot as pltimport multipolyfi...
John Lyon..26这个问题的公认答案提供您只需传入x和y点的数组以及所需的拟合度(顺序)即可multipolyfit.这将返回系数,然后您可以使用numpy的polyval进行绘图.注意:下面的代码已经过修改,可以进行多变量拟合,但是情节图像是早期非多变量答案的一部分.import numpyimport matplotlib.pyplot as pltimport multipolyfit as mpfdata = [[1,1],[4,3],[8,3],[11,4],[10,7],[15,11],[16,12]]x, y = zip(*data)plt.plot(x, y, 'kx')stacked_x = numpy.array([x,x+1,x-1])coeffs = mpf(stacked_x, y, deg)x2 = numpy.arange(min(x)-1, max(x)+1, .01) #use more points for a smoother ploty2 = numpy.polyval(coeffs, x2) #Evaluates the polynomial for each x2 valueplt.plot(x2, y2, label="deg=3")注意:这是早期答案的一部分,如果您没有多变量数据,它仍然是相关的.而不是coeffs = mpf(...,使用coeffs = numpy.polyfit(x,y,3)对于非多变量数据集,最简单的方法是使用numpy polyfit:numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)最小二乘多项式拟合.拟合p(x) = p[0] * x**deg + ... + p[deg]度deg为项的多项式(x, y).返回最小化平方误差的系数p的向量.@jozzas模块multipolyfit来自哪里？尝试导入它会导致导入错误:ImportError:没有名为multipolyfit.multipolyfit的模块... (5认同)我刚刚注意到这个问题.我更新了repo的组织,添加了许可的开源许可证,并在PyPi上发布.你应该能够easy_install multipolyfit. (3认同)
展开全文
• 但是更的数据之间具有非线性关系。因此对线性回归法进行改进，使用多项式回归法，可以对非线性数据进行处理。1 什么是多项式回归 研究一个因变量与一个或个自变量间多项式的回归分析方法，称为多项式回归...
• 曲线拟合转化为线性拟合     非线性回归的情况太过复杂，在...    一元非线性回归是指两个变量-----一个自变量，一个因变量之间呈现非线性关系，如双曲线、二次曲线、三()次曲线、幂曲线、指数曲线、对数...
• 但是更的数据之间具有非线性关系。因此对线性回归法进行改进，使用多项式回归法，可以对非线性数据进行处理。0x01 什么是多项式回归 研究一个因变量与一个或个自变量间多项式的回归分析方法，称为多项式回归...
• 缺点：对非线性的数据拟合不好。适用数据类型：数值型和标称型。1.2、分类一元线性回归：涉及到的变量只有一个。多元线性回归：涉及到的变量两个或两个以上。1.3、公式image.png其中????,????为矩阵：????,????为...
• 多项式回归理论上可以以上的方法拟合任何曲线，但前提条件是要事先对模型的形式进行判断，即知道非线性模型的参数设置。在一般情况下， 通过绘制散点图的形式可以做到这一点。但是在更一般的情况下，如有个自变量...
• 在数据科学和分析领域中，对非线性数据进行建模是一项常规任务。但找到一个结果随自变量线性变化的自然过程很不容易。因此，需要有一种简便并且稳健的...是否需要为多变量回归加上交叉耦合项？有没有简单的方法将这...
• # 线性模型拟合 model = linear_model.LinearRegression() model.fit(x_train, y) 预测 #预测结果 result = model.predict(x_test) 二、逻辑回归 全部代码 1、代价函数 可以综合起来为： 其中： ...
• 在一元回归分析中，如果依变量y与自变量x的关系为非线性的，但是又找不到适当的函数曲线来拟合，则可以采用一元多项式回归。 多项式回归的最大优点就是可以通过增加x的高次项对实测点进行逼近，直
• 多项式回归：处理的是一些非线性问题，像一些无法用直线拟合的离散点，比方说随着工龄的增长和职位的升高而 增加的薪酬。这样的问题，往往只有一个自变量。多项式回归还是比较简单的///举一个栗子///一家企业：十个...

python 订阅