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

机器学习---梯度下降代码

1. 归一化

# Read data from csv
pga = pd.read_csv("pga.csv")
print(type(pga))print(pga.head())

# Normalize the data 归一化值 (x - mean) / (std)
pga.distance = (pga.distance - pga.distance.mean()) / pga.distance.std()
pga.accuracy = (pga.accuracy - pga.accuracy.mean()) / pga.accuracy.std()
print(pga.head())

plt.scatter(pga.distance, pga.accuracy)
plt.xlabel('normalized distance')
plt.ylabel('normalized accuracy')
plt.show()

2. 线性回归 

from sklearn.linear_model import LinearRegression
import numpy as np# We can add a dimension to an array by using np.newaxis
print("Shape of the series:", pga.distance.shape)
print("Shape with newaxis:", pga.distance[:, np.newaxis].shape)# The X variable in LinearRegression.fit() must have 2 dimensions
lm = LinearRegression()
lm.fit(pga.distance[:, np.newaxis], pga.accuracy)
theta1 = lm.coef_[0]
print (theta1)

       这段代码是一个示例,展示了如何使用np.newaxisLinearRegression来进行线性回归。

       首先,通过np.newaxis将一维数组pga.distance添加一个新的维度,从而将其转换为二维数

组。通过打印数组的形状,可以看到在添加np.newaxis之前,pga.distance是一个一维数组,形状

(n,),而添加了np.newaxis之后,形状变为(n, 1)

       然后,创建了一个LinearRegression的实例lm。使用lm.fit()方法,将转换后的特征数据

pga.distance[:, np.newaxis]和目标数据pga.accuracy作为参数,对线性回归模型进行训练拟

合。

       最后,通过lm.coef_获取训练后的模型系数(权重),并将第一个特征的系数赋值给变量

theta1pga.distancepga.accuracy是示例数据,你需要根据实际情况替换为你自己的数据。

3. 代价函数

# The cost function of a single variable linear model# The c 
# 单变量 代价函数
def cost(theta0, theta1, x, y):# Initialize costJ = 0# The number of observationsm = len(x)# Loop through each observation# 通过每次观察进行循环for i in range(m):# Compute the hypothesis # 计算假设h = theta1 * x[i] + theta0# Add to costJ += (h - y[i])**2# Average and normalize costJ /= (2*m)return J# The cost for theta0=0 and theta1=1
print(cost(0, 1, pga.distance, pga.accuracy))theta0 = 100
theta1s = np.linspace(-3,2,100)
costs = []
for theta1 in theta1s:costs.append(cost(theta0, theta1, pga.distance, pga.accuracy))plt.plot(theta1s, costs)
plt.show()

       一个简单的单变量线性回归模型的代价函数实现,并且计算了在给定一组参数theta0theta1

的情况下的代价。在这段代码中,cost()函数接受四个参数:theta0theta1是线性模型的参数,

x是输入特征,y是目标变量。函数的目标是计算模型的代价。

       首先,初始化代价J为0。然后,通过循环遍历每个观察值,计算模型的预测值h。代价J通过累

加每个观察值的误差平方来计算。最后,将代价J除以观察值的数量的两倍,以平均和归一化代

价。在这段代码的后半部分,使用一个给定的theta0值和一组theta1值,计算每个theta1对应的代

价,并将结果存储在costs列表中。然后,使用plt.plot()theta1scosts进行绘制,显示出代

价函数随着theta1的变化而变化的趋势。

4. 绘制三维图

