只用纯python实现一次函数的梯度下降

目录

代码:

或者可以用导数的定义来求

可能出现的问题

安装其他的库


代码:

#一次函数

import matplotlib.pyplot as plt     #导入库
import numpy as np
def f_shunshi():                    #损失函数(没用到)
    return np.sum(1.0/2.0*(f_w*Sum_shuju_X+f_b-Sum_shuju_Y)*(f_w*Sum_shuju_X+f_b-Sum_shuju_Y)/10)
def f_daoshu_w():               #关于一次函数w(斜率)的偏导
    return np.sum(f_w*(f_w*Sum_shuju_X+f_b-Sum_shuju_Y))/10

def f_daoshu_b():               #关于一次函数b(偏移量)的偏导
    return np.sum(f_w*Sum_shuju_X+f_b-Sum_shuju_Y)/10

xuexilv=1e-2               #学习率
f_w=1.0                       #函数初始参数
f_b=1.0
print("输入10个数据")
Sum_shuju=np.empty([0,2],dtype=float)   #创建一个大数据用来存放x和y)
shuju=np.array([])          #临时参数
for i in range(0, 10):      #插入10个数据(可变)
    print(f"第 {i + 1}个数据")
    x1 = input("输入x:")
    x1=float(x1)
    shuju=np.append(shuju,x1)
    y1 = input("输入y:")
    y1=float(y1)
    shuju=np.append(shuju,y1)
    Sum_shuju=np.append(Sum_shuju,[shuju],axis=0)
    shuju = np.array([])

print("数据")
print(Sum_shuju)        #验证数据有无插入错误

x=input("是否设置函数初始参数:0/是;1/否(默认w=1,b=1):")
if x==0:
    f_w=input("输入w(斜率):")
    f_w=float(f_w)
    f_b=input("输入b(偏移量)")
    f_b=float(f_b)

Sum_shuju_X=Sum_shuju[:,0]
Sum_shuju_Y=Sum_shuju[:,1]      #把x与y提取到两个数组
sum_1=input("设置迭代次数:")
sum_1=int(sum_1)
print(f"w的值为:{f_w}")
print(f"b的值为:{f_b}")
f_w_sum=np.array([])
tidu=np.array([])
for i in range(0,sum_1):        #开始迭代
    f_w2=f_w-xuexilv*f_daoshu_w()
    f_b2=f_b-xuexilv*f_daoshu_b()
    f_w=f_w2
    f_b=f_b2
    print(f"w的值为:{f_w}")
    print(f"b的值为:{f_b}")
    print("********************************************************************")

x_1=range(0,10)     #直观的开始验证图形与数据是否拟合

plt.plot(Sum_shuju_X,Sum_shuju_Y,'x',x_1,f_w*x_1+f_w,'b-.')
plt.show()  #图来喽!!!!

可以稍微改一改求二次类推,前提知道损失函数的导数

或者可以用导数的定义来求

def f_diuda0(f,x):
    e=1e-6    #足够小的数
    return (f(x+e)-f(x))/e

可能出现的问题

求导思想大概是这个思想,但是会不会出问题就不敢保证了

(比如e还是太大了,函数有多个参传过去会报错之类的【不过可以在函数中调用另一个函数也行】)

安装其他的库

或者可以安装教程来应用其他的库来求偏导(但是这与标题不符去掉了)

ba06ee60-62c4-4a0e-811a-82fd55782098

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木em哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值