python实现批量梯度,随机梯度下降以及小批量梯度下降

最近刚接触机器学习,就一个线性回归学起来都是十分的吃力

刚接触了梯度下降算法,算法解析很多大牛解析的更好,我就放一下自己理解的写出的代码好了

需要用到的数据和导入库

 
  
import matplotlib.pyplot as plt
from sklearn import linear_model
import numpy as np
import random
x=[[400],[450],[484],[500],[510],[525],[540],[549],[558],[590],[610],[640],[680],[750],[900]]
y=[[80],[89],[92],[102],[121],[160],[180],[189],[199],[203],[247],[250],[259],[289],[356]]
plt.plot(x,y,'ks')
def pi_tidy(x,y):#批量梯度下降
    alpha=0.000002
    m=len(x)
    w0=0
    w1=0
    count=0
    error2=0
    while 1:
        count=count+1
        w=[0,0]
        for i in range(m):
            error1=0
            w[0]+=w0+w1*x[i][0]-y[i][0]
            w[1]+=(w0+w1*x[i][0]-y[i][0])*x[i][0]
        w0=w0-alpha/m*w[0]
        w1=w1-alpha/m*w[1]
        for i in range(m):
            error1+=1/(2*m)*((w0+w1*x[i][0]-y[i][0])**2)
        if abs(error2-error1)<0.01:
            break;
        if count>50:
            break;
        error2=error1
        print('w0:%f,w1 :%f,eeror:%f'%(w0,w1,error1))
    print('------------------------------------')
    X=[]
    Y=[]
    X.append(400)
    X.append(900)
    Y.append(w0+w1*400)
    Y.append(w0+w1*900)
    plt.plot(X,Y,'g-',label='pi_tidu',color='b')
def rand_tidu(x,y):#随机批量下降
    alpha=0.000001
    m=len(x)
    count=0
    error2=0
    w0=0
    w1=0
    while 1:
        finish=0
        w=[0,0]
        for i in range(m):
            count+=1
            w[0]=w0+w1*x[i][0]-y[i][0]
            w[1]=(w0+w1*x[i][0]-y[i][0])*x[i][0]
            w0=w0-alpha*w[0]
            w1=w1-alpha*w[1]
            error1=abs(w0+w1*x[i][0]-y[i][0])
            if abs(error2-error1)<1:#收敛程度
                finish=1
                break
            if(count>15):
                finish=1
                break
            error2=error1
            print('w0:%f,w1:%f,error:%f'%(w0,w1,error1))
        if(finish==1):
            break
    print('------------------------------------')
    X=[]
    Y=[]
    X.append(400)
    X.append(900)
    Y.append(w0+w1*400)
    Y.append(w0+w1*900)
    plt.plot(X,Y,'g-',label='rand_tidu',color='r')
def smallpi_tidu(x,y):#小批量梯度下降
    count=0
    alpha=0.000001
    m=len(x)
    error2=0
    w0=0
    w1=0
    tend=2
    while 1:
        finish=0
        for i in range(0,m-tend):
            error1=0
            w=[0,0]
            count+=1
            for j in range(i,i+tend):
                w[0]+=w0+w1*x[j][0]-y[j][0]
                w[1]+=(w0+w1*x[j][0]-y[j][0])*x[j][0]
            w0=w0-alpha/tend*w[0]
            w1=w1-alpha/tend*w[1]
            for j in range(i,i+tend):
                error1+=1/2*tend*((w0+w1*x[j][0]-y[j][0])**2)
            if abs(error2-error1)<1:
                finish=1
                break
            if(count>m-tend):
                finish=1
                break
            error2=error1
            print('w0:%f,w1:%f,error:%f'%(w0,w1,error1))
        if(finish==1):
            break
    print('------------------------------------')
    X=[]
    Y=[]
    X.append(400)
    X.append(900)
    Y.append(w0+w1*400)
    Y.append(w0+w1*900)
    plt.plot(X,Y,'g-',label='small_tidu')
pi_tidy(x,y)
rand_tidu(x,y)
smallpi_tidu(x,y)
clf=linear_model.LinearRegression()
clf.fit(x,y)
x2=[[400],[750],[900]]
y2=clf.predict(x2)
plt.plot(x2,y2,'g-',label='min_*2',color='y')#sklearn里面的线性模型
plt.legend()
plt.show()
 
  

  输出结果截图

 

 

 

转载于:https://www.cnblogs.com/chenminyu/p/10579191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值