import numpy as np
from mpl_toolkits.mplot3d import Axes3D# Example of a Surface Plot using Matplotlib
# Create x an y variables
x = np.linspace(-10,10,100)
y = np.linspace(-10,10,100)# We must create variables to represent each possible pair of points in x and y
# ie. (-10, 10), (-10, -9.8), ... (0, 0), ... ,(10, 9.8), (10,9.8)
# x and y need to be transformed to 100x100 matrices to represent these coordinates
# np.meshgrid will build a coordinate matrices of x and y
X, Y = np.meshgrid(x,y)
#print(X[:5,:5],"\n",Y[:5,:5])# Compute a 3D parabola 
Z = X**2 + Y**2 # Open a figure to place the plot on
fig = plt.figure()
# Initialize 3D plot
ax = fig.gca(projection='3d')
# Plot the surface
ax.plot_surface(X=X,Y=Y,Z=Z)plt.show()# Use these for your excerise 
theta0s = np.linspace(-2,2,100)
theta1s = np.linspace(-2,2, 100)
COST = np.empty(shape=(100,100))
# Meshgrid for paramaters 
T0S, T1S = np.meshgrid(theta0s, theta1s)
# for each parameter combination compute the cost
for i in range(100):for j in range(100):COST[i,j] = cost(T0S[0,i], T1S[j,0], pga.distance, pga.accuracy)# make 3d plot
fig2 = plt.figure()
ax = fig2.gca(projection='3d')
ax.plot_surface(X=T0S,Y=T1S,Z=COST)
plt.show()

 

       使用Matplotlib绘制三维图形,包括一个二次曲面图和一个代价函数的图。

       首先,通过使用np.linspace()函数,创建了从-10到10的等间距的100个点,分别赋值给变量

xy

       接下来,使用np.meshgrid()函数将xy转换为100x100的网格矩阵,分别赋值给XY。这

样,XY矩阵中的每个元素表示一个(x, y)坐标对。

       然后,根据二次曲面方程Z = X**2 + Y**2计算出Z矩阵,其中Z矩阵中的每个元素表示对应坐

标点的高度。

       通过plt.figure()创建一个新的图形,并通过fig.gca(projection='3d')初始化一个三维图形

的坐标系。使用ax.plot_surface()函数绘制曲面图,其中XYZ分别表示X、Y和Z矩阵。

       最后,使用plt.show()显示图形。

       在后半部分的代码中,首先创建了两个包含100个均匀分布数值的数组theta0stheta1s,分

别表示theta0和theta1的取值范围。

       接下来,使用np.empty()创建一个空的100x100的数组COST,用于存储代价函数的计算结果。

通过使用np.meshgrid()函数,将theta0stheta1s转换为网格矩阵T0ST1S

       然后,通过两个嵌套的循环遍历所有可能的参数组合,并使用cost()函数计算每个参数组合对

应的代价,并将结果存储在COST数组中。

       最后,使用plt.figure()创建一个新的图形,并通过fig.gca(projection='3d')初始化一个三

维图形的坐标系。使用ax.plot_surface()函数绘制代价函数的曲面图,其中XYZ分别表示

T0ST1SCOST矩阵。使用plt.show()显示图形。

5. 求导函数

线性回归模型的偏导数公式可以通过最小化代价函数推导得到。以下是推导过程:

线性回归模型假设函数为:h(x) = theta0 + theta1 * x

代价函数为均方差函数(Mean Squared Error):J(theta0, theta1) = (1/2m) * Σ(h(x) - y)^2

其中,m 是样本数量,h(x) 是模型的预测值,y 是观测值。

为了求解最优的模型参数 theta0 和 theta1,我们需要计算代价函数对这两个参数的偏导数。

首先,计算代价函数对 theta0 的偏导数:

∂J/∂theta0 = (1/m) * Σ(h(x) - y)

然后,计算代价函数对 theta1 的偏导数:

∂J/∂theta1 = (1/m) * Σ(h(x) - y) * x


