BGD(批量梯度下降)--学习笔记

本文总字数:1382,阅读预计需要:3分钟

函数凸凹性:

在这里插入图片描述
用到的范数知识:
在这里插入图片描述

详细解释:每一个元素的平方再开方。
在这里插入图片描述
补充损失函数: Huber Loss知识点
在这里插入图片描述

loss函数可以通过loss参数进行设置。SGDRegressor支持以下的loss函数:

在这里插入图片描述
SGD:随机梯度下降四个损失函数:
在这里插入图片描述

事例代码:

import numpy as np 
import matplotlib.pyplot as plt
np.random.seed(0)  #随机数种子
#构造训练数据,这个数据不包括x0;
x=np.arange(0,10,0.2) #生成50个样本
#训练样本的个数
m=len(x)
#构造x0
x0=np.full(m,1.0)   #50个1
#将x0和x拼接起来,组成完整的训练数据
input_data=np.vstack([x0,x]).T  #将偏置b作为权向量的第一个分量
featureNum=input_data.shape[1]    #维度
print(input_data)
#y_train生成y,其实就是input_data对应的标签
target_data=2*x+5+np.random.randn(m)    #最后一项是偏差m=5就行了,x是50的向量

#两种终止条件
loop_max=1000000 #最大迭代次数,防止死循环
epsilon=1e-5    #阈值

#初始化权值
theta=np.random.randn(featureNum)
alpha=0.00001   #步长(注意取值过大会导致震荡即不收敛,过小收敛速度变慢)
#记录误差变量
error=np.zeros(featureNum)
count=0 #循环次数
#全部用向量表示,theta的维度和error维度一样。

while count < loop_max:
    count += 1
    sum_m=np.zeros(2)
    for i in range(m):
        diff = (np.dot(theta,input_data[i])-target_data[i])*input_data[i]
        sum_m=sum_m+diff #当alpha取值过大时,sum_m会在迭代过程中溢出

    theta = theta-alpha*sum_m   #注意步长alpha(0.005的时候会震荡)的取值,过大会导致震荡
    #判断是否已经收敛
    if np.linalg.norm(theta-error)<epsilon: #norm()范数:error是之前的theta,theta是更新后的,相减是求距离,也就是求相关性:距离很小的时候,相当于theta值没有更新
        break
    else:
        error=theta
    print('loop count=%d'%count,'\tw:',theta)
print('loop count=%d'%count,'\tw:',theta)

plt.plot(x,target_data,'g*')
plt.plot(x,theta[1]*x+theta[0],'r')
plt.show()

输出:
省略···
在这里插入图片描述
在这里插入图片描述

 

posted @   北极星!  阅读(301)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2020-04-14 同一个单片机系统要做到共地
>>博客统计:随笔 -615  文章 -0  评论 -50 
点击右上角即可分享
微信分享提示