1. 程式人生 > >《機器學習》 一,線性迴歸

《機器學習》 一,線性迴歸

機器學習思維導圖

在這裡插入圖片描述

一,什麼是線性迴歸

線性:y=a*x 一次方的變化
迴歸:迴歸到平均值

簡單線性迴歸
演算法==公式
一元一次方程組

一元指的一個X:影響Y的因素,維度
一次指的X的變化:沒有非線性的變化

y = a*x + b
x1,y1 x2,y2 x3,y3 x4,y4 …

做機器學習,沒有完美解
只有最優解~
做機器學習就是要以最快的速度,找到誤差最小的最優解!

一個樣本的誤差:
yi^ - yi
找到誤差最小的時刻,為了去找到誤差最小的時刻,需要反覆嘗試,a,b
根據最小二乘法去求得誤差
反過來誤差最小時刻的a,b就是最終最優解模型!!!

多元線性迴歸
本質上就是演算法(公式)變換為了多元一次方程組
y = w1x1 + w2x2 + w3x3 + … + wnxn + w0*x0

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

程式碼展示:線性迴歸

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 檔名: linear_regression_0.py

import numpy as np
import matplotlib.pyplot as plt

# 這裡相當於是隨機X維度X1,rand是隨機均勻分佈
X = 2 * np.random.rand(100, 1)
# 人為的設定真實的Y一列,np.random.randn(100, 1)是設定error,randn是標準正太分佈
y = 4 + 3 * X + np.random.randn(100, 1)
# 整合X0和X1
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)

# 常規等式求解theta
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)

# 建立測試集裡面的X1
X_new = np.array([[0], [2]]) 
X_new_b = np.c_[(np.ones((2, 1))), X_new]
print(X_new_b)
y_predict = X_new_b.dot(theta_best)
print(y_predict)

plt.plot(X_new, y_predict, 'r-')
plt.plot(X, y, 'b.')
plt.axis([0, 2, 0, 15])
plt.show()

執行結果
在這裡插入圖片描述

疑問點

Q:為什麼求總似然的時候,要用正太分佈的概率密度函式?
A:中心極限定理,如果假設樣本之間是獨立事件,誤差變數隨機產生,那麼就服從正太分佈!

Q:總似然不是概率相乘嗎?為什麼用了概率密度函式的f(xi)進行了相乘?
A:因為概率不好求,所以當我們可以找到概率密度相乘最大的時候,就相當於找到了概率相乘最大的時候!

Q:概率為什麼不好求?
A:因為求得是面積,需要積分,麻煩,大家不用去管數學上如何根據概率密度函式去求概率!

Q:那總似然最大和最有解得關係?
A:當我們找到可以使得總似然最大的條件,也就是可以找到我們的DataSet資料集最吻合某個正太分佈!
即找到了最優解!

通過最大似然估計得思想,利用了正太分佈的概率密度函式,推匯出來了損失函式

Q:何為損失函式?
A:一個函式最小,就對應了模型是最優解!預測歷史資料可以最準!

Q:線性迴歸的損失函式是什麼?
A:最小二乘法,MSE,mean squared error,平方均值損失函式,均方誤差

Q:線性迴歸的損失函式有哪些假設?
A:樣本獨立,隨機變數,正太分佈

通過對損失函式求導,來找到最小值,求出theta的最優解!

通過Python呼叫numpy來應用解析解公式之間計算最優解

梯度下降法(重點內容)
1,初始化theta
2,求梯度gradients
3,調整theta
theta_t+1 = theta_t - grad*(learning_rate)
4,回到2迴圈往復第2步和第3步,直到迭代收斂,g約等於0

通過sklearn模組使用LinearRegression
from sklearn.linear_model import LinearRegression
檔名: linear_regression_1.py

程式碼展示:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 檔名: linear_regression_1.py

import numpy as np
from sklearn.linear_model import LinearRegression

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

lin_reg = LinearRegression()
lin_reg.fit(X, y)
print(lin_reg.intercept_, lin_reg.coef_)

X_new = np.array([[0], [2]])
print(lin_reg.predict(X_new))

執行結果:
在這裡插入圖片描述