# 对 theta1 进行求导# 对 thet 
def partial_cost_theta1(theta0, theta1, x, y):# Hypothesish = theta0 + theta1*x# Hypothesis minus observed times xdiff = (h - y) * x# Average to compute partial derivativepartial = diff.sum() / (x.shape[0])return partialpartial1 = partial_cost_theta1(0, 5, pga.distance, pga.accuracy)
print("partial1 =", partial1)# 对theta0 进行求导
# Partial derivative of cost in terms of theta0
def partial_cost_theta0(theta0, theta1, x, y):# Hypothesish = theta0 + theta1*x# Difference between hypothesis and observationdiff = (h - y)# Compute partial derivativepartial = diff.sum() / (x.shape[0])return partialpartial0 = partial_cost_theta0(1, 1, pga.distance, pga.accuracy)
print("partial0 =", partial0)

       计算代价函数对参数theta1theta0的偏导数。

       首先,定义了一个名为partial_cost_theta1()的函数,接受四个参数:theta0theta1是线

性模型的参数,x是输入特征,y是目标变量。这个函数用于计算代价函数对theta1的偏导数。在函

数内部,首先计算假设值h,然后计算(h-y)*x,得到假设值与观察值之间的差异乘以输入特征x

最后,将这些差异的和除以输入特征的数量,得到对theta1的偏导数。然后,通过调用

partial_cost_theta1()函数并传入参数05,计算出对应的偏导数partial1

        接下来,定义了一个名为partial_cost_theta0()的函数,接受四个参数:theta0

theta1是线性模型的参数,x是输入特征,y是目标变量。这个函数用于计算代价函数对theta0的偏

导数。在函数内部,首先计算假设值h,然后计算假设值与观察值之间的差异。最后,将这些差异

的和除以输入特征的数量,得到对theta0的偏导数。然后,通过调用partial_cost_theta0()函数

并传入参数11,计算出对应的偏导数partial0

6. 梯度下降

# x is our feature vector -- distance
# y is our target variable -- accuracy
# alpha is the learning rate
# theta0 is the intial theta0 
# theta1 is the intial theta1
def gradient_descent(x, y, alpha=0.1, theta0=0, theta1=0):max_epochs = 1000 # Maximum number of iterations 最大迭代次数counter = 0       # Intialize a counter 当前第几次c = cost(theta1, theta0, pga.distance, pga.accuracy)  ## Initial cost 当前代价函数costs = [c]     # Lets store each update 每次损失值都记录下来# Set a convergence threshold to find where the cost function in minimized# When the difference between the previous cost and current cost #        is less than this value we will say the parameters converged# 设置一个收敛的阈值 (两次迭代目标函数值相差没有相差多少,就可以停止了)convergence_thres = 0.000001  cprev = c + 10   theta0s = [theta0]theta1s = [theta1]# When the costs converge or we hit a large number of iterations will we stop updating# 两次间隔迭代目标函数值相差没有相差多少(说明可以停止了)while (np.abs(cprev - c) > convergence_thres) and (counter < max_epochs):cprev = c# Alpha times the partial deriviative is our updated# 先求导, 导数相当于步长update0 = alpha * partial_cost_theta0(theta0, theta1, x, y)update1 = alpha * partial_cost_theta1(theta0, theta1, x, y)# Update theta0 and theta1 at the same time# We want to compute the slopes at the same set of hypothesised parameters#             so we update after finding the partial derivatives# -= 梯度下降,+=梯度上升theta0 -= update0theta1 -= update1# Store thetastheta0s.append(theta0)theta1s.append(theta1)# Compute the new cost# 当前迭代之后,参数发生更新  c = cost(theta0, theta1, pga.distance, pga.accuracy)# Store updates,可以进行保存当前代价值costs.append(c)counter += 1   # Count# 将当前的theta0, theta1, costs值都返回去return {'theta0': theta0, 'theta1': theta1, "costs": costs}print("Theta0 =", gradient_descent(pga.distance, pga.accuracy)['theta0'])
print("Theta1 =", gradient_descent(pga.distance, pga.accuracy)['theta1'])
print("costs =", gradient_descent(pga.distance, pga.accuracy)['costs'])descend = gradient_descent(pga.distance, pga.accuracy, alpha=.01)
plt.scatter(range(len(descend["costs"])), descend["costs"])
plt.show()

 

       使用梯度下降法求解线性回归模型中的偏导数以及更新参数的过程。其中,gradient_descent

