程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2022-06(8)

2022-08(1)

多元线性回归模型

发布于2022-09-20 21:40     阅读(1206)     评论(0)     点赞(16)     收藏(1)


目录:

一、引言

二、理想场景的预设

三、多元线性回归模型

四、鸢尾花数据集

一、引言:

  多元线性回归是一元线性回归的多维运用。在一元线性回归中,我们用自变量系数表示对自变量与因变量之间的解释因素。那么,在多元线性回归中,我们引入多个解释变量,对同一个个体在不同方面的解释进行多维度的衡量。

二、理想场景的预设:

  为了便于理解,我们可以假设有一幢楼进行售卖,用y表示房子的房价,x表示这间房子的不同解释因素,如:面积、位置、采光度、装修等等(影响一间房子的价格绝不仅仅是面积的大小,因此这样的解释是合理的)。

  那么,我们就要列举出一个能够综合评判房屋价格的一个数学模型,通过不同维度的计量,从而得到一个能够较全面衡量一间房屋综合价值的数值(类似于国民GDP)。

  由此,我们便引入了多元线性回归模型,为了便于观察,我们还引入了基于矩阵运算的模型分析。

三、多元线性回归模型

模型引入:

  通常情况下,一般的多元回归模型写法很多,例如:

  这样写太过于繁杂,并且在实际求解的过程中并不能简化我们的运算。为此,引入矩阵运算。

  假定x的矩阵为:X=,对应的θ的矩阵为:θ=

  在X中添加一个列向量1,得到:X=

  通过矩阵运算,可以将hθ(x)=

推导损失函数:

  

运用梯度下降:

四、鸢尾花数据集

 Iris 鸢尾花数据集内包含 3 类,分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这 4 个特征预测鸢尾花卉属于哪一品种。 这是本文章所使用的鸢尾花数据集: sl:花萼长度 sw:花萼宽度 pl:花瓣长度 pw:花瓣宽度; type:类别:(Iris-setosaIris-versicolorIris-virginica 三类)

  部分展示:

