机器学习-梯度下降法

梯度下降法,一般用来求解线性回归方程,我的理解是根据一组形如(特征1,特征2...-结果)的数据来找到这些对应的特征和结果之间的联系

例如,我们利用一组价格-销量的数据判断一个物品的销量和价格之间的关系

我们要求的线性回归方程可以表示为:

销量 = 价格 * 价格参数

实质上其实就是找到对应的价格参数

而当影响一个结果的特征不只有一个的时候(例如影响物品销量的不只有价格,还有广告投放数量等),我们需要求的回归方程可以表示为

其中θ表示各个特征的参数

假设我们已经找到了对应的参数,我们用参数求得的结果与实际结果之间的距离可以用实际结果-求得结果的平方来衡量,即

换而言之,只要我们找到的参数能让J(θ)的值最小,即表示我们找到了最能表示特征与结果之间关系的参数,而找到这个函数最小值对应的θ的方法包括梯度下降法

梯度下降法是只每次朝梯度的方向移动一个步长,以此达到函数的最小值

梯度可以理解为一个向量,它指向了函数增长最快的方向,不懂的可以去看看网易公开课的多变量微积分

假设只有一组变量,求得J(θ)的梯度为

 

用梯度乘一个步长即是每次θ要移动的距离

有了这些,就可以写代码了

 

import numpy as np
import random

def gettheta2(x,y,times,step):
    '''
    随机梯度下降算法
    '''
    a, b = np.shape(x)
    train = np.ones((a, b + 1))
    m, n = np.shape(train)
    train[:, 1:] = x
    theta = np.zeros(n)
    for i in range(times):
        a = random.randint(0,m-1)
        randm_train = train[a]
        randm_label = y[a]
        hp = np.dot(randm_train,theta.transpose())
        error = randm_label - hp
        grand = np.dot(randm_train.transpose(),error)
        theta = theta+grand*step
    return theta


def gettheta1(x,y,times,step):
    '''
    批量梯度下降算法
    '''
    a,b = np.shape(x)
    train = np.ones((a,b+1))
    m, n = np.shape(train)
    train[:,1:] = x
    theta = np.zeros(n)
    for i in range(times):
        hp = np.dot(train,theta.transpose())
        error = hp - y
        grand = np.dot(train.transpose(),error)/m
        theta = theta- step*grand
    return train,theta

def liner(x,labe,times,step,input):
    theta = gettheta2(x,labe,times,step)
    result = np.dot(input,theta)
    

if __name__ == "__main__":
    input = np.array([1,3.1,5.5])
    liner(x,y,1000,0.01,input)

只需要记住还有个θ0,就不难理解上面的代码

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值