绘图:
matplotlib.pyplot的使用总结大全(入门加进阶) (zhihu.com)
数学公式(from 老师):
code:
import pandas as pd
import matplotlib.pyplot as plt
import copy
def f(curcan,x):
"""
求 y=kx+b
其中参数k,b用curcan数组表示,x为自变量,y为因变量
"""
return curCan[0]*x+curCan[1]
#读csv文件
data=pd.read_csv('../data/test.csv')
x=data["x"]
y=data["y"]
#数据对总数
dataCount=x.size
#初始参数
can=[0.0,0.0]
#步长
step=0.0005
#第一层循环,进行数据量/10次梯度下降
for i in range(1,dataCount,10):
#防止过程中原函数中参数被修改
curCan=copy.deepcopy(can)
#对各个参数进行梯度下降法修改
for j in range(2):
pash=0
#如果是k的话
if j==0:
for k in range(i,i+9):
pash+=(f(can,x[k])-y[k])*x[k]
#如果是b的话
else :
for k in range(i,i+9):
pash+=(f(can,x[k])-y[k])
curCan[j]-=step/10.0*pash
#集中处理各参数值
can=copy.deepcopy(curCan)
#输出k、b
print(can[0],can[1])
#散点图、直线图
xp=[0,100]
yp=[ f(can,xi) for xi in xp]
plt.scatter(x,y)
# plt.show()
plt.plot(xp,yp,color="pink",linewidth=8)
plt.show()
结果:
还算ok?
tips:步长不能太长,不然直接越梯度下降越bt。参数-= 的时候记得保留原始参数,防止出现奇怪情况(锁住!)。计算机之最还是数学!
刚入门,没用矩阵等高级的东东,争取以后学会!
————————————————————————————————————————
后记:步长太长导致结果太差的原因找到:当第n次开始,步长长到一下迈到比自己还高的对岸去,梯度将继续变大,导致下一步路程n+1->n+2远于n->n+1,以至于永远无法回到第n步的位置。