机器学习中的简单线性回归

y=XB+E 是什么公式?这是一个线性回归模型的表示式,其中:

  • y 是目标变量(或响应变量),
  • X 是特征矩阵,包含观察样本的特征值,
  • B 是系数矩阵,包含每个特征对应的系数,
  • E 是误差项,表示模型无法解释的部分。

线性回归模型的目标是通过调整系数矩阵 B,使得模型的预测值与实际观测值之间的误差最小化。通常使用最小二乘法来估计系数。整个模型可以表示为对观测值 y 的拟合,其中拟合值由特征矩阵 X 和系数矩阵 B 的乘积得到,再加上误差项 E。

这个模型是一种简单的线性回归模型,如果有多个特征,可以考虑多元线性回归。


什么是线性回归?
线性回归是一种监督机器学习算法,用于计算因变量与一个或多个独立特征之间的线性关系。当独立特征的数量为1时,称为单变量线性回归;当独立特征的数量为1时,称为多元线性回归。

什么是监督机器学习算法
这是一种机器学习,算法从标记数据中学习。标记数据是指其各自目标值已知的数据集。监督学习有两种类型:

  • 分类:它根据独立输入变量预测数据集的类别。类别是分类值或离散值。比如动物的形象是猫还是狗?
  • 回归:它根据独立输入变量预测连续输出变量。例如根据房屋年龄、距主干道的距离、位置、面积等不同参数来预测房价。

在这里,我们将讨论最简单的回归类型之一,即线性回归。

为什么线性回归很重要?
线性回归的可解释性是一个显着的优势。该模型的方程提供了清晰的系数,阐明了每个自变量对因变量的影响,有助于更深入地了解潜在的动态。它的简单性是一个优点,因为线性回归是透明的,易于实现,并且可以作为更复杂算法的基础概念。

线性回归不仅仅是一种预测工具;它构成了各种先进模型的基础。正则化和支持向量机等技术从线性回归中汲取灵感,扩展了其实用性。此外,线性回归是假设检验的基石,使研究人员能够验证有关数据的关键假设。


最好的拟合线是什么?
使用线性回归时我们的主要目标是找到最佳拟合线,这意味着预测值和实际值之间的误差应保持在最低限度。最佳拟合线的误差最小。

最佳拟合线方程提供了一条代表因变量和自变量之间关系的直线。直线的斜率表示自变量每变化一个单位,因变量会发生多少变化。

简单线性回归的假设
线性回归是理解和预测变量行为的强大工具,但是,它需要满足一些条件才能获得准确可靠的解决方案。 

  1. 线性:自变量和因变量彼此之间存在线性关系。这意味着因变量的变化以线性方式跟随自变量的变化。这意味着应该有一条可以通过数据点绘制的直线。如果关系不是线性的,那么线性回归将不是一个准确的模型。
  2. 独立性:数据集中的观测值彼此独立。这意味着一个观测值的因变量值不依赖于另一观测值的因变量值。如果观察结果不独立,那么线性回归将不是一个准确的模型。
  3. 同方差性:在自变量的所有水平上,误差的方差是恒定的。这表明自变量的数量对误差的方差没有影响。如果残差的方差不是恒定的,那么线性回归将不是一个准确的模型。
  4. 正态性:残差应呈正态分布。这意味着残差应遵循钟形曲线。如果残差不呈正态分布,则线性回归将不是一个准确的模型

简单线性回归的 Python 实现 
我们可以使用Python语言来学习线性回归模型的系数。为了绘制输入数据和最佳拟合线,我们将使用matplotlib库。它是最常用的用于绘制图表的 Python 库之一。这是使用 Python 进行简单线性回归的示例。

估计系数函数

import numpy as np
import matplotlib.pyplot as plt

def estimate_coef(x, y):
# 观测点数量
n = np.size(x)

# mean of x and y vector
m_x = np.mean(x)
m_y = np.mean(y)

