本站消息

  本站每日ip已达10000,出租广告位,位置价格可谈,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-07(3)

2019-08(112)

2019-09(103)

2019-10(14)

2019-11(7)

梯度下降法and实战

发布于2019-09-11 14:17     阅读(749)     评论(0)     点赞(28)     收藏(2)


梯度下降法

在这里插入图片描述
学习率的大小主要是调剂优化步长和大小,所以学习率要设置一个合适的值。

对代价函数求导,θ0和1求导,后面一堆作为总值更新θ的值。
要一起算完之后一起更新,不然就错误了,后面的就是异步更新了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
往左走往右走都上往上走,就会陷入局部极小值。
在这里插入图片描述
可以用梯度下降法来求解线性回归。
在这里插入图片描述
下面是上面的计算:
在这里插入图片描述
线性回归的代价函数是凸函数。
在这里插入图片描述
凸函数和非凸函数,非凸函数可能无法走到最小值。会发生局部最少值的情况。
在这里插入图片描述
在这里插入图片描述

梯度下降法和代价函数实战

import numpy as np
import matplotlib.pyplot as plt

#载入数据
data = np.genfromtxt("data.csv",delimiter=",")
x_data = data[:,0]#第0列的所有数据
y_data = data[:,1]
plt.scatter(x_data,y_data)#画散点图
plt.show()

lr=0.0001#学习率learning rate,就是α
b=0#截距
k=0#斜率
epochs=50#最大迭代次数

#最小二乘法,代价函数的定义
def compute_error(b,k,x_data,y_data):
    totalError=0
    for i in range(0,len(x_data)) :
        #真实值-预测值
        totalError+=(y_data[i]-(k*x_data[i]+b))**2
        #2m的2可以除 也可以不
    return totalError/float(len(x_data))/2.0

#计算θ0和1的值的,即斜率k和截距b
def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
    #计算总数据量,得到总的样本个数
    m=float(len(x_data))
    #循环epochs次
    for i in range(epochs):
        b_grad=0
        k_grad=0
        #计算梯度的平均总和再求平均,和ppt内的公式对应,同步更新
        for j in range(0,len(x_data)):
            b_grad+=-(1/m)*(y_data[j]-((k*x_data[j]+b)))
            k_grad+=-(1/m)*x_data[j]*(y_data[j]-((k*x_data[j]+b)))
        #更新b和k
        b=b-(lr*b_grad)
        k=k-(lr*k_grad)
        # #每迭代5次,输出一组图像
        # if i%5==0 :
        #     print("epochs:",i)
        #     plt.plot(x_data,y_data,'b.')
        #     plt.plot(x_data,k*x_data+b,'r')
        #     plt.show()
    return b,k
print("Starting b={0},k={1},error={2}".format(b,k,compute_error(b,k,x_data,y_data)))
print("Running...")
b,k=gradient_descent_runner(x_data,y_data,b,k,lr,epochs)
print("Aftr {0} iterations b={1},k={2},error={3}".format(epochs,b,k,compute_error(b,k,x_data,y_data)))

#画图
#蓝色,用点画出来
plt.plot(x_data,x_data,'b.')
plt.plot(x_data,k*x_data+b,'r')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

在这里插入图片描述
用sklearn库来实现梯度下降

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

#载入数据
data = np.genfromtxt("data.csv",delimiter=",")
x_data = data[:,0]#第0列的所有数据
y_data = data[:,1]
plt.scatter(x_data,y_data)#画散点图
plt.show()
print(x_data.shape)

x_data=data[:,0,np.newaxis]
y_data=data[:,0,np.newaxis]
#创建并拟合模型
model=LinearRegression
model.fit(x_data,y_data)#建模动作


#画图
#蓝色,用点画出来
plt.plot(x_data,x_data,'b.')
plt.plot(x_data,model.predict(x_data),'r')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24


所属网站分类: 技术文章 > 博客

作者:雷神归来

链接: https://www.pythonheidong.com/blog/article/107255/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)