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

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