随机梯度下降的代码实现
2023-12-13 03:41:56
在单变量线性回归的机器学习代码中,我们讨论了批量梯度下降代码的实现,本篇将进行随机梯度下降的代码实现,整体和批量梯度下降代码类似,仅梯度下降部分不同:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import joblib
# 导入数据
path = 'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
# 分离特征和目标变量
X = data.iloc[:, 0:1].values # Population列
y = data.iloc[:, 1].values # Profit列
m = len(y) # 样本数量
# 添加一列全为1的截距项
X = np.append(np.ones((m, 1)), X, axis=1)
# 批量梯度下降参数
alpha = 0.01 # 学习率
iterations = 1500 # 迭代次数
# 随机梯度下降算法
def stochasticGradientDescent(X, y, theta, alpha, num_iters):
m = len(y)
for iter in range(num_iters):
for i in range(m):
# 随机选择一个数据点进行梯度计算
random_index = np.random.randint(0, m)
X_i = X[random_index, :].reshape(1, X.shape[1])
y_i = y[random_index].reshape(1, 1)
# 计算预测值和误差
prediction = np.dot(X_i, theta)
error = prediction - y_i
# 更新参数
theta = theta - (alpha * X_i.T.dot(error)).flatten()
return theta
# 初始化模型参数
theta = np.zeros(2)
"""
随机梯度下降前的损失显示
"""
# 定义损失函数,用于显示调用前后的损失值对比
def computeCost(X, y, theta):
m = len(y)
predictions = X.dot(theta)
square_err = (predictions - y) ** 2
return np.sum(square_err) / (2 * m)
# 计算初始损失
initial_cost = computeCost(X, y, theta)
print("初始的损失值:", initial_cost)
# 使用随机梯度下降进行模型拟合
theta = stochasticGradientDescent(X, y, theta, alpha, iterations)
"""
随机梯度下降后的损失显示
"""
# 计算优化后的损失
final_cost = computeCost(X, y, theta)
print("优化后的损失值:", final_cost)
"""
使用需要预测的数据X进行预测
"""
# 假设的人口数据
population_values = [3.5, 7.0] # 代表35,000和70,000人口
# 对每个人口值进行预测
for pop in population_values:
# 将人口值转换为与训练数据相同的格式(包括截距项)
predict_data = np.matrix([1, pop]) # 添加截距项
# 使用模型进行预测
predict_profit = np.dot(predict_data, theta.T)
print(f"模型预测结果 {pop} : {predict_profit[0,0]}")
"""
使用模型绘制函数
"""
# 创建预测函数
x_values = np.array(X[:, 1])
f = theta[0] * np.ones_like(x_values) + (theta[1] * x_values) # 使用广播机制
# 绘制图表
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(x_values, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Training Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()
"""
保存模型
"""
# 保存模型
joblib.dump(theta, 'linear_regression_model.pkl')
"""
加载模型并执行预测
"""
# 加载模型
loaded_model = joblib.load('linear_regression_model.pkl')
# 假设的人口数据
population_values = [3.5, 7.0] # 代表35,000和70,000人口
# 使用模型进行预测
for pop in population_values:
# 更新预测数据矩阵,包括当前的人口值
predict_data = np.matrix([1, pop])
# 进行预测
predict_value = np.dot(predict_data, loaded_model.T)
print(f"模型预测结果 {pop} : {predict_value[0,0]}")
实际测试下来,同迭代次数情况下随机梯度下降的收敛度远低于批量梯度下降:
初始的损失值: 32.072733877455676
优化后的损失值: 6.037742815925882 批量梯度下降为:4.47802760987997
模型预测结果 3.5 : -0.6151395665038226
模型预测结果 7.0 : 2.9916563373877203
模型预测结果 3.5 : -0.6151395665038226
模型预测结果 7.0 : 2.9916563373877203
即便是将迭代次数增加10倍也无法有效降低太多损失,15000次迭代的结果:
优化后的损失值: 5.620745223253086
个人总结:随机梯度下降估计只有针对超大规模的数据有应用意义。
注:本文为学习吴恩达版本机器学习教程的代码整理,使用的数据集为https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/f2757f85b99a2b800f4c2e3e9ea967d9e17dfbd8/code/ex1-linear%20regression/ex1data1.txt
文章来源:https://blog.csdn.net/eevee_1/article/details/134944009
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!