【机器学习】实战系列二——梯度下降求解线性回归方程

系列文章目录

学习笔记:
【机器学习】第一章——机器学习分类和性能度量
【机器学习】第二章——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版权协议,转载请附上原文出处链接和本声明。