1. 程式人生 > 其它 >python--一元線性迴歸模型

python--一元線性迴歸模型

技術標籤:pythonpython機器學習

模型中只有一個自變數和因變數可表示成\left \{ (x_{1} ,y_{1}),(x_{2},y_{2}),...,(x_{n},y_{n}) \right \}

數學公式可表示成:y=a+bx+\xi

其中a為模型的截距項,b為模型的斜率項,\xi為模型的誤差項。模型中的a和b統稱為迴歸係數,誤差項\xi的存在主要是為了平衡等號兩邊的值,通常被稱為模型無法解釋的部分。

擬合線的求解

就是如何根據自變數x和因變數y求解迴歸係數a和b。

如果擬合線能夠精確地捕捉到每一個點(所有的散點全部落在擬合線上),那麼對應的誤差項\xi應該為0。按照這個思路,想要得到理想的擬合線,就必須使誤差項達到最小。誤差項最小問題需轉換為誤差平方和的最小的問題(最小二乘法的思路)

誤差平方和的公式可以表示為:

J(a,b) = \sum \varepsilon ^{2} = \sum_{i=1}^{n}(y_{i}-[a+bx_{i}])^{2}

公式轉換

\frac{\varphi J}{\varphi a}=2na+2b\sum_{i=1}^{n}x_{i}-2\sum_{i=1}^{n}y_{i}=0

\frac{\varphi J}{\varphi b}=2b\sum_{i=1}^{n}x_{i}^2+2a\sum_{i=1}^{n}x_{i}-2\sum_{i=1}^{n}x_{i}y_{i}=0

求解a和b

import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
import numpy as np
import seaborn as sns
import statsmodels.api as sm
font = {
    'family': 'FangSong',
    'weight': 'bold',
    'size': 12
}
matplotlib.rc("font", **font)

income = pd.read_csv('../data/Salary_Data.csv', delimiter=',')
'''
 0   YearsExperience  30 non-null     float64
 1   Salary           30 non-null     float64
'''

# 樣本量
n = income.shape[0]
# 計算自變數、因變數、自變數平方、自變數與因變數乘積的和
sum_x = income.YearsExperience.sum()
sum_y = income.Salary.sum()
sum_x2 = income.YearsExperience.pow(2).sum()
xy = income.YearsExperience * income.Salary
sum_xy = xy.sum()
# 根據公式計算迴歸模型的引數
b = (sum_xy - sum_x * sum_y/n)/(sum_x2 - sum_x**2/n)
a = income.Salary.mean() - b * income.YearsExperience.mean()
print(a)
print(b)

# 利用收入資料集,構建迴歸模型
fit = sm.formula.ols('Salary ~ YearsExperience', data=income).fit()
print(fit.params)