当前位置:   article > 正文

吴恩达机器学习课后作业Python实现(一):线性回归_python单变量线性回归定义损失函数

python单变量线性回归定义损失函数

目录

前言

单变量线性回归

代码实现

数据集准备

代价函数

梯度下降

跑模型并预测

绘制线性模型及代价函数图

 多元线性回归

代码实现

结果图


前言

        写本篇文章的主要目的是记录自己机器学习与Python的学习历程,

单变量线性回归

       在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。 您希望通过使用这些数据来帮助您扩展到下一个城市;

代码实现

数据集准备

  • 导入库
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
'
运行
  • 导入数据并且展示
  1. # 数据路径
  2. path = r'E:\Code\ML\ml_learning\ex1\ex1data1.txt'
  3. # 读取数据
  4. # names 添加列明,分别是人口,利润
  5. # header 指定第几行作为列名
  6. data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
  7. # 读取数据中的前五项数据,head()内不写时默认5,若输入4,则输出4行,9则输出9行数据,-1输出至倒数第二行数据,-11输出至倒数第12行数据
  8. print(data.head())
  9. # 统计汇总数据的信息,如平均值,标准差, 最小值,最大值等
  10. print(data.describe())

  •  数据可视化
  1. # 将数据可视化
  2. # kind设置图标类型,scatter为散点图
  3. # x,y为坐标轴标题
  4. # figsize为打开窗口大小
  5. # title为图标标题
  6. data.plot(kind='scatter', x='Population', y='Profit', figsize=(12, 8), title='data')
  7. plt.show()

  •  数据集处理 
  1. # 加入第一列,全为1,x0 = 1
  2. data.insert(0, 'ones', 1)
  3. # 获取数据列数
  4. cols = data.shape[1]
  5. # iloc根据位置索引选取数据, 先行后列,选取前两列作为输入向量
  6. x = data.iloc[:, 0:cols - 1]
  7. # 最后一列作为目标向量
  8. y = data.iloc[:, cols - 1:cols]
  9. # print(x.head())
  10. # print(y.head())
  11. # 转化为矩阵
  12. X = np.matrix(x.values)
  13. y = np.matrix(y.values)
  14. theta = np.matrix([0, 0]) # 初始参数设为0

代价函数

  • 公式

J\left ( \theta \right ) = \frac{1}{2m}\sum_{i=1}^{m}\left (h _{\theta } \left ( x^{\left ( i \right )} \right )-y^{\left ( i \right )}\right )^{2}

        其中 :h_{\theta }\left ( \theta \right )=\theta ^{T}X = \theta_{0}x_{0}+\theta_{1}x_{1}+...+\theta_{n}x_{n}       

  1. def computeCost(X, y, theta):
  2. '''
  3. 作用:计算代价函数,向量化
  4. :param X: 输入矩阵
  5. :param y: 输出目标
  6. :param theta: parameters参数
  7. :return:
  8. '''
  9. inner = np.power(((X * theta.T) - y), 2)
  10. return np.sum(inner) / (2 * len(X))
'
运行

        当 \theta _{0} 和 \theta_{1} = 0时,代价函数的初始值应为32.072733877455676

梯度下降

  • 公式

\theta_{j} = \theta_{j} - \alpha\frac{\partial }{\partial\theta_{j} }J(\theta )

\theta_{j} = \theta_{j} - \alpha \frac{1}{m}\sum_{i=1}^{m}\left ( h_{\theta}(x^{(i)})-y^{(i)}\right )x^{(i)}_{j}

        在这里我们使用向量化的形式来更新θ,可以大大提高效率

  1. def gradientDescent(X, y, theta, alpha, epoch):
  2. '''
  3. 作用: 梯度下降,获取最终theta值以及cost
  4. :param X: 输入矩阵
  5. :param y: 输出目标
  6. :param theta: 参数
  7. :param alpha: 学习率
  8. :param epoch: 迭代次数
  9. :return:
  10. '''
  11. # 初始化一个临时矩阵存临时参数
  12. temp_theta = np.matrix(np.zeros(theta.shape))
  13. # 获得参数的个数
  14. parameters_num = int(theta.flatten().shape[1])
  15. # 样本个数
  16. m = X.shape[0]
  17. # 获得每一轮训练的cost
  18. cost = np.zeros(epoch)
  19. # 记录每一轮的theta
  20. counterTheta = np.zeros((epoch, 2))
  21. for i in range(epoch):
  22. '''
  23. 利用向量化计算,大大提高效率
  24. (97,2)*(2,1)->(97,1)->(1,97)*(97,2)=(1,2)
  25. '''
  26. temp_theta = theta - (alpha / m) * (X * theta.T - y).T * X
  27. theta = temp_theta # 更新梯度
  28. counterTheta[i] = theta # 记录每一次的theta
  29. cost[i] = computeCost(X, y, theta) # 计算J(theta)并保存
  30. return counterTheta, theta, cost
'
运行

跑模型并预测

        在这里学习率设置为0.01,训练次数设置为3800次

  1. # 学习率
  2. alpha = 0.01
  3. # 训练次数
  4. epoch = 3800
  5. # 调用先前定义的两个函数
  6. counterTheta, final_theta, cost = gradientDescent(X, y, theta, alpha, epoch)
  7. computeCost(X, y, final_theta)
  8. # 预测35000和70000城市规模的小吃摊利润
  9. predict1 = [1, 3.5] * final_theta.T
  10. print("predict1:", predict1)
  11. predict2 = [1, 7] * final_theta.T
  12. print("predict2:", predict2)

        得到预测如下

