在学习了河北工业大学刘老师的课程与台湾大学李宏毅老师的课程后,自己在kaggle 找了一个简单的随机线性回归的数据集来实践:https://www.kaggle.com/andonians/random-linear-regression
使用的是MSE(均方误差)作为损失函数,看着好像是最小二乘法,但是为什么不叫最小二乘法,在周志华老师的《机器学习》一书中有提到:基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。
import numpy as np # 使用 Axes3D 的必要操作 import matplotlib.pyplot as plt figure = plt.figure() # ax = Axes3D(figure) ax = figure.gca(projection="3d") # 从文件读取数据 file = open('archive/test.csv') file.readline() # 读取第一行x,y x_data = [] y_data = [] while True: text = file.readline() if not text: break data = text.split(',') x_data.append(float(data[0])) # 因为有'n'所以要删掉才能转换为浮点数 y_data.append(float(data[1].rstrip('n'))) file.close() W = np.arange(0.5, 1.5, 0.01) # bias只会影响图像的平移 B = np.arange(-2.0, 2.0, 0.1) [w, b] = np.meshgrid(W, B) # y = x-0.08 def forward(x): return x * w + b def loss(x, y): y_pred = forward(x) return (y_pred - y) * (y_pred - y) # 损失求和 l_sum = 0 for x_val, y_val in zip(x_data, y_data): l_sum += loss(x_val, y_val) # 画 Surface3d:https://matplotlib.org/stable/tutorials/toolkits/mplot3d.html#surface-plots ax.plot_surface(w, b, l_sum / len(x_data), cmap="rainbow") plt.xlabel('w') plt.ylabel('b') plt.show()
输出图像:
代码中有几个需要注意的地方:
1、b 也就是bias 只会影响图像的上下平移,并不会影响拟合,所以这里不用加b ,直接找w 与loss 的关系即可。
2、读取数据时要注意数据的格式,下载的训练数据集train.csv 第215 行x 与y 中间没有',' 分隔,导致读取的时候总是报错。
代码中也有许多问题:
1、读取文件的方式略微有点简陋,无伤大雅但是看到kaggle 上有前辈使用pandas 读取csv 文件只需要短短几行就可以将数据集读取出来,我还远远不足,需要勤加学习。
2、这个代码是人工找出最好的拟合函数,暂时还不会如何训练出模型然后拟合测试集,需要勤加学习。
3、对python 语言还不够熟练,不太看得懂文档,画图的时候参考了前辈的文章:https://blog.csdn.net/weixin_44841652/article/details/105017087。
总结:
尽管可以使用代码实现简单的线性回归,但是只是最基础的,把数据输入excel 也可以做出来的线性回归,甚至excel 还能做的比我好,所以还是要多学习。
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!