函数接受输入特征 x 和观测值 y,以及学习率 alpha、初始参数 theta0 和 theta1。在函数中,设

置了最大迭代次数 max_epochs 和收敛阈值 convergence_thres,用于控制算法的停止条件。初始

时,计算了初始的代价函数值 c,并将其存储在 costs 列表中。

       在迭代过程中,使用偏导数的公式进行参数更新,即 theta0 -= update0 和 theta1 -=

update1。同时,计算新的代价函数值 c,并将其存储在 costs 列表中。最后,返回更新后的参数

值 theta0 和 theta1,以及代价函数值的变化过程 costs

       最后,调用了 gradient_descent 函数,并打印了最终的参数值和代价函数值。然后,绘制了

代价函数值的变化过程图。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章:

机器学习---梯度下降代码

1. 归一化 # Read data from csv pga pd.read_csv("pga.csv") print(type(pga))print(pga.head())# Normalize the data 归一化值 (x - mean) / (std) pga.distance (pga.distance - pga.distance.mean()) / pga.distance.std() pga.accuracy (pga.accuracy - pg…...

【VB6|第23期】原来Jet.OLEDB也可以读取新版.xlsx的Excel文件

日期&#xff1a;2023年8月11日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

通过控制ros节点的启停,软实现人工控制和紧急停止功能的图示

通过控制ros节点的启停&#xff0c;软实现人工控制和紧急停止功能的图示 实现原理简介&#xff1a; 人工控制的节点&#xff1a; 键盘节点 方向盘节点 自动控制的节点&#xff1a; movebase 导航 autoware 等 底盘节点&#xff1a; 差速底盘 阿克曼底盘 控制节点&#xff1…...

面试热题(滑动窗口最大值)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&#xff1a;[3,3,5,…...

【代码】表格封装 + 高级查询 + 搜索 +分页器 (极简)

一、标题 查询条件按钮&#xff08;Header&#xff09; <!-- Header 标题搜索栏 --> <template><div><div class"header"><div class"h-left"><div class"title"><div class"desc-test">…...

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

ant.design 组件库中的 Tree 组件实现可搜索的树&#xff0c;在这里我会详细介绍每个方法&#xff0c;以及容易踩坑的点。 效果图&#xff1a; 首先是要导入的文件 // React 自带的属性 import React, { useMemo, useState } from react; // antd 组件库中的&#xff0c;输入…...

Linux系统编程之信号(上)

一、信号概念 信号就是软件中断。每当程序收到一个信号&#xff0c;都需要按指定的方法去处理。以下是UNIX系统的信号表。 其中core表示产生一个复制了该进程内存映像的core文件&#xff0c;它保存了程序现场&#xff0c;可以使用gdb来调试。 二、signal() signal()函数用于改…...

23.Netty源码之内置解码器

highlight: arduino-light Netty内置的解码器 在前两节课我们介绍了 TCP 拆包/粘包的问题&#xff0c;以及如何使用 Netty 实现自定义协议的编解码。可以看到&#xff0c;网络通信的底层实现&#xff0c;Netty 都已经帮我们封装好了&#xff0c;我们只需要扩展 ChannelHandler …...

sigmoid ReLU 等激活函数总结

sigmoid ReLU sigoid和ReLU对比 1.sigmoid有梯度消失问题&#xff1a;当sigmoid的输出非常接近0或者1时&#xff0c;区域的梯度几乎为0&#xff0c;而ReLU在正区间的梯度总为1。如果Sigmoid没有正确初始化&#xff0c;它可能在正区间得到几乎为0的梯度。使模型无法有效训练。 …...

RabbitMQ 消息队列