predict1: [[0.28255134]]

predict2: [[4.45669707]]

绘制线性模型及代价函数图

  1. # np.linspace()
  2. # 返回在区间[`start`,`stop`]中计算出的num个均匀间隔的样本
  3. x = np.linspace(start=data.Population.min(), stop=data.Population.max(), num=100) # xlabel横坐标
  4. h = final_theta[0, 0] + final_theta[0, 1] * x # ylabel profit
  5. figure, ax = plt.subplots(nrows=1, ncols=2)
  6. # 线性回归图
  7. ax[0].plot(x, h, 'r', label='Prediction')
  8. ax[0].scatter(data.Population, data.Profit, label='Training Data')
  9. ax[0].legend(loc=2)
  10. ax[0].set_xlabel('Population')
  11. ax[0].set_ylabel('Profit')
  12. ax[0].set_title('Predicted Profit vs. Population Size')
  13. # 损失函数图
  14. ax[1].plot(np.arange(epoch), cost, 'r')
  15. ax[1].set_xlabel('Iteration')
  16. ax[1].set_ylabel('Cost')
  17. ax[1].set_title('Error vs. Training Epoch')
  18. plt.show()

        得到拟合数据图和代价图如下,可知拟合程度比较好。


多元线性回归

        这里使用的数据是ex1data2,是多维数据,其中有2个变量(房子的大小,卧室的数量)1个目标(房子的价格),这里的代码与单变量线性回归的代码大同小异,由于特征值之间差距过大,故在预处理的时候我们需要将特征值归一化,以便使得模型更快的收敛。

        下面直接放代码和结果图

代码实现

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. '''
  5. 多变量线性回归
  6. '''
  7. # 数据路径
  8. path = r'E:\Code\ML\ml_learning\ex1\ex1data2.txt'
  9. # 读取数据
  10. # names 添加列明,分别是面积 数量 价格
  11. # header 指定第几行作为列名
  12. data = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
  13. # 特征归一化
  14. data = (data - data.mean()) / data.std()
  15. # 加入第一列,全为1,x0 = 1
  16. data.insert(0, 'ones', 1)
  17. # 获取数据列数
  18. cols = data.shape[1]
  19. # iloc根据位置索引选取数据, 先行后列,选取前两列作为输入向量
  20. x = data.iloc[:, 0:cols - 1]
  21. # 最后一列作为目标向量
  22. y = data.iloc[:, cols - 1:cols]
  23. # 转化为矩阵
  24. X = np.matrix(x.values)
  25. y = np.matrix(y.values)
  26. theta = np.matrix([0, 0, 0]) # 初始参数设为0
  27. '''
  28. 代价函数
  29. '''
  30. def computeCost(X, y, theta):
  31. '''
  32. 作用:计算代价函数,向量化
  33. :param X: 输入矩阵
  34. :param y: 输出目标
  35. :param theta: parameters参数
  36. :return:
  37. '''
  38. inner = np.power(((X * theta.T) - y), 2)
  39. return np.sum(inner) / (2 * len(X))
  40. '''
  41. 梯度下降
  42. '''
  43. def gradientDescent(X, y, theta, alpha, epoch):
  44. '''
  45. 作用: 梯度下降,获取最终theta值以及cost
  46. :param X: 输入矩阵
  47. :param y: 输出目标
  48. :param theta: 参数
  49. :param alpha: 学习率
  50. :param epoch: 迭代次数
  51. :return:
  52. '''
  53. # 初始化一个临时矩阵存临时参数
  54. temp_theta = np.matrix(np.zeros(theta.shape))
  55. # 获得参数的个数
  56. parameters_num = int(theta.flatten().shape[1])
  57. # 样本个数
  58. m = X.shape[0]
  59. # 获得每一轮训练的cost
  60. cost = np.zeros(epoch)
  61. # 记录每一轮的theta
  62. counterTheta = np.zeros((epoch, 3))
  63. for i in range(epoch):
  64. '''
  65. 利用向量化计算,大大提高效率
  66. (97,2)*(2,1)->(97,1)->(1,97)*(97,2)=(1,2)
  67. '''
  68. temp_theta = theta - (alpha / m) * (X * theta.T - y).T * X
  69. theta = temp_theta # 更新梯度
  70. counterTheta[i] = theta # 记录每一次的theta
  71. cost[i] = computeCost(X, y, theta) # 计算J(theta)并保存
  72. return counterTheta, theta, cost
  73. '''
  74. 跑模型,画图
  75. '''
  76. # 学习率
  77. alpha = 0.01
  78. # 训练次数
  79. epoch = 3800
  80. # 调用先前定义的两个函数
  81. counterTheta, final_theta, cost = gradientDescent(X, y, theta, alpha, epoch)
  82. computeCost(X, y, final_theta)
  83. fig2, ax = plt.subplots(figsize=(8, 4))
  84. ax.plot(np.arange(epoch), cost, 'r')
  85. ax.set_xlabel('Iteration')
  86. ax.set_ylabel('Cost')
  87. ax.set_title('Error vs. Training Epoch')
  88. plt.show()

结果图

 参考链接

https://blog.csdn.net/weixin_48577398/article/details/117134767?spm=1001.2014.3001.5502

https://www.heywhale.com/mw/project/5da16a37037db3002d441810

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1003164
推荐阅读
相关标签
  

闽ICP备14008679号