【机器学习】多元线性回归算法和正规方程解求解

打印 上一主题 下一主题

主题 897|帖子 897|积分 2691

一、摘要

本文围绕多元线性回归的正规方程解睁开,为初学者体系介绍了相关基本概念、求解方法、实际应用以及算法封装要点。
起首,深入阐释了正规方程解这一多元线性回归的紧张求解方法,同时明白了截距和系数的概念及其差异。通过详细步骤,指导读者如何运用正规方程办理多元线性回归问题,并剖析了将截距和系数分开处理惩罚的缘故原由,帮助读者明白其背后的数学逻辑和实际意义。
接着,全面分析了正规方程解的优缺点,使读者清晰相识该方法在不同场景下的适用性。在此根本上,介绍了正规方程解在实际应用中的具体操纵方法,加强了读者将理论知识转化为实践的本领。
在算法封装层面,偏重解释了在封装多元线性回归算法时,采用截距和系数分开处理惩罚方式的缘故原由,为读者在实际编程实现中提供了思绪。同时,还提及了 我们自己新建的工程包中新加入的广义线性回归模型,该模型具备强大的通用性,既能办理多元线性回归问题,也能应对简朴线性回归问题,拓宽了读者的技能视野。
末了,以 fit 函数的实现过程为切入点,详细解说了使用正规化方程求解的具体步骤,包括如何创建矩阵                                              X                            b                                       X_b                  Xb​,让读者深入相识算法的底层实现细节,为进一步学习和开辟奠定坚实根本。
二、多元线性回归介绍


  • 多元线性回归用于处理惩罚样本具有多个特征值的问题,常见于真实世界的数据集。
  • 与简朴线性回归相比,多元线性回归的样本可能有成千上万个特征。

  • 多元线性回归算法的目标:损失函数界说为预测值与真实值之间的差的平方和,旨在最小化该函数。通过找到合适的 θ0 到 θn 的值,使得损失函数最小。

  • 多元线性回归的数学表示 : 为 y = θ0 + θ1x1 + θ2x2 + … + θnxn,此中 θ0 是截距项,θ1 到 θn 是各特征的系数。θ0 到 θn 共 n+1 个参数必要估计。

    通过向量化的表示方法将 θ0 到 θn 整理成一个向量 θ,同时将 X 矩阵的每一行添加一个虚拟的第零个特征,值为 1。这样可以将预测值表示为 Y^ = Xθ,此中 Y^ 是预测值向量



    最终得到的公式如上图所示,这个公式叫做多元线性回归的正规方程解,总结如下图所示:

