python数据线性拟合(I)
线性拟合是数据处理中一种比较常用的方式。但是拟合的方法也又好几种。 1、第一版代码(网上学习别人的,感觉用的是平均数方法,最小二乘法自己处理的感觉) #! /usr/bin/env python # -*- coding: utf-8 -*- import numpy as np ###使用的数学模块 from matplotlib import pylab as pl # 定义要分析的数据,自己处理时候,可以开放接口去读取相应文件中的内容 x = np.array([6,7.8,3.7,4.8,3.5]) y = np.array([14.2,24.3,18.6,17.8,27.9]) # 回归方程求取函数 def fit(x,y): if len(x) != len(y): return ###先判断一下这个数据逆否可以拟合,主要是读取其他文件数据的时候可能出错 numerator = 0.0 denominator = 0.0 x_mean = np.mean(x) y_mean = np.mean(y) for i in range(len(x)): numerator += (x[i]-x_mean)*(y[i]-y_mean) denominator += np.square((x[i]-x_mean)) print('numerator:',numerator,'denominator:',denominator) b0 = numerator/denominator b1 = y_mean - b0*x_mean return b0,b1 # 定义预测函数 def predit(x,b0,b1): return b0*x + b1 # 求取回归方程 b0,b1 = fit(x,y) print('Line is:y = %2.0fx + %2.0f'%(b0,b1)) # 预测 x_test = np.array([0.5,1.5,2.5,3,4]) y_test = np.zeros((1,len(x_test))) for i in range(len(x_test)): y_test[0][i] = predit(x_test[i],b0,b1) # 绘制图像 xx = np.linspace(0, 5) yy = b0*xx + b1 pl.plot(xx,yy,'k-') pl.scatter(x,y,cmap=pl.cm.Paired) pl.scatter(x_test,y_test[0],cmap=pl.cm.Paired) pl.show() 2、感觉使用了最下二乘法但是代码不太看得懂 #! /usr/bin/env python # -*- coding: utf-8 -*- ###最小二乘法试验### import numpy as np from scipy.optimize import leastsq from matplotlib import pylab as pl import matplotlib.pyplot as plt # 定义训练数据 x = np.array([6,7.8,3.7,4.8,3.5]) y = np.array([14.2,24.3,18.6,17.8,27.9]) ###需要拟合的函数func及误差error### def func(p,x): k,b=p return k*x+b def error(p,x,y,s): print s return func(p,x)-y #x、y都是列表,故返回值也是个列表 #TEST p0=[100,2] ###主函数从此开始### s="Test the number of iteration" #试验最小二乘法函数leastsq得调用几次error函数才能找到使得均方误差之和最小的k、b Para=leastsq(error,p0,args=(x,y,s)) #把error函数中除了p以外的参数打包到args中 k,b=Para[0] print"k=",k,'\n',"b=",b plt.figure(figsize=(8,6)) plt.scatter(x,y,color="red",label="Sample Point",linewidth=3) #画样本点 x=np.linspace(0,10,1000) y=k*x+b plt.plot(x,y,color="orange",label="Fitting Line",linewidth=2) #画拟合直线 plt.legend() plt.show() https://www.bilibili.com/read/cv4971766/