问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

机器学习算法:一文掌握最小二乘法的详细用法(5个案例可直接运行)

创作时间:
作者:
@小白创作中心

机器学习算法:一文掌握最小二乘法的详细用法(5个案例可直接运行)

引用
CSDN
1.
https://blog.csdn.net/cui_yonghua/article/details/146388425

最小二乘法是一种常用的机器学习算法,用于解决回归问题。本文将从原理、计算方法、代码示例、应用场景等方面对其进行详细介绍。

一、最小二乘法概述

1.1 基本概念

最小二乘法(Least Squares Method)是一种用于拟合数据的经典回归分析方法,广泛应用于线性回归、非线性回归和统计学中。其核心思想是通过最小化观测数据与模型预测值之间的误差平方和,找到最优的模型参数。

最小二乘法的目标是找到一组模型参数,使得模型预测值与实际观测值之间的误差平方和最小。对于线性模型,最小二乘法可以用于估计回归系数。

最小二乘法公式是一个数学的公式,在数学上称为曲线拟合,不仅仅包括线性回归方程,还包括矩阵的最小二乘法。线性最小二乘法公式为:a=y-bx。
矩阵的最小二乘法常用于测量数据处理的平差公式中

1.2 优缺点

优点:

  • 计算简单,易于实现。
  • 对于线性模型,最小二乘估计是最优线性无偏估计(BLUE)。

缺点:

  • 对异常值敏感,容易受到离群点的影响。
  • 假设误差服从正态分布,可能不适用于非正态分布的数据。

1.3 应用场景

最小二乘法广泛应用于以下领域:

  • 线性回归:用于拟合线性模型。
  • 非线性回归:通过线性化或迭代方法拟合非线性模型。
  • 统计学:用于参数估计和假设检验。
  • 信号处理:用于滤波和信号估计。

1.4 注意事项

  • 最小二乘法假设误差是正态分布的,且误差的方差是恒定的。如果数据不满足这些假设,可能需要使用其他拟合方法。
  • 对于非线性数据,可以使用多项式拟合或其他非线性拟合方法。

二、用Python实现最小二乘法

2.1 的公式实现

# -*- encoding: utf-8 -*-

def least_squares(x, y):
    n = len(x)
    sum_x = sum(x)
    sum_y = sum(y)
    sum_xy = sum([x[i] * y[i] for i in range(n)])
    sum_x2 = sum([x[i] ** 2 for i in range(n)])

    m = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)
    c = (sum_y - m * sum_x) / n

    return m, c

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

m, c = least_squares(x, y)
print(f"拟合直线方程为: y = {m}x + {c}")

2.2 使用numpy实现最小二乘法

import numpy as np
import matplotlib.pyplot as plt

# 生成一些随机数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, 100)

# 使用numpy的polyfit函数进行最小二乘拟合
a, b = np.polyfit(x, y, 1)

# 打印拟合结果
print(f"拟合的直线方程: y = {a:.2f}x + {b:.2f}")

# 绘制数据点和拟合直线
plt.scatter(x, y, label='Data Points')
plt.plot(x, a * x + b, color='red', label='Fitted Line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

2.3 使用scipy.optimize.curve_fit实现最小二乘法

scipy.optimize.curve_fit 是一个更通用的函数,可以用于拟合任意形式的函数。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 定义线性函数
def linear_func(x, a, b):
    return a * x + b

# 生成一些随机数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.normal(0, 1, 100)

# 使用curve_fit进行最小二乘拟合
popt, pcov = curve_fit(linear_func, x, y)

# 提取拟合参数
a, b = popt
print(f"拟合的直线方程: y = {a:.2f}x + {b:.2f}")

# 绘制数据点和拟合直线
plt.scatter(x, y, label='Data Points')
plt.plot(x, linear_func(x, a, b), color='red', label='Fitted Line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

2.4 拟合一条直线来预测未来的浓度变化

假设我们有一组实验数据,表示某种物质的浓度随时间的变化。我们希望通过最小二乘法拟合一条直线来预测未来的浓度变化。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 定义线性函数
def linear_func(x, a, b):
    return a * x + b

# 实验数据
time = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
concentration = np.array([1.2, 2.1, 2.8, 4.0, 5.1, 6.2, 7.1, 8.0, 9.1, 10.0])

# 使用curve_fit进行最小二乘拟合
popt, pcov = curve_fit(linear_func, time, concentration)

# 提取拟合参数
a, b = popt
print(f"拟合的直线方程: y = {a:.2f}x + {b:.2f}")

# 预测未来浓度
future_time = np.array([10, 11, 12])
predicted_concentration = linear_func(future_time, a, b)

# 绘制数据点和拟合直线
plt.scatter(time, concentration, label='Experimental Data')
plt.plot(time, linear_func(time, a, b), color='red', label='Fitted Line')
plt.plot(future_time, predicted_concentration, color='green', label='Predicted Data')
plt.xlabel('Time')
plt.ylabel('Concentration')
plt.legend()
plt.show()

结果解释

  • 拟合的直线方程:通过最小二乘法拟合得到的直线方程 y=ax+b 可以用来描述数据点的趋势。
  • 预测未来浓度:使用拟合的直线方程,可以预测未来某个时间点的浓度值。

2.5 房价预测

假设我们有一组房屋面积和房价的数据,希望通过最小二乘法拟合一个线性模型来预测房价。

数据集
面积 (X) 房价 (y)
50 150
80 200
100 250
120 300
150 350

import numpy as np
import matplotlib.pyplot as plt

# 最小二乘法实现
def least_squares(X, y):
    """
    最小二乘法求解线性回归参数
    :param X: 自变量矩阵 (n x m)
    :param y: 因变量向量 (n x 1)
    :return: 回归系数向量 (m x 1)
    """
    # 计算回归系数 beta = (X^T X)^(-1) X^T y
    beta = np.linalg.inv(X.T @ X) @ X.T @ y
    return beta

# 实际案例:房价预测
X_real = np.array([[50], [80], [100], [120], [150]])  # 面积
y_real = np.array([[150], [200], [250], [300], [350]])  # 房价

# 添加偏置项
X_real_b = np.c_[np.ones((X_real.shape[0], 1)), X_real]

# 使用最小二乘法求解回归系数
beta_real = least_squares(X_real_b, y_real)
print("房价预测回归系数 (beta):", beta_real)

从运行结果可以看出,回归系数:

房价预测回归系数 (beta): [[50.0]
                        [2.0]]

三、总结

最小二乘法是一种简单而有效的机器学习算法,在许多领域都有广泛的应用。但在实际应用中,需要根据数据的特点和问题的需求,合理选择和使用该算法,并注意其局限性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号