在学习了河北工业大学刘老师的课程台湾大学李宏毅老师的课程后,自己在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 还能做的比我好,所以还是要多学习。

 

内容来源于网络如有侵权请私信删除