发布于2019-09-11 14:17 阅读(1281) 评论(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()
用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()
作者:雷神归来
链接:https://www.pythonheidong.com/blog/article/107255/5bd86b20b4bcd4d72a4a/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!