线性拟合是数据处理中一种比较常用的方式。但是拟合的方法也又好几种。
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()