✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。
✍ 本文录入于《数据分析之术》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分析工程师精心打造,对机器学习算法知识点逐一击破,不断学习,提升自我。
✍ 订阅后,可以阅读《数据分析之术》中全部文章内容,详细介绍数学模型及原理,带领读者通过模型与算法描述实现一个个案例。
✍ 还可以订阅基础篇《数据分析之道》,其包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》
线性回归(Linear Regression)是一种用于建立自变量和因变量之间线性关系的统计模型。它假设自变量和因变量之间存在一个线性关系,并用一条直线对这种关系进行建模。
在线性回归中,我们通常使用最小二乘法来拟合直线,即选择一条直线使得所有样本点到这条直线的距离之和最小。最小二乘法可以通过求解一组线性方程组来得到直线的系数和截距,这组方程可以写成以下形式:
Y = b0 + b1X1 + b2X2 + … + bn*Xn + ε
其中,Y是因变量,b0是截距,b1bn是自变量系数,X1Xn是自变量,ε是误差项,表示模型无法解释的部分。
线性回归模型的拟合质量可以通过R方值来衡量,R方值越大表示模型拟合得越好。此外,我们还可以利用假设检验来判断模型的显著性,检验模型的系数是否显著不为零,以确定模型的可靠性。
线性回归模型可以扩展到多元线性回归,即自变量不止一个的情况。多元线性回归模型的形式与简单线性回归类似,只是自变量的数量更多,需要求解的线性方程组也更复杂。
线性回归广泛应用于数据分析、预测和建模等领域,它可以用于探索变量之间的关系、预测未来趋势、诊断异常值等任务。
最小二乘法(Least Squares Method)是一种基本的回归分析方法,用于寻找一条线性回归方程,将自变量和因变量之间的关系进行拟合。该方法的基本原理是最小化所有观测点到回归直线的垂直距离的平方和,也就是最小化残差平方和。
具体来说,对于给定的自变量 x i x_i xi 和因变量 y i y_i yi,假设它们之间的关系可以用一条直线来描述,即
y i y_i yi= β 0 β_0 β0+ β 1 β_1 β1 x i x_i xi+ ϵ i ϵ _i ϵi
其中, β 0 \beta_0 β0 和 β 1 \beta_1 β1 分别是截距和斜率, ϵ i \epsilon_i ϵi 表示观测点 i i i 的误差,通常假设误差满足正态分布,均值为0,方差为 σ 2 \sigma^2 σ2。
假设有 n n n 个观测点 ( x i , y i ) (x_i, y_i) (xi,yi),则最小二乘法的目标是找到 β 0 \beta_0 β0 和 β 1 \beta_1 β1,使得所有观测点到回归直线的垂直距离的平方和最小。垂直距离可以用观测点的残差 ϵ i \epsilon_i ϵi 来表示,即
r e s i d u a l i residual_i residuali = y i y_i yi+ y ^ i \hat{y}_i y^i = y i y_i yi - ( β 0 \beta_0 β0 + β 1 \beta_1 β1 x i x_i xi )
其中, y ^ i \hat{y}_i y^i 是回归方程对观测点 i i i 的预测值。
那么所有观测点到回归直线的垂直距离的平方和为:
最小二乘法的目标是找到使 RSS \text{RSS} RSS 最小的 β 0 \beta_0 β0 和 β 1 \beta_1 β1,即
可以通过对 RSS \text{RSS} RSS 求偏导数,令其等于0来求解 β 0 \beta_0 β0 和 β 1 \beta_1 β1 的解析解。也可以通过梯度下降法等优化算法来寻找最优解。
以下是使用Python实现最小二乘法的一个简单实例。
假设有如下的一组数据:
x | y |
---|---|
1 | 2.2 |
2 | 3.9 |
3 | 6.1 |
4 | 8.0 |
5 | 10.3 |
6 | 12.2 |
7 | 14.5 |
8 | 16.3 |
9 | 18.1 |
10 | 20.2 |
我们可以使用最小二乘法来拟合出一条线性回归方程,用于描述 x x x 和 y y y 之间的关系。
首先,导入必要的库和数据:
import numpy as np
import matplotlib.pyplot as plt
# 数据
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.array([2.2, 3.9, 6.1, 8.0, 10.3, 12.2, 14.5, 16.3, 18.1, 20.2])
然后,计算相关的统计量:
n = len(x)
sum_x = np.sum(x)
sum_y = np.sum(y)
sum_xy = np.sum(x * y)
sum_x2 = np.sum(x ** 2)
mean_x = np.mean(x)
mean_y = np.mean(y)
计算斜率和截距:
# 计算斜率和截距
slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)
intercept = mean_y - slope * mean_x
打印结果:
# 打印结果
print("Slope (beta1): ", slope)
print("Intercept (beta0): ", intercept)
输出结果:
Slope (beta1): 2.005
Intercept (beta0): 0.08099999999999991
最后,画出拟合直线:
# 画图
plt.scatter(x, y)
plt.plot(x, intercept + slope * x, 'r')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
可以看出,通过最小二乘法拟合的直线较好地描述了 x x x 和 y y y 之间的线性关系。
订阅热门专栏:
《数据分析之道》
《数据分析之术》
《机器学习案例》
《数据分析案例》
文章下方有交流学习区!一起学习进步!
首发CSDN博客,创作不易,如果觉得文章不错,可以点赞收藏评论
你的支持和鼓励是我创作的动力❗❗❗