梯度下降法的python实现1

刚开始学习机器学习,了解了代价函数,梯度下降算法,用一组最简单的数据进行拟合


对于该算法的自己的一些理解

我们在拟合的过程中,需要一个判断拟合准确程度的函数,这个函数就叫损失函数(也叫做代价函数)

例:
在这里插入图片描述
比如我们对自变量x1,因变量y1进行拟合,图中蓝色的线是我们拟合出来的函数,图中的圆圈是本来的数据,每个数据和拟合出来的函数都有一个高度差,把这些高度差的平方加起来得到一个值,我们令这个值为h,显然h越大,就越代表拟合的偏离程度就越大,h越小,就说明拟合的偏离程度越小。
但是h并不是代价函数,在官方的定义中,代价函数j(e)=h/(2*m),m为样本数量。为什么要除以2m呢,我的想法是,除以2是因为为了方便后面对代价函数的求导,因为我们要找代价函数的最小值,难免会遇到求导的问题。至于除以m的原因,我认为,是为了凑一个和方差类似的表达式,可以让公式显得更加美观。但是最终要明白,2*m是凑出来为了美观方便的,最关键的部分还是要研究h的最小值。
在这里插入图片描述
在该图中he(x)=e0+e1x为一个拟合函数,e0和e1是需要求出来的拟合函数的参数

提示:以下是本篇文章正文内容,下面案例可供参考

一、用梯度下降法拟合一组非常简单的数据。

x1y
11
22
33
44

拟合函数设为y=e1*x+e0
通过画图可以知道,最好的拟合函数表达式肯定是y=x,所以最终e0=0,e1=1的时候,为正确答案

梯度下降算法:一点点的令e0,e1改变,让j(e0,e1)变小,找到j(e0,e1)的最小值或者局部最小值
如何一点点的改变e1,e0呢?
在这里插入图片描述
其中a为学习率,用来控制每次的改变程度的。
将该算法进行化简,得到
在这里插入图片描述
ps:图中的x(i)就是所求偏导的ei前面的表达式x(i),比如,y=e1*x+e0,e1前面的表达式为x,e0前面的表达式是1。

当知道这些概念后,我们的代码整体思路就是,一点点的改变e0,e1,找出代价函数的最小值(理想中的),并求得此时的e1,e0,此时求出的值就是拟合函数的最佳参数。
在这里插入图片描述
由图可见,该寻找的过程是一个慢慢逼近的过程,所以我们要多尝试不同的学习率a,用更多的次数,来找到最理想的参数数值。

二、代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#用来计算代价函数的数值
def daijia_sz(m,x,e,y):
    je=np.multiply((np.dot(x,e)-y),(np.dot(x,e)-y))
    je=je.sum()
    return je/(2*m)

#用来更新ei的数值(让ei慢慢的变化)
def temp(e,a,m,hx,y,x):
    tm_=np.multiply(hx-y,x)
    tm=e-a*tm_.sum()/m
    return tm
m=4
x=np.mat('1,1;1,2;1,3;1,4')
y=np.mat('1;2;3;4')
e=np.mat('0.;2.')
x0=np.mat('1;1;1;1')
x1=np.mat('1;2;3;4')
# print(daijia_sz(m,x,e,y))
# hx=np.dot(x,e)#矩阵乘法
# je=np.multiply(,)#点乘
# je=je.sum()#矩阵列求和
e0=0
e1=2
a=0.0001#学习率
m=4
for i in range(1000000):#循环次数是慢慢改变的次数,如果运行结果较慢,可以把该数字调小,一般情况下次数越多拟合效果越好
    #更新e0,e1的数值(矩阵计算中的e0,ei)
    e[0]=e0
    e[1]=e1
    #梯度下降算法
    temp0=temp(e0,a,m,np.dot(x,e),y,x0)
    temp1=temp(e1,a,m,np.dot(x,e),y,x1)
    #更新e0,e1的数值
    e0=temp0
    e1=temp1
print(e0,e1)

运行结果
在这里插入图片描述
可见e0非常接近0,e1非常接近1,结果正确

总结

刚开始学习机器学习,python画图还没有完全掌握,部分代码可能还可以进行改进。虽然题很简单,但是我通过这道题了解了梯度下降算法的基本思路,为以后的难题做铺垫。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值