3.1 使用正規方程進行求解
3.1.1 簡單線性回歸
公式 :
y = w x + b y = wx + b y=wx+b
一元一次方程,在機器學習中一元表示一個特征,b表示截距,y表示目標值。
使用代碼進行實現:
導入包
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(0, 10, num=30).reshape(-1, 1)
# 斜率和截距,隨機生成
w = np.random.randint(1, 5, size=1)
b = np.random.randint(1, 10, size=1)
# 根據一元一次方程計算目標值y并加上‘噪聲’,數據有上下波動
y = X * w + b +np.random.rand(30,1)
plt.scatter(X,y)
# 計算斜率+截距
#系數
X = np.concatenate([X,np.full(shape=[30,1],fill_value=1)],axis=1)
X
獲取系數
coef_ = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
w_ = coef_[0,0]
b_ = coef_[1,0]
print('正規方程算法計算,系數',w_,b_)
真實的系數
print('原始的數據斜率、截距',w,b)
繪制圖形
plt.scatter(X[:,0],y,color='red')
plt.plot(X[:,0],X[:,0] * w_ + b_,color='green')
3.1.2 多元的線性回歸
公式:
y = w 1 x 1 + w 2 x 2 + b y = w_1x_1 + w_2x_2 + b y=w1?x1?+w2?x2?+b
導入包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D # 繪制三維圖像·
# 轉化為矩陣
x1 = np.random.randint(-150, 150, size=(300, 1))
x2 = np.random.randint(0, 300, size=(300, 1))
# 斜率和截距,都是隨機生成的
w = np.random.randint(1, 5, size=2)
b = np.random.randint(1, 10, size=1)
# 根據二元一次方程計算目標值y 并且加上“噪聲”,讓數據上下波動
y = x1 * w[0] + x2 * w[1] + b + np.random.randn(300, 1)
fig = plt.figure(figsize=(9,6))
ax = Axes3D(fig)
ax.scatter(x1,x2,y) #三維散點圖
ax.view_init(elev=10,azim=-20) # 調整視角
X = np.concatenate([x1,x2,np.full(shape=(300,1),fill_value=1)],axis = 1)
X
# 方程的系數
coef_ = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
w1 = coef_[0][0]
w2 = coef_[1][0]
b_ = coef_[2][0]
print('正規方程求解的方程系數:',w1,w2,b_)
print('真實方程系數',w,b)
繪制擬合線段
fig = plt.figure(figsize=(9,6))
ax = Axes3D(fig)
ax.scatter(x1,x2,y,color='red') #三維散點圖
ax.view_init(elev=10,azim=-20) # 調整視角
# 特征1:x1
x = np.linspace(-150,150,num=500)
y = np.linspace(0,300,num = 500)
z = x *w1_+ y*w2_ +b
ax.plot(x,y,z,color='green')