三、正规方程解的求解及代码实现



  • 正规方程解是通过矩阵运算直接求解 θ 的方法,时间复杂度为 O(n^3),时间复杂度较高,对于大规模数据集可能效率较低。实际应用中,更常用的方法是梯度下降法
  • 求解过程涉及矩阵求导求逆运算,具体推导过程较为复杂。
  • 以波士顿房价数据为例来编写步调和测试

    • 在PyChram中新建metrics.py文件,用于实现MSE、RMSE、MAE求解代码
      1. import numpy as np
      2. def mean_squared_error(y_true, y_predict):
      3.     """计算y_true和y_predict之间的MSE"""
      4.     assert len(y_true) == len(y_predict), \
      5.         "the size of y_true must be equal to the size of y_predict"
      6.     return np.sum((y_true - y_predict) ** 2) / len(y_true)
      7. def root_mean_squared_error(y_true, y_predict):
      8.     """计算y_true和y_predict之间的RMSE"""
      9.     return np.sqrt(mean_squared_error(y_true, y_predict))
      10. def mean_absolute_error(y_true, y_predict):
      11.     """计算y_true和y_predict之间的MAE"""
      12.     assert len(y_true) == len(y_predict), \
      13.         "the size of y_true must be equal to the size of y_predict"
      14.     return np.sum(np.abs(y_true - y_predict)) / len(y_true)
      15. def r2_score(y_true, y_predict):
      16.     """计算y_true和y_predict之间的R方值"""
      17.     return 1 - mean_squared_error(y_true, y_predict) / np.var(y_true)
      复制代码
    • 在PyChram中编写正规方程解代码
      1. import numpy as np
      2. from metrics import r2_score
      3. class LinearRegression:
      4.     # 构造函数
      5.     def __init__(self):
      6.         """初始化Linear Regression模型"""
      7.         self.interception_ = None  # 定义正规方程中的截距
      8.         self.coef_ = None  # 定义正规方程中的系数
      9.         self._theta = None  # 定义正规方程中的内部参数
      10.     def fit_normal(self, X_train, y_train):
      11.         """根据训练数据集X_train, y_train训练Linear Regression模型"""
      12.         assert X_train.shape[0] == y_train.shape[0], \
      13.             "the size of X_train must be equal to the size of y_train"
      14.         X_train = np.array(X_train)
      15.         X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
      16.         # 检查 X_b 的数据类型
      17.         print("X_b的数据类型:", X_b.dtype)
      18.         # 检查 X_b 中是否有非数值元素
      19.         if np.issubdtype(X_b.dtype, np.number):
      20.             print("X_b 全部为数值类型")
      21.         else:
      22.             print("X_b 存在非数值类型元素")
      23.         # 尝试将 X_b 转换为数值类型
      24.         X_b = X_b.astype(np.float64)
      25.         self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
      26.         self.interception_ = self._theta[0]
      27.         self.coef_ = self._theta[1:]
      28.         return self
      29.     def predict(self, X_predict):
      30.         """给定待预测数据集X_predict, 返回表示X_predict的结果向量"""
      31.         assert self.interception_ is not None and self.coef_ is not None, \
      32.             "must fit before predict!"
      33.         assert X_predict.shape[1] == len(self.coef_), \
      34.             "the feature number of X_predict must be equal to X_train"
      35.         X_train = np.array(X_predict)
      36.         X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
      37.         # 检查 X_b 的数据类型
      38.         print("X_b的数据类型:", X_b.dtype)
      39.         # 检查 X_b 中是否有非数值元素
      40.         if np.issubdtype(X_b.dtype, np.number):
      41.             print("X_b 全部为数值类型")
      42.         else:
      43.             print("X_b 存在非数值类型元素")
      44.         # 尝试将 X_b 转换为数值类型
      45.         X_b = X_b.astype(np.float64)
      46.         return X_b.dot(self._theta)
      47.     def score(self, X_test, y_test):
      48.         """根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""
      49.         y_predict = self.predict(X_test)
      50.         return r2_score(y_test, y_predict)
      51.     def __repr__(self):
      52.         return "LinearRegression()"
      复制代码
    • 运行测试,先导入波士顿房价测试数据
      1. import openml
      2. import numpy as np
      3. # 从 openml 获取波士顿房价数据集
      4. dataset = openml.datasets.get_dataset(531)
      5. X, y, categorical_indicator, attribute_names = dataset.get_data(
      6.     target=dataset.default_target_attribute, dataset_format='dataframe'
      7. )
      8. # 分布在50那里的一些点,可能不是真实的点,比如问卷调查中通过会设置一些上限点,而往往这些不是真实存在的额点,因此可以去除
      9. y_normal = y[y < 50.0]
      10. x_normal = X[y < 50.0]
      11. import sys
      12. # 替换为你的 PyCharm 工程实际路径
      13. project_path = 'D:/PycharmProjects/pythonProject/'
      14. if project_path not in sys.path:
      15.     sys.path.append(project_path)
      16. # 拆分训练集和测试集
      17. from model_selection import train_test_split
      18. X_train1, y_train1, X_test1, y_test1 = train_test_split(np.array(x_normal), np.array(y_normal), seed=666)
      复制代码
      在Jupyter中先运行,如下图所示:

    • 在Jupyter运行测试我们编写的模型
      1. from LinearRegressionModel import LinearRegression
      2. reg3 = LinearRegression()
      3. reg3.fit_normal(X_train1,y_train1)
      复制代码
      执行结果:

      打印出截距、系数:

      使用R方指标来权衡我们的模型最值的结果:

      R方值为:0.812979405621282,相比简朴线性方程中的预测结果要高出很多。在13维的空间中,我们的模型预测的结果要好得多。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表