代码:

  1. import pandas as pd
  2. import numpy as np
  3. import time
  4. import random
  5. def MGD_train(X, y, alpha=0.0001, maxIter=1000, theta_old=None):
  6. '''
  7. MGD训练线性回归
  8. 传入:
  9. X : 已知数据
  10. y : 标签
  11. alpha : 学习率
  12. maxIter : 总迭代次数
  13. 返回:
  14. theta : 权重参数
  15. '''
  16. # 初始化权重参数
  17. theta = np.ones(shape=(X.shape[1],))
  18. if not theta_old is None:
  19. # 假装是断点续训练
  20. theta = theta_old.copy()
  21. # axis=1 表示横轴,方向从左到右;axis=0 表示纵轴,方向从上到下
  22. for i in range(maxIter):
  23. # 预测
  24. y_pred = np.sum(X * theta, axis=1)
  25. # 全部数据得到的梯度
  26. gradient = np.average((y - y_pred).reshape(-1, 1) * X, axis=0)
  27. # 更新学习率
  28. theta += alpha * gradient
  29. return theta
  30. def SGD_train(X, y, alpha=0.0001, maxIter=1000, theta_old=None):
  31. '''
  32. SGD训练线性回归
  33. 传入:
  34. X : 已知数据
  35. y : 标签
  36. alpha : 学习率
  37. maxIter : 总迭代次数
  38. 返回:
  39. theta : 权重参数
  40. '''
  41. # 初始化权重参数
  42. theta = np.ones(shape=(X.shape[1],))
  43. if not theta_old is None:
  44. # 假装是断点续训练
  45. theta = theta_old.copy()
  46. # 数据数量
  47. data_length = X.shape[0]
  48. for i in range(maxIter):
  49. # 随机选择一个数据
  50. index = np.random.randint(0, data_length)
  51. # 预测
  52. y_pred = np.sum(X[index, :] * theta)
  53. # 一条数据得到的梯度
  54. gradient = (y[index] - y_pred) * X[index, :]
  55. # 更新学习率
  56. theta += alpha * gradient
  57. return theta
  58. def MBGD_train(X, y, alpha=0.0001, maxIter=1000, batch_size=10, theta_old=None):
  59. '''
  60. MBGD训练线性回归
  61. 传入:
  62. X : 已知数据
  63. y : 标签
  64. alpha : 学习率
  65. maxIter : 总迭代次数
  66. batch_size : 没一轮喂入的数据数
  1. 返回:
  2. theta : 权重参数
  3. '''
  4. # 初始化权重参数
  5. theta = np.ones(shape=(X.shape[1],))
  6. if not theta_old is None:
  7. # 假装是断点续训练
  8. theta = theta_old.copy()
  9. # 所有数据的集合
  10. all_data = np.concatenate([X, y.reshape(-1, 1)], axis=1)
  11. for i in range(maxIter):
  12. # 从全部数据里选 batch_size 个 item
  13. X_batch_size = np.array(random.choices(all_data, k=batch_size))
  14. # 重新给 X, y 赋值
  15. X_new = X_batch_size[:, :-1]
  16. y_new = X_batch_size[:, -1]
  17. # 将数据喂入,更新 theta
  18. theta = MGD_train(X_new, y_new, alpha=0.0001, maxIter=1, theta_old=theta)
  19. return theta
  20. def GD_predict(X, theta):
  21. '''
  22. 用于预测的函数
  23. 传入:
  24. X : 数据
  25. theta : 权重
  26. 返回:
  27. y_pred: 预测向量
  28. '''
  29. y_pred = np.sum(theta * X, axis=1)
  30. # 实数域空间 -> 离散三值空间,则需要四舍五入
  31. y_pred = (y_pred + 0.5).astype(int)
  32. return y_pred
  33. def calc_accuracy(y, y_pred):
  34. '''
  35. 计算准确率
  36. 传入:
  37. y : 标签
  38. y_pred : 预测值
  39. 返回:
  40. accuracy : 准确率
  41. '''
  42. return np.average(y == y_pred) * 100
  43. # 读取数据
  44. iris_raw_data = pd.read_csv('iris.data', names =['sepal length', 'sepal width', 'petal length', 'petal width', 'class'])
  45. # 将三种类型映射成整数
  46. Iris_dir = {'Iris-setosa': 1, 'Iris-versicolor': 2, 'Iris-virginica': 3}
  47. iris_raw_data['class'] = iris_raw_data['class'].apply(lambda x:Iris_dir[x])
  48. # 训练数据 X
  49. iris_data = iris_raw_data.values[:, :-1]
  50. # 标签 y
  51. y = iris_raw_data.values[:, -1]
  52. # 用 MGD 训练的参数
  53. start = time.time()
  54. theta_MGD = MGD_train(iris_data, y)
  55. run_time = time.time() - start
  56. y_pred_MGD = GD_predict(iris_data, theta_MGD)
  57. print("MGD训练1000轮得到的准确率{:.2f}% 运行时间是{:.2f}s".format(calc_accuracy(y, y_pred_MGD), run_time))
  58. # 用 SGD 训练的参数
  59. start = time.time()
  60. theta_SGD = SGD_train(iris_data, y)
  61. run_time = time.time() - start
  62. y_pred_SGD = GD_predict(iris_data, theta_SGD)
  63. print("SGD训练1000轮得到的准确率{:.2f}% 运行时间是{:.2f}s".format(calc_accuracy(y, y_pred_SGD), run_time))
  64. # 用 MBGD 训练的参数
  65. start = time.time()
  66. theta_MBGD = MBGD_train(iris_data, y)
  67. run_time = time.time() - start
  68. y_pred_MBGD = GD_predict(iris_data, theta_MBGD)
  69. print("MBGD训练1000轮得到的准确率{:.2f}% 运行时间是{:.2f}s".format(calc_accuracy(y, y_pred_MBGD), run_time))

结果:

原文链接:https://blog.csdn.net/qq_61520110/article/details/125478514



所属网站分类: 技术文章 > 博客

作者:从新来过

链接:https://www.pythonheidong.com/blog/article/1760226/5d8efc0750bce467a838/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)