python 实现最小二乘法拟合直线

pandas 处理数据

import pandas as pd
import matplotlib.pyplot as plt

# jupyter 关于绘图的参数配置

plt.style.use('ggplot')
%config InlineBackend.figure_format = 'retina'
%matplotlib inline

获取数据

clipboard.png

数据不是很完美,接下来利用 pandas处理下

df = df.rename(columns={'Unnamed: 0':'0'})
df = df.set_index(keys=['0'])

clipboard.png

为了分析长度和宽度之间的线性关系,所以我们先取数据

xcord = df.loc['长度']
ycord = df.loc['宽度']

plt.scatter(xcord,ycord,s=30,c='red',marker='s')

clipboard.png

从宽度和长度的数据分布,可以看出具有一定的线性关系,接下来我们用最小二乘法来拟合这条直线

最小二乘法

原理和计算方法推荐这个博客,最小二乘法

  1. 假设 y = mx + c

通过公式计算 m、c

## xy 的均值
(xcord*ycord).mean()

## x 的均值乘以 y 的均值
xcord.mean()* ycord.mean()

## x 的平方均值
pow(xcord,2).mean()

## x 的均值的平方
pow(xcord.mean(),2)

# m 分子是 xy 的均值减去 x 的均值乘以 y 的均值;
# m 分母是 x 平方的均值 减去 x 的均值的平方

m = ((xcord*ycord).mean() - xcord.mean()* ycord.mean())/(pow(xcord,2).mean()-pow(xcord.mean(),2))

# c 等于 y 的均值 - m 乘以 x 的均值
c = ycord.mean() - m*xcord.mean()

# 绘图
plt.scatter(xcord,ycord,s=30,c='red',marker='s')
x=np.arange(90.0,250.0,0.1)
y=m*x+c    
plt.plot(x,y)
plt.show()

clipboard.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章