import numpy as npimport matplotlib.pyplot as pltfrom scipy import optimizedata=np.array([[176,169],[171,162],[165,164],[178,170],[169,172],[172,170],[176,181],[168,161],[173,174],[171,164],[180,182],[191,188],[179,182],[162,153], [164,160],[180,168],[170,180],[172,170],[172,170],[174,177],[187,175],[178,173],[181,183],[180,178],[182,180],[173,176],[173,175] ])def f_1(x, A, B): return A*x + B#scipy算法包封装的曲线拟合函数def test3(): X = np.array(data[:, 0]) Y = np.array(data[:, 1]) A1, B1 = optimize.curve_fit(f_1, X, Y)[0] x1 = np.arange(160, 190, 0.01) y1 = A1 * x1 + B1 plt.plot(X, Y, 'ro', x1, y1, "blue") # 将拟合曲线和散点绘制在一起 plt.show()#使用多远线性回归的推导模型来计算,看成矩阵来计算def test2(): N=data.shape[0] Y_T=np.matrix(data[:,1]).T#变成列矩阵 X_T=np.matrix([np.ones(N),data[:,0]]).T#变成列矩阵 b=np.linalg.inv(X_T.T.dot(X_T)).dot(X_T.T).dot(Y_T) #计算出来后,第一个为常数,横街点,第二个为斜率 print("")#使用二元推导模型计算def test1(): #求Xi*Yi N=data.shape[0] X=np.array(data[:,0]) Y=np.array(data[:,1]) sumXi_Yi=np.dot(X,Y) avg_X=np.sum(X,axis=0)/N#X的平均值 avg_Y=np.sum(Y,axis=0)/N#Y的均值 sum_X2=np.sum(X*X,axis=0) #根据公式计算b值 b= (sumXi_Yi-N*avg_X*avg_Y)/(sum_X2-N*avg_X**2) a=avg_Y-b*avg_X # plt.plot(X, Y, 'ro') # plt.show() x1 = np.arange(160, 190, 0.01) y1 = b * x1 + a plt.plot(X, Y, 'ro',x1, y1, "blue")#将拟合曲线和散点绘制在一起 plt.show()
备注:
方法一的推导公式:
方法二的推导模型公式:
方法三:直接使用scipy的线性拟合函数。