文章目录 &#x1f370;有几个原因可以解释为什么要选择 RabbitMQ&#xff1a;&#x1f969;mq之间的对比&#x1f33d;RabbitMQ vs Apache Kafka&#x1f33d;RabbitMQ vs ActiveMQ&#x1f33d;RabbitMQ vs RocketMQ&#x1f33d;RabbitMQ vs Redis &#x1f969;linux docke…...

PHP实现在线进制转换器,10进制,2、4、8、16、32进制转换

1.接口文档 2.laravel实现代码 /*** 进制转换计算器* return \Illuminate\Http\JsonResponse*/public function binaryConvertCal(){$ten $this->request(ten);$two $this->request(two);$four $this->request(four);$eight $this->request(eight);$sixteen …...

报错 | Spring报错详解

Spring报错详解 一、前言二、报错提示三、分层解读1.最下面一层Caused by2.上一层Caused by3.最上层Caused by 四、总结五、解决方案 一、前言 本文主要是记录在初次学习Spring时遇到报错后的解读以及解决方案 二、报错提示 三、分层解读 遇到报错的时候&#xff0c;我们需要…...

PHP最简单自定义自己的框架数据库封装调用(五)

1、实现效果调用实现数据增删改查封装 2、index.php 入口定义数据库账号密码 <?php//定义当前请求模块 define("MODULE",index);//定义数据库 define(DB_HOST,localhost);//数据库地址 define(DB_DATABASE,aaa);//数据库 define(DB_USER,root);//数据库账号 def…...

使用Redis来实现点赞功能的基本思路

使用Redis来实现点赞功能是一种高效的选择&#xff0c;因为Redis是一个内存数据库&#xff0c;适用于处理高并发的数据操作。以下是一个基本的点赞功能在Redis中的设计示例&#xff1a; 假设我们有一个文章或帖子&#xff0c;用户可以对其进行点赞&#xff0c;取消点赞&#x…...

【黑马头条之app端文章搜索ES-MongoDB】

本笔记内容为黑马头条项目的app端文章搜索部分 目录 一、今日内容介绍 1、App端搜索-效果图 2、今日内容 二、搭建ElasticSearch环境 1、拉取镜像 2、创建容器 3、配置中文分词器 ik 4、使用postman测试 三、app端文章搜索 1、需求分析 2、思路分析 3、创建索引和…...

Nginx安装以及LVS-DR集群搭建

Nginx安装 1.环境准备 yum insatall -y make gcc gcc-c pcre-devel #pcre-devel -- pcre库 #安装openssl-devel yum install -y openssl-devel 2.tar安装包 3.解压软件包并创建软连接 tar -xf nginx-1.22.0.tar.gz -C /usr/local/ ln -s /usr/local/nginx-1.22.0/ /usr/local…...

后端开发9.商品类型模块

概述 简介 商品类型我设计的复杂了点,设计了多级类型 效果图 数据库设计...

spring框架自带的http工具RestTemplate用法

1. RestTemplate是什么&#xff1f; RestTemplate是由Spring框架提供的一个可用于应用中调用rest服务的类它简化了与http服务的通信方式。 RestTemplate是一个执行HTTP请求的同步阻塞式工具类&#xff0c;它仅仅只是在 HTTP 客户端库&#xff08;例如 JDK HttpURLConnection&a…...

【flink】Checkpoint expired before completing.

使用flink同步数据出现错误Checkpoint expired before completing. 11:32:34,455 WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [Checkpoint Timer] - Failed to trigger or complete checkpoint 4 for job 1b1d41031ea45d15bdb3324004c2d749. (2 con…...

【论文阅读】NoDoze:使用自动来源分类对抗威胁警报疲劳(NDSS-2019)

NODOZE: Combatting Threat Alert Fatigue with Automated Provenance Triage 伊利诺伊大学芝加哥分校 Hassan W U, Guo S, Li D, et al. Nodoze: Combatting threat alert fatigue with automated provenance triage[C]//network and distributed systems security symposium.…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...