线性回归(Linear Regression)算法介绍和代码示例

一、线性回归算法简介

1. 基本概念
  • 目标:通过线性模型拟合自变量(特征)与因变量(标签)之间的关系。

  • 数学模型

    其中:

    • yy:预测值(因变量)

    • xixi​:特征(自变量)

    • w0w0​:截距项(偏置)

    • w1,w2,…,wnw1​,w2​,…,wn​:回归系数(权重)

    • ϵϵ:误差项

2. 损失函数
  • 均方误差(MSE)

    • m:样本数量

    • y(i):真实值

    • y^(i):预测值

3. 参数求解
  • 最小二乘法:通过矩阵运算直接求解最优权重:

  • 梯度下降:迭代优化权重以最小化损失函数:

    • α:学习率


二、Python代码示例

1. 使用NumPy手动实现线性回归

import numpy as np
import matplotlib.pyplot as plt

# 生成示例数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)  # 特征:100个样本,1个特征
y = 4 + 3 * X + np.random.randn(100, 1)  # 标签:真实关系为 y=4+3x+噪声

# 添加偏置项(w0)
X_b = np.c_[np.ones((100, 1)), X]

# 最小二乘法求解权重
w = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print("权重(最小二乘法):", w)  # 输出示例:[4.215], [2.770]

# 预测
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
y_predict = X_new_b.dot(w)

# 可视化
plt.scatter(X, y, alpha=0.6)
plt.plot(X_new, y_predict, "r-", linewidth=2, label="预测线")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.show()
2. 使用Scikit-learn实现

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 创建模型
model = LinearRegression()

# 训练模型(无需手动添加偏置项)
model.fit(X, y)

# 输出参数
print("截距(w0):", model.intercept_)  # 示例:[4.215]
print("权重(w1):", model.coef_)       # 示例:[2.770]

# 预测
y_pred = model.predict(X)

# 评估
mse = mean_squared_error(y, y_pred)
print("均方误差(MSE):", mse)  # 示例:0.89
3. 梯度下降手动实现

# 定义梯度下降函数
def gradient_descent(X, y, learning_rate=0.1, n_iters=1000):
    m = X.shape[0]
    w = np.random.randn(2, 1)  # 随机初始化权重
    
    for _ in range(n_iters):
        gradients = 2/m * X.T.dot(X.dot(w) - y)
        w -= learning_rate * gradients
    return w

# 运行梯度下降
w_gd = gradient_descent(X_b, y, learning_rate=0.1, n_iters=1000)
print("权重(梯度下降):", w_gd)  # 输出应与最小二乘法接近

三、关键知识点

1. 应用场景
  • 房价预测(面积 vs 价格)

  • 销量预测(广告投入 vs 销售额)

  • 趋势分析(时间序列中的线性趋势)

2. 注意事项
  • 特征缩放:若特征量纲差异大,需标准化(如使用StandardScaler)。

  • 过拟合:线性回归不易过拟合,但特征过多时可考虑正则化(如岭回归)。

  • 假设检验:通过R²分数、p值评估模型显著性。

3. 模型评估指标
  • 均方误差(MSE):越小越好。

  • R²决定系数:越接近1表示模型解释力越强。


四、扩展:多项式回归

当数据关系非线性时,可通过添加多项式特征实现非线性拟合:

from sklearn.preprocessing import PolynomialFeatures

# 生成非线性数据
X = 6 * np.random.rand(100, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(100, 1)

# 添加二次项
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)

# 训练模型
model = LinearRegression()
model.fit(X_poly, y)

# 预测并可视化
X_test = np.linspace(-3, 3, 100).reshape(-1, 1)
X_test_poly = poly_features.transform(X_test)
y_test = model.predict(X_test_poly)

plt.scatter(X, y, alpha=0.6)
plt.plot(X_test, y_test, "r-", label="多项式回归")
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WangLanguager

您的鼓励是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值