【机器学习】P3 多重线性回归

时间:2022-05-22 01:16:06

多重线性回归内容与代码实现

回归函数

多重线性回归函数: 建立多个自变量与一个因变量之间的线性关系。在多重线性回归中,我们假设因变量与多个自变量之间存在线性关系,并利用给定的样本数据来确定线性关系的系数,目标是找到一组最优的系数,使得预测值与真实值之间的误差最小化。

展开式为:
f w ⃗ , b = w 1 x 1 + w 2 x 2 + . . . + w n x n + b f_{\vec{w},b} = w_1x_1+w_2x_2+...+w_nx_n+b fw ,b=w1x1+w2x2+...+wnxn+b
简化为: f w ⃗ , b = w ⃗ ⋅ x ⃗ + b f_{\vec{w},b}=\vec{w}·\vec{x}+b fw ,b=w x +b
代码实现:

def predict(x, w, b): 

    p = np.dot(x, w) + b     
    return p  

损失函数

多重线性回归损失函数: 多重线性回归的损失函数通常使用均方误差。在多重线性回归中,我们的目标是找到一组最优的系数,使得预测值与真实值之间的误差最小化。因此,我们可以使用梯度下降法或其他优化算法来最小化损失函数,从而得到最优的系数。

公式为:
J ( w ⃗ , b ) = 1 2 m ∑ i = 0 m − 1 ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) 2 J(\vec{w},b)=\frac 1 {2m} \sum _{i=0} ^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2 J(w ,b)=2m1i=0m1(fw ,b(x (i))y(i))2
代码实现:

def compute_cost(X, y, w, b): 

    m = X.shape[0]
    cost = 0.0
    for i in range(m):                                
        f_wb_i = np.dot(X[i], w) + b
        cost = cost + (f_wb_i - y[i])**2
    cost = cost / (2 * m)    
    return cost

梯度下降

梯度下降函数: 多重线性回归函数的梯度下降算法用于求解最小化损失函数的系数,从而建立线性回归模型。

gradient descent 整体公式为:
w j = w j − α ∂ J ( w ⃗ , b ) ∂ w j b j = b j − α ∂ J ( w ⃗ , b ) ∂ b w_j = w_j - \alpha \frac {\partial J(\vec {w}, b)} {\partial w_j} \\ b_j = b_j - \alpha \frac {\partial J(\vec {w}, b)} {\partial b} wj=wjαwjJ(w ,b)bj=bjαbJ(w ,b)

gradient 部分公式为:
∂ J ( w ⃗ , b ) ∂ w j = 1 m ∑ i = 0 m − 1 ( f w ⃗ , b ( x ⃗ ( i ) ) − y ( i ) ) x j ( i ) ∂ J ( w ⃗ , b ) ∂ b = 1 m ∑ i = 0 m − 1 ( f w ⃗ , b ( x ( i ) ) − y ( i ) ) \frac {\partial J(\vec {w}, b)} {\partial w_j} =\frac 1 {m} \sum _{i=0} ^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})x^{(i)}_j \\ \frac {\partial J(\vec {w}, b)} {\partial b}=\frac 1 m \sum ^{m-1}_{i=0}(f_{\vec{w},b}(x^{(i)})-y^{(i)}) wjJ(w ,b)=m1i=0m1(fw ,b(x (i))y(i))xj(i)bJ(w ,b)=m1i=0m1(fw ,b(x(i))y(i))

代码实现:

def compute_gradient(X, y, w, b): 

    m,n = X.shape
    dj_dw = np.zeros((n,))
    dj_db = 0.

    for i in range(m):                             
        err = (np.dot(X[i], w) + b) - y[i]   
        for j in range(n):                         
            dj_dw[j] = dj_dw[j] + err * X[i, j]    
        dj_db = dj_db + err                        
    dj_dw = dj_dw / m                                
    dj_db = dj_db / m                                
        
    return dj_db, dj_dw
def gradient_descent(X, y, w_in, b_in, cost_function, compute_gradient, alpha, num_iters): 

    J_history = []
    w = copy.deepcopy(w_in)  #avoid modifying global w within function
    b = b_in
    
    for i in range(num_iters):

        dj_db,dj_dw = compute_gradient(X, y, w, b)
        w = w - alpha * dj_dw
        b = b - alpha * dj_db
      
        if i<100000:
            J_history.append( cost_function(X, y, w, b))
            
        if i% math.ceil(num_iters / 10) == 0:
            print(f"Iteration {i:4d}: Cost {J_history[-1]:8.2f}   ")
        
    return w, b, J_history

【机器学习】P3 多重线性回归

Sklearn 实现线性回归

Scikit-learn(sklearn)库提供了用于线性回归模型的工具,可以通过最小化损失函数来拟合线性函数,并使用梯度下降算法调整模型参数。

具体来说,可以使用 sklearn.linear_model 模块中的 LinearRegression 类来拟合多重线性函数,我们可以创建一个 LinearRegression 类的实例,并使用 fit 方法对模型进行训练,直接得到拟合后的结果:

案例:对波士顿房价进行预测 案例:对波士顿房价进行预测 案例:对波士顿房价进行预测

from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data
y = boston.target

# 创建一个线性回归模型
lr = LinearRegression()

# 使用训练集对模型进行训练
lr.fit(X, y)

# 训练完成
# 预测新数据的房价
y_pred = lr.predict(X)

此外,我们还可以使用 sklearn.metrics 模块中的 mean_squared_error 函数来计算损失函数的均方误差(MSE);sklearn.preprocessing 模块中的 StandardScaler 类来进行特征缩放,以帮助优化梯度下降算法的性能。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
import numpy as np

# 生成随机数据
np.random.seed(42)
X = np.random.rand(100, 3)
y = X.dot([1.5, -2, 0.5]) + 0.1 * np.random.randn(100)

# 特征缩放
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 创建线性回归模型
model = LinearRegression()

# 拟合模型
model.fit(X_scaled, y)

# 计算均方误差
y_pred = model.predict(X_scaled)
mse = mean_squared_error(y, y_pred)
print("均方误差:", mse)

# 输出模型系数
print("模型系数:", model.coef_)