python数据拟合方法_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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值