当前位置: 首页 > news >正文

随机梯度下降的代码实现

在单变量线性回归的机器学习代码中,我们讨论了批量梯度下降代码的实现,本篇将进行随机梯度下降的代码实现,整体和批量梯度下降代码类似,仅梯度下降部分不同:

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) ** 2return 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

相关文章:

  • git patch和使用
  • excel数据重复率怎么计算【保姆教程】
  • Linux(20):软件安装:原始码与 Tarball
  • 【Spring Boot】如何在IntelliJ IDEA中由同一份spring boot源码运行多个不同端口的实例
  • 3.4 路由器的DHCP配置
  • 从零开发短视频电商 AWS OpenSearch Service开发环境申请以及Java客户端介绍
  • PHP基础(4)
  • scala表达式
  • 洛谷 P8802 [蓝桥杯 2022 国 B] 出差
  • List截取指定长度(java截取拼接URL)
  • Anaconda建虚拟环境并在jupyter中打开
  • 前端知识库Html5和CSS3
  • ubuntu server 20.04 备份和恢复 系统 LTS
  • 【VRTK】【VR开发】【Unity】11-甩臂移动
  • ​io --- 处理流的核心工具​
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • gf框架之分页模块(五) - 自定义分页
  • Invalidate和postInvalidate的区别
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • php ci框架整合银盛支付
  • React-生命周期杂记
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 仿天猫超市收藏抛物线动画工具库
  • 关于List、List?、ListObject的区别
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 力扣(LeetCode)56
  • 判断客户端类型,Android,iOS,PC
  • 前端面试题总结
  • 前端自动化解决方案
  • 驱动程序原理
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 携程小程序初体验
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 你对linux中grep命令知道多少?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • (20050108)又读《平凡的世界》
  • (MATLAB)第五章-矩阵运算
  • (万字长文)Spring的核心知识尽揽其中
  • (原創) 未来三学期想要修的课 (日記)
  • (正则)提取页面里的img标签
  • (转)树状数组
  • *p++,*(p++),*++p,(*p)++区别?
  • ./configure、make、make install 命令
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .a文件和.so文件
  • .Net 4.0并行库实用性演练
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @TableLogic注解说明,以及对增删改查的影响