*Python*机器学习算法——线性回归(Linear Regression)

弥十一 2024-10-16 09:35:01 阅读 51

目录

⭐️引言

⭐️理论

1、 简单线性回归

2、 多元线性回归

3、最佳拟合

⭐️结语


⭐️引言

        线性回归(Linear Regression)是一种基本的预测分析方法,它通过拟合数据点来建立因变量(目标变量)与一个或多个自变量之间的关系模型。线性回归假设这种关系是线性的,并试图找到一条直线(简单线性回归)或超平面(多元线性回归),使得这条直线或超平面与实际数据点之间的误差最小化。

⭐️理论

        为了实现线性回归(Linear Regression)主要使用Scikit-learn提供了丰富的线性回归工具,其中包括基本的LinearRegression(使用普通最小二乘法)、Ridge回归(通过L2正则化解决多重共线性问题)、Lasso回归(通过L1正则化实现特征选择)、ElasticNet(结合L1和L2正则化)以及SGDRegressor(使用随机梯度下降法)等库解决线性回归的一系列问题

1、 简单线性回归

        简单线性回归(Simple Linear Regression, SLR)是一种基本的统计方法,主要用来分析两

个变量间的关系,其中一个变量是因变量(或响应变量),另一个是自变量(或预测变量)。

        简单线性回归模型假定因变量 ( y ) 与自变量 ( x ) 之间存在线性关系,模型可表示为:

                                                

y = \beta_0 + \beta_1 x + \epsilon

        其中:

        (

y

) 是因变量。

        (

x

) 是自变量。

        (

\beta_0

) 是模型的截距(当 (

x=0

) 时 (

y

) 的预期值)。

        (

\beta_1

) 是斜率,表示自变量 (

x

 ) 每增加一个单位时因变量 (

y

) 的平均变化量。

        (

\epsilon

) 是误差项,代表模型未能捕捉的影响 (

y

) 的其他因素。

<code>import numpy as np

import matplotlib.pyplot as plt

# 设置随机种子以确保结果可重复

np.random.seed(42)

# 生成模拟数据

n_samples = 100

X = np.random.rand(n_samples, 1) * 10 # 自变量

y = 2 * X + 3 + np.random.randn(n_samples, 1) # 因变量,添加一些噪声

# 可视化原始数据

plt.scatter(X, y, color='blue', label='Data Points')code>

plt.xlabel('X')

plt.ylabel('Y')

plt.legend()

plt.show()

        通过求解最小二乘法,可以获得参数 (

\beta_0

) 和 (

\beta_1

) 的估计值。具体的参数估计公式如下:

        截距 (

\hat{\beta_0}

) 的估计值为: 

                                                

\hat{\beta_0} = \bar{y} - \hat{\beta_1} \bar{x}

        斜率 (

\hat{\beta_1}

) 的估计值为:

                                              ​​​​​ 

\hat{\beta_1} = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n}(x_i - \bar{x})^2}

         其中 (

\bar{x}

) 和 (

\bar{y}

) 分别是 ( x ) 和 ( y ) 的平均值。

<code>def simple_linear_regression(X, y):

# 计算均值

mean_x = np.mean(X)

mean_y = np.mean(y)

# 计算斜率

numerator = np.sum((X - mean_x) * (y - mean_y))

denominator = np.sum((X - mean_x) ** 2)

beta_1 = numerator / denominator

# 计算截距

beta_0 = mean_y - beta_1 * mean_x

return beta_0, beta_1

# 训练模型

beta_0, beta_1 = simple_linear_regression(X, y)

print(f"截距 (beta_0): {beta_0}")

print(f"斜率 (beta_1): {beta_1}")

# 预测

y_pred = beta_0 + beta_1 * X

# 可视化结果

plt.scatter(X, y, color='blue', label='Data Points')code>

plt.plot(X, y_pred, color='red', label='Regression Line')code>

plt.xlabel('X')

plt.ylabel('Y')

plt.legend()

plt.show()

        评估简单线性回归模型的好坏可以通过以下指标:

        决定系数 ( 

R^2

):衡量模型解释了因变量变异性的比例。(

R^2

 ) 的值介于 0 到 1 之间,值越

接近 1 表示模型拟合效果越好。

        标准误差:衡量预测值与实际值之间的平均差异。

        t 检验:用于检验回归系数是否显著不同于零。

        F 检验:用于检验整个回归模型是否具有统计显著性。

2、 多元线性回归

        多元线性回归(Multiple Linear Regression, MLR)是一种扩展的线性回归模型,它考虑了一

个因变量与多个自变量之间的线性关系。

        多元线性回归模型可以表示为:  

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        

y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_n x_n + \epsilon

        其中:

        (

y

) 是因变量。

        (

x_1

,

x_2

,

\ldots

,

x_n

) 是自变量。

        ( 

\beta_0

 ) 是截距项。

        (

\beta_1, \beta_2, \ldots, \beta_n

) 是回归系数。

        (

\epsilon

) 是误差项。

<code>import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

# 设置随机种子以确保结果可重复

np.random.seed(42)

# 生成模拟数据

n_samples = 100

X = np.random.rand(n_samples, 2) * 10 # 两个自变量

y = 2 * X[:, 0] + 3 * X[:, 1] + 5 + np.random.randn(n_samples) # 因变量,添加一些噪声

# 将数据转换为 DataFrame 方便操作

data = pd.DataFrame({'x1': X[:, 0], 'x2': X[:, 1], 'y': y})

