系列文章目录
学习笔记:
【机器学习】第一章——机器学习分类和性能度量
【机器学习】第二章——EM(期望最大化)算法
【机器学习】第六章——概率无向图模型
实战系列:
【机器学习】实战系列一——波士顿房价预测(一文学会)
【机器学习】实战系列二——梯度下降(一文学会)
【机器学习】实战系列三——支持向量机(一文学会)
【机器学习】实战系列四——聚类实验(一文学会)
【机器学习】实战系列五——天文数据挖掘实验(天池比赛)
文章目录
【注】本文实验环境为Jupyter Notebook
开源
完整代码已开源至github
https://github.com/TommyGong08/BIT-CS-Code/tree/master/Machine_Learning
如果对你有帮助的话,欢迎star和follow~
一、实验简介
本实验使用梯度下降法求解一元线性回归方程y(x,w)=w0+w1*x系数
二、相关理论及知识点
(1)梯度下降法的原理
(2)梯度下降法更新公式的理解,并灵活运用
(3)最小二乘法的理解与应用
二、实验流程
1.导入库
代码如下:
# SGD demo
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
2.设置数据集
代码如下:
X = [55, 71, 68, 87, 101, 87, 75, 78, 93, 73]
Y = [91, 101, 87, 109, 129, 98, 95, 101, 104, 93]
3. 查看原始数据分布
代码如下:
plt.xlabel("X")
plt.ylabel("Y")
plt.plot(X,Y,"ob")
plt.show()
结果如图:
4. 设置相关参数
选取crim , rm, lstat作为特征值, medv作为目标值
# 迭代阀值
epsilon = 0.0001
# 学习率
alpha = 0.00001
# 残差
diff = 0
# 最大迭代次数
max_itor = 5000
# 截距
w0 = 0
# 两次迭代的误差
error1 = 0
error0 = 0
# 迭代次数
iter_time = 0
# 初始化斜率
w1 = 0
error = []
5. 梯度下降法迭代
# 输出特征值的描述性统计
开始迭代
while True:
# 参数迭代计算
for i in range(len(X)):
# 拟合函数为 Y = wo + w1*X
# 计算残差
diff = (w0 + w1 * X[i]) - Y[i]
# 梯度
w0 -= alpha * diff
w1 -= alpha * diff * X[i]
# 计算损失函数
error1 = 0
for i in range(len(X)):
error1 += (Y[i]-(w0 + w1 * X[i]))**2/2
error.append(error1)
iter_time += 1
# 两次迭代之间的误差小于 epsilon 迭代停止
if abs(error1 - error0) < epsilon :
print('-1')
break
elif iter_time > max_itor:
print('-2')
break
else:
error0 = error1
print('w0: ' + str(w0) + ' w1: ' + str(w1) + ' error1: ' + str(error1))
# print(error)
6. 做出 loss 图像
# 做出 loss 函数图像,取前 30 次迭代
error_x = list(range(0,len(error)))
# print(error_x)
plt.plot(error_x[0:30], error[0:30],'.-')
plt.show()

7. 可视化拟合结果
# 做出 y = w0 + w1 *x 图像
y = []
plt.xlabel("X")
plt.ylabel("Y")
plt.plot(X,Y,'^')
for i in range(len(X)):
y.append(w0 + w1 * X[i])
plt.plot(X, y)
plt.show()

8. 最小二乘法拟合
# 最小二乘法拟合
def train(learning_rate, w, b):
dw = np.sum((np.power(X, 2) * w - np.transpose(Y - b) * X))
db = np.sum(Y - (X * w - b))
temp_w = w - learning_rate * dw
temp_b = b - learning_rate * db
w = temp_w
b = temp_b
return w, b
w = np.random.rand(1)
b = np.random.rand(1)
learning_rate = 0.000001
# w, b = train(learning_rate, w, b) # 训练一次
for i in range(1000):
w, b = train(learning_rate, w, b)
y_pred = w * X + b
loss = np.power(y_pred - Y, 2).sum()
9. 做出两种方法的图像
# 同时做出两个图像
plt.scatter(X, Y)
plt.plot(X, y_pred)
plt.plot(X, y)
plt.show()

你的点赞将是对我最大的支持,如果本次这篇博客对你有所帮助,欢迎点赞收藏~
版权声明:本文为weixin_43794327原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。