# 计算 x 的交叉偏差和偏差
SS_xy = np.sum(y*x) - n*m_y*m_x
SS_xx = np.sum(x*x) - n*m_x*m_x

# calculating regression coefficients
b_1 = SS_xy / SS_xx
b_0 = m_y - b_1*m_x

return (b_0, b_1)


上述代码在,estimate_coef()采用输入数据x(自变量)和y(因变量)并使用最小二乘法估计线性回归线的系数。

  • 计算观察数:确定数据点的数量。 n = np.size(x)
  • 计算平均值:和分别计算和的平均值。 m_x = np.mean(x)m_y = np.mean(y)xy
  • 计算交叉偏差和关于 x 的偏差:分别计算 和 之间的偏差平方和以及关于其均值的偏差平方和。 SS_xy = np.sum(y*x) - n*m_y*m_xSS_xx = np.sum(x*x) - n*m_x*m_xxyx
  • 计算回归系数:并使用最小二乘法确定回归线的斜率 ( ) 和截距 ( )。 b_1 = SS_xy / SS_xxb_0 = m_y - b_1*m_xb_1b_0
  • 返回系数:该函数以元组形式返回估计系数(b_0, b_1)。

绘制回归线函数

def plot_regression_line(x, y, b):
# plotting the actual points as scatter plot
plt.scatter(x, y, color = "m",
        marker =
"o", s = 30)

# predicted response vector
y_pred = b[0] + b[1]*x

# plotting the regression line
plt.plot(x, y_pred, color =
"g")

# putting labels
plt.xlabel('x')
plt.ylabel('y')

plot_regression_line()采用输入数据x(自变量)、y(因变量)和估计系数b来绘制回归线和数据点。

  1. 绘制散点图:将原始数据点绘制为带有红色标记的散点图。 plt.scatter(x, y, color = "m", marker = "o", s = 30)
  2. 计算预测响应向量:根据估计系数计算 的预测值。 y_pred = b[0] + b[1]*xyb
  3. 绘制回归线:使用预测值和自变量 绘制回归线。 plt.plot(x, y_pred, color = "g")x
  4. 添加标签:并将x 轴和 y 轴分别标记为 。 plt.xlabel('x')plt.ylabel('y')'x''y'

主功能
提供的代码通过定义执行以下步骤的函数来实现简单的线性回归分析:main()

  1. 数据定义:将自变量 ( x) 和因变量 ( y) 定义为 NumPy 数组。
  2. 系数估计:调用 estimate_coef() 函数以使用提供的数据确定线性回归线的系数。
  3. 打印系数:打印回归线的估计截距 ( b_0) 和斜率 ( )。b_1

def main():
# observations / data
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([1, 3, 2, 5, 7, 8, 8, 9, 10, 12])

# estimating coefficients
b = estimate_coef(x, y)
print("Estimated coefficients:\nb_0 = {}\
    \nb_1 = {}
".format(b

使用库包
简单线性回归的 Python 实现通常涉及使用统计或机器学习库,例如 statsmodels 或 scikit-learn。

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

# 生成一些模拟数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

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

# 训练模型
model.fit(X, y)

# 打印模型参数
print("斜率 (系数 B):", model.coef_)
print(
"截距 (截距项):", model.intercept_)

# 预测新数据点
new_X = np.array([[2.5]])
predicted_y = model.predict(new_X)
print(
"预测值:", predicted_y)

# 绘制模型拟合结果
plt.scatter(X, y, alpha=0.6, label='观测数据')
plt.plot(X, model.predict(X), color='red', label='线性回归模型')
plt.scatter(new_X, predicted_y, color='green', marker='X', s=100, label='新数据点预测值')
plt.xlabel('特征 (X)')
plt.ylabel('目标变量 (y)')
plt.legend()
plt.show()


在这个例子中,我们首先生成了一些模拟数据,然后使用 LinearRegression 类来拟合模型。最后,我们打印出模型的斜率和截距,以及对新数据点的预测。最后,我们使用 matplotlib 绘制了观测数据、模型拟合线和新数据点的预测值。