相关资料
广州大学机器学习与数据挖掘实验一:线性回归
广州大学机器学习与数据挖掘实验二:决策树算法
广州大学机器学习与数据挖掘实验三:图像分类
广州大学机器学习与数据挖掘实验四:Apriori算法
四份实验报告下载链接🔗
一、实验目的
本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握数据挖掘相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对机器学习算法、数据挖掘实现等有比较深入的认识。
1.掌握机器学习中涉及的相关概念、算法。
2.熟悉数据挖掘中的具体编程方法;
3.掌握问题表示、求解及编程实现。
二、基本要求
1.实验前,复习《机器学习与数据挖掘》课程中的有关内容。
2.准备好实验数据。
3.编程要独立完成,程序应加适当的注释。
4.完成实验报告。
三、实验软件
使用Python或R语言实现。
四、实验内容
给定下面两个输入数据,请用线性回归方法找到拟合直线,并画出拟合后的散点图和拟合直线,观察拟合误差。
注意:请用python语言实现线性回归,不要直接调用现有的回归函数。
x=[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
y=[10, 26, 23, 43, 20, 22, 43, 50, 62, 50, 55, 75, 62, 78, 87, 76, 64, 85, 90, 98]
五、实验过程
使用了两种算法进行比较,一个是正规方程(最小二乘法)求解,另其导数为0直接解得最优的w和b,另一种是定义损失函数为均方误差,利用梯度下降进行优化获得局部最优解。
六、实验结果与评估
正规方程:
梯度下降:
选择的方法 | 求解的w | 求解的b | 误差 |
---|---|---|---|
正规方程 | 16.051843 | 11.205488 | 1950.434002 |
梯度下降 | 16.080189 | 11.106575 | 1950.476600 |
评价:
1、可以看到正规方程(最小二乘法)的loss和梯度下降方法所求得的loss接近,但是最小二乘法会比梯度下降求得的loss小一点点,因为正规方程获得的解一定是最优解,而梯度下降求得的只是局部最优解。
2、正规方程在单变量线性回归表现良好,但当维度上升时,正规方程的计算难度会愈加复杂,不一定可解;但由于梯度下降是一种优化算法,它总能求得局部最小值,甚至有可能逼近全局最小值。
3、下面贴上两种方法的一个比较,来源于吴恩达机器学习课程。
七、实验代码
import numpy as np
import matplotlib.pyplot as plt
x = [0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 1.75, 2.00, 2.25, 2.50, 2.75, 3.00, 3.25, 3.50, 4.00, 4.25, 4.50, 4.75, 5.00,
5.50]
y = [10, 26, 23, 43, 20, 22, 43, 50, 62, 50, 55, 75, 62, 78, 87, 76, 64, 85, 90, 98]
X = np.array(x)
Y = np.array(y)
第一种方法,导数为0,直接求解
x_mean = np.mean(X)
y_mean = np.mean(Y)
num = np.sum((X - x_mean) * (Y - y_mean))
d = np.sum((X - x_mean) ** 2)
w = num / d
b = y_mean - w * x_mean
y_pred = w * X + b
plt.scatter(X, Y)
plt.plot(X, y_pred, color='r')
plt.show()
loss = np.power(y_pred - Y, 2).sum()
print('w为 %f' % w)
print('b为 %f' % b)
print('误差为 %f' % loss)
第二种方法,梯度下降优化
def train(lr, w, b): # 训练阶段,lr为学习率,w、b为求解参数
dw = -2 * (np.sum((Y - w * X - b) * X))
db = -2 * (np.sum((Y - w * X - b)))
w = w - learning_rate * dw
b = b - learning_rate * db
return w, b
w = np.random.rand(1) # 随机初始化
b = np.random.rand(1)
learning_rate = 0.00005
for i in range(10000):
w, b = train(learning_rate, w, b)
y_pred = w * X + b
loss = np.power(y_pred - Y, 2).sum()
plt.scatter(X, Y)
plt.plot(X, y_pred, color='r')
plt.show()
print('w为 %f' % w)
print('b为 %f' % b)
print('误差为 %f' % loss)