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

量化交易 - Stochastic Gradient Descent Regression (SGDRegressor) 随机梯度下降回归 - 机器学习

目录

一、构造数据及SGDRegressor拟合

二、还原参数


一、构造数据及SGDRegressor拟合

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler# 1. 造数据 build data
x = np.linspace(-5, 50, 100)
# y = β1 + β1 * x + ε
y = 50 + 2 * x + np.random.normal(0, 20, size=len(x))
data = pd.DataFrame({'X': x, 'Y': y})# 2. 画图 plot data
ax = data.plot.scatter(x='X', y='Y', figsize=(14, 6))
sns.despine()
plt.tight_layout()
plt.show()# 3. 标准化 standardize data
scaler = StandardScaler()
X_ = scaler.fit_transform(data[['X']])# 4. 训练 train model
# Scikit-learn <=1.2: squared_loss;  Scikit-learn >=1.3: squared_error
sgd = SGDRegressor(loss='squared_error',  fit_intercept=True,shuffle=True,random_state=42,learning_rate='invscaling',eta0=0.01,power_t=0.25)sgd.fit(X_, data['Y'].values)# 5. 预测并画图 predict and plot
# x_plot = np.linspace(-5, 50, 300).reshape(-1, 1)
x_plot = x.reshape(-1, 1)
x_plot_scaled = scaler.transform(x_plot)
y_pred = sgd.predict(x_plot_scaled)plt.figure(figsize=(14, 6))
plt.scatter(data['X'], data['Y'], label='raw')
plt.plot(x_plot, y_pred, color='red', label='SGD fit')
sns.despine()
plt.legend()
plt.show()# 6. 参数  get model parameters
print("coef (scaled):", sgd.coef_[0])
print("intercept:", sgd.intercept_)

针对SGDRegressor的解释:

sgd = SGDRegressor(loss='squared_loss',      # 使用平方误差损失(即普通线性回归)fit_intercept=True,       # 是否拟合截距项(bias)shuffle=True,             # 每次epoch前打乱样本顺序random_state=42,          # 保证结果可复现learning_rate='invscaling',  # 学习率随时间递减:eta = eta0 / (t^power_t)eta0=0.01,                # 初始学习率power_t=0.25              # 控制学习率下降速度
)

同时注意:Scikit-learn <=1.2: squared_loss; Scikit-learn >=1.3: squared_error

使用squared_loss或者squared_error其实就是OLS,线性回归。

另外,使用SGDRegressor的话,需要先对数据进行标准化处理,再进行训练拟合。

原始数据:

拟合曲线

coef (scaled): 31.146794886625532

intercept: [95.63400611]

可以发现,是不同于原始参数的,所以我们需要还原

二、还原参数

推导过程

所以,

用代码计算:

μ = scaler.mean_[0]      # 均值             mean
σ = scaler.scale_[0]     # 标准差           standard deviation (std)
std_β1 = sgd.coef_[0]         # 标准化后的斜率    coefficient (slope)
std_β0 = sgd.intercept_       # 标准化后的截距    interceptβ1 = std_β1 / σ
β0 = std_β0 - std_β1 * μ / σprint("β1:", β1)
print("β0:", β0)

β1: 1.9422190378960196

β0: [51.93407775]

这样和原始数据就很接近了。

参考并改进:

# Reference: https://github.com/stefan-jansen/machine-learning-for-trading/blob/main/07_linear_models/01_linear_regression_intro.ipynb

http://www.dtcms.com/a/391008.html

相关文章:

  • AWS WAF防护IoT设备劫持攻击:智能设备安全防护实践
  • 分享mysql数据库自动备份脚本(本机和docker都可用)
  • avue crud表头跨列
  • 鸿蒙网络优化实战:从智能切换到缓存加速的完整指南
  • Redis-实现分布式锁
  • 软件工程实践五:Spring Boot 接口拦截与 API 监控、流量控制
  • 【LINUX网络】NAT _ 代理_ 内网穿透
  • 智慧养老+数字大健康:当科技为“银发时代”按下温暖加速键
  • rook-ceph的ssd类osd的纠删码rgw存储池在迁移时的异常处理
  • Http升级Https使用Certbot申请证书并免费续期
  • scTenifoldKnk:“虚拟敲除基因”,查看转录组其他基因的变化幅度(升高or降低)
  • 牛客算法基础noob47 校门外的树
  • AD-GS:稀疏视角 3D Gaussian Splatting 的“交替致密化”,同时抑制浮游物与保留细节
  • maven package多出来一个xxx.jar.original和一个xxx-shaded.jar是什么?怎么去掉
  • Gin 框架中使用 Validator 进行参数校验的完整指南
  • apt install nvidia-cuda-toolkit后cuda不在/usr/local/cuda怎么办
  • SpringBoot整合Kafka总结
  • Parasoft C/C++test 针对 CMake 项目的自动化测试配置
  • LED强光手电筒MCU控制方案开发分析
  • linux中为什么 rm 命令能删除自己 | linux使用rm命令删自己会怎样?
  • django登录注册案例(下)
  • 【TES600G】基于JFM7K325T FPGA+FT-M6678 DSP的全国产化信号处理平台
  • 卷积神经网络深度解析:从基础原理到实战应用的完整指南
  • 企业档案管理系统:精准破局制造行业档案管理困境
  • 【完整源码+数据集+部署教程】考古坑洞私挖盗洞图像分割系统: yolov8-seg-act
  • MMDB详解
  • TC8:SOMEIP_ETS_130测试用例解析
  • 等效学习率翻倍?梯度累积三连坑:未除以 accum_steps、调度器步进错位、梯度裁剪/正则标度错误(含可复现实验与修复模板)
  • 嵌入式学习笔记(44)IMX6ULL
  • OpenStack 学习笔记(五):网络管理和虚拟网络实践与存储管理实验(下)