广州大学机器学习与数据挖掘实验一:线性回归

相关资料

广州大学机器学习与数据挖掘实验一:线性回归
广州大学机器学习与数据挖掘实验二:决策树算法
广州大学机器学习与数据挖掘实验三:图像分类
广州大学机器学习与数据挖掘实验四: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.05184311.2054881950.434002
梯度下降16.08018911.1065751950.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)
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wujiekd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值