# 可视化原始数据

fig, ax = plt.subplots(figsize=(8, 6))

ax.scatter(X[:, 0], y, color='blue', label='Data Points')code>

ax.set_xlabel('X1')

ax.set_ylabel('Y')

ax.legend()

plt.show()

        通过求解最小二乘法,可以获得参数的估计值。

        具体的参数估计公式如下:

\mathbf{b} = (X^T X)^{-1} X^T y

其中:

        (

\mathbf{b}

) 是参数向量 (

\beta

) 的估计值。

        (

X

) 是自变量矩阵,每一行为一个样本的自变量值。

        (

y

) 是因变量向量。

<code>def multiple_linear_regression(X, y):

# 添加一列全为 1 的截距项

X = np.hstack((np.ones((n_samples, 1)), X))

# 计算参数估计值

b = np.linalg.inv(X.T @ X) @ X.T @ y

return b

# 训练模型

b = multiple_linear_regression(X, y)

print(f"截距 (beta_0): {b[0]}")

print(f"斜率 (beta_1): {b[1]}")

print(f"斜率 (beta_2): {b[2]}")

# 预测

y_pred = b[0] + b[1] * X[:, 0] + b[2] * X[:, 1]

# 可视化结果

fig, ax = plt.subplots(figsize=(8, 6))

ax.scatter(X[:, 0], y, color='blue', label='Data Points')code>

ax.plot(X[:, 0], y_pred, color='red', label='Regression Line')code>

ax.set_xlabel('X1')

ax.set_ylabel('Y')

ax.legend()

plt.show()

模型评估

        评估多元线性回归模型的好坏可以通过以下指标:

        决定系数 (

R^2

):衡量模型解释了因变量变异性的比例。(

R^2

) 的值介于 0 到 1 之间,值越接近 1 表示模型拟合效果越好。

        调整后的 (

R^2

):考虑了模型复杂度对 ( R^2 ) 的影

        t 检验:用于检验每个回归系数是否显著不同于零。

        F 检验:用于检验整个回归模型是否具有统计显著性。

假设检验

        多元线性回归模型通常需要满足以下假设:

        线性关系:因变量与自变量之间存在线性关系。

        独立性:误差项 (

\epsilon

) 之间相互独立。

        正态性:误差项 (

\epsilon

) 服从正态分布。

        同方差性:误差项 (

\epsilon

) 的方差在不同自变量取值下保持不变。

        无多重共线性:自变量之间不存在高度相关性。

3、最佳拟合

        最小化上述损失函数的过程就是寻找最佳拟合直线或超平面的过程。可以通过解析解(如正

规方程 Normal Equation)或数值优化方法(如梯度下降 Gradient Descent)来求解。

        正规方程

正规方程可以直接求解 (

\mathbf{w}

):

                                                 

\mathbf{w} = (X^T X)^{-1} X^T y

]

其中:

        ( X ) 是样本特征矩阵。

        ( y ) 是样本标签向量。

​​​​​​​        数值优化方法

目标函数为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

J(\mathbf{w}) = \frac{1}{2n} \sum_{i=1}^{n} (y_i - \mathbf{w}^T \mathbf{x}_i)^2

目标函数的梯度为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

\nabla J(\mathbf{w}) = \frac{1}{n} \sum_{i=1}^{n} -(\mathbf{x}_i (y_i - \mathbf{w}^T \mathbf{x}_i))

梯度下降的更新规则为:其中,(

\alpha

) 是学习率。

                                                  

\mathbf{w}_{k+1} = \mathbf{w}_k - \alpha \nabla J(\mathbf{w}_k)

<code>def gradient_descent(X, y, learning_rate=0.01, max_iters=1000, tol=1e-6):

# 初始化参数

n_features = X.shape[1]

w = np.zeros(n_features + 1) # 包括截距项

X = np.hstack((np.ones((n_samples, 1)), X)) # 添加截距项

# 计算目标函数

def cost_function(w, X, y):

predictions = X @ w

errors = predictions - y

return (1 / (2 * n_samples)) * np.sum(errors ** 2)

# 计算梯度

def gradient(w, X, y):

predictions = X @ w

errors = predictions - y

return (1 / n_samples) * (X.T @ errors)

# 梯度下降迭代

prev_cost = float('inf')

for _ in range(max_iters):

grad = gradient(w, X, y)

w -= learning_rate * grad

current_cost = cost_function(w, X, y)

if abs(prev_cost - current_cost) < tol:

break

prev_cost = current_cost

return w

# 训练模型

w = gradient_descent(X, y)

print(f"截距 (beta_0): {w[0]}")

print(f"斜率 (beta_1): {w[1]}")

print(f"斜率 (beta_2): {w[2]}")

⭐️结语

        线性回归是一种简单而强大的统计学习方法,广泛应用于数据分析和机器学习领域,通过建立因变量与一个或多个自变量之间的线性关系,帮助我们理解和预测数据中的趋势。无论是简单线性回归还是多元线性回归,都可以通过最小二乘法或梯度下降法求解参数,从而最小化残差平方和(RSS)。模型训练过程中,我们可以使用闭式解 (

\mathbf{b} = (X^T X)^{-1} X^T y

) 或者通过迭代优化求解参数。模型评估时,通过决定系数 (

R^2

)、调整后的 (

R^2

)、标准误差、t 检验和 F 检验等多种指标来衡量模型的性能。总之,线性回归不仅理论基础扎实,而且在实际应用中表现出色,是解决回归问题的重要工具。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。