轉載自:線性回歸與非線性回歸:1.0一元線性回歸與代價函數(損失函數)
- 回歸分析:用來建立方程模擬兩個或者多個變量之間如何關聯
- 因變量:被預測的變量(結果/標簽),輸出
- 自變量:被用來進行預測的變量(特征),輸入
- 一元線性回歸:包含一個自變量與一個因變量,並且變量的關系用一條直線來模擬
一元線性回歸
公式:\(h_\theta = \theta_0+\theta_1x\)
方程對應的圖像是一條直線,稱作回歸線。其中\(\theta_1\)為回歸線的斜率,\(\theta_0\)為回歸的截距。
相關性:$$ \begin{cases} 正相關:\theta_1>0 \ 不相關:\theta_1 = 0 \ 負相關:\theta_1<0 \end{cases}$$
代價函數
一般使用最小二乘法,真實值\(y\),預測值\(h_\theta(x)\),則誤差平方為\((y-h_\theta(x))^2\),找到合適的參數,使得誤差平方平方和最小$$J(\theta_0 , \theta_1) = \frac{1}{2m}\sum_{i=1}^m(y-h_\theta(x))^2$$
其中共有m個樣本點,乘以1/2是為了方便計算,如求導。
相關系數
定義:相關關系是一種非確定性的關系,相關系數是研究變量之間線性相關程度的量。
線性相關:在向量空間V的一組向量:\(A:\alpha_1,\alpha_2,\ldots\alpha_m\),如果存在不全為零的數\(k_1,k_2,\ldots k_m\),使$$k_1\alpha_1+k_2\alpha_2+\cdots k_m\alpha_m = O$$則稱向量組A是線性相關的,否則\(k_1,k_2,\ldots k_m\)全為0,稱其為線性無關的。
公式:$$r_{xy} = \frac{\sum (x_i - \overline x)(y_i - \overline y)}{\sqrt{\sum (x_i - \overline x)^2\sum(y_i - \overline y)^2}} = \frac{cov(x,y)}{\sqrt{var[x]var[y]}}$$
決定系數
定義:相關系數\(R^2\)是用來描述兩個變量之間的線性關系的,但決定系數的適用范圍更廣,可以用於描述非線性或者有兩個及兩個以上自變量的相關關系。它可以用來評估模型的效果。
總平方和(SST):\(\sum_{i=1}^{n}(y_i - \overline y)^2\)
回歸平方和(SSR):\(\sum_{i=1}^{n}(\hat y-\overline y)^2\)
殘差平方和(SSE):\(\sum_{i=1}^{n}(y_i-\hat y)^2\)
\(y_i\)是真實值,\(\overline y\)是真實值的平均值,\(\hat y\)是預測值。
它們三者的關系是:\(SST=SSR+SSE\)
決定系數:\(R^2 = \frac{SSR}{SST} = 1-\frac{SSE}{SST}\)
用梯度下降法求解線性回歸
一元線性回歸方程:\(h_\theta = \theta_0+\theta_1x\)
參數:\(\theta_0\),\(\theta_1\)
代價函數:\(J(\theta_0 , \theta_1) = \frac{1}{2m}\sum_{i=1}^m(y-h_\theta(x))^2\)
目標:\(min J(\theta_0 , \theta_1)\)
梯度下降法:不斷改變\(\theta_0\),\(\theta_1\),直到\(J(\theta_0 , \theta_1)\)達到一個全局最小或者局部最小。$$repeat \ until \ convergence{ \ \theta_j:=\theta_j - \alpha\frac{\partial}{\partial \theta_j}J(\theta_0,\theta_1) \ } \ (for \ j=0 \ and \ j=1)$$ \(\alpha\)為學習率,當學習率過大會造成不收斂也就是找不到一個全局最小值或者局部最小值,學習率過小會浪費大量的時間進行計算。
正確的做法:同步更新$$tempt0:=\theta_0 - \alpha\frac{\partial}{\partial \theta_0}J(\theta_0,\theta_1)$$$$tempt1:=\theta_1 - \alpha\frac{\partial}{\partial \theta_1}J(\theta_0,\theta_1)$$$$\theta_0:=tempt0$$$$\theta_1:=tempt1$$
使用梯度下降:$$repeat \ until \ convergence{ \theta_0:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i) \ \theta_1:=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)*x_i\ }$$
實戰
import numpy as np
import matplotlib.pyplot as plt
#載入數據
data = np.genfromtxt("data.csv",delimiter=",")#加載文件,分隔符為逗號
x_data = data[:,0]#存儲第0列的所有數據
y_data = data[:,1]#存儲第1列的所有數據
#學習率
lr = 0.0001
#截距
b = 0.0
#斜率
k = 0.0
#最大迭代次數
epochs = 50
#最小二乘法
def compute_error(b, k, x_data, y_data):
totalError = 0
for i in range(0,len(x_data)):
totalError += (y_data[i] - (k * x_data[i] + b)) ** 2
return totalError / float(len(x_data)) / 2.0
#梯度下降法求最小值
def gradient_descent_runner(x_data, y_data, b, k, lr, epochs):
#計算總數據量
m = len(x_data)
#循環epochs次
for i in range(epochs):
b_grade = 0
k_grade = 0
#計算梯度總和在求平均
for j in range(0, len(x_data)):
b_grade += -(1/m) * (y_data[j] - (k * x_data[j] + b))
k_grade += -(1/m) * (y_data[j] - (k * x_data[j] + b)) * x_data[j]
#更新學習率
b = b - (lr * b_grade)
k = k - (lr * k_grade)
return b,k
print("Starting b = {0}, k = {1}, error = {2}".format(b, k, compute_error(b, k, x_data, y_data)))
print("Running...")
b,k = gradient_descent_runner(x_data, y_data, b, k, lr, epochs)
print("After {0} iterations b = {1}, k = {2}, error = {3}".format(epochs, b, k, compute_error(b, k, x_data, y_data)))
#畫圖
plt.plot(x_data, y_data, 'b.')
plt.plot(x_data, k*x_data+b, 'r')
plt.show()