布丁出击
第一步:安装相应模块
如果你的Python还没有安装相关模块的话,那就建议看看我的小白教程哦!Python的Anaconda,Spyder的安装
安装好了之后,我们就可以开始啦!
第二步:模块导入
import numpy as np
import matplotlib.pyplot as plt
第三步:定义生成data函数
def get_data(a, b, n): #以线性函数为模型,ax+b,n为生成多少个数据
np.random.seed(0) #设置随机种子
X = np.array([i for i in range(1, n)]) #生成x坐标
y = X * a + b + np.random.normal(0.0, 1.0, n-1) #y=ax+b+c(c为一个随机波动,np.random.normal(0.0, 1.0, n)的意思为均值为0,方差为1的随机数n个)
return X,y
第四步:定义代价函数
我们定义代价函数为 F ( a , b ) = 1 2 n ∑ 0 n ( a x i + b − y i ) 2 . F(a,b) =\frac{1}{2n} \sum_0^n\ (ax_i +b-y_i)^2. F(a,b)=2n10∑n (axi+b−yi)2.
def cost(X, y, alpha):
d = 0
for i in range(0, len(X)):
a = alpha[0] * X[i] + alpha[1] - y[i]# 即求出$(ax_i +b-y_i)$的值
d =d + a * a # 求出平方后累加
return d/(2 * len(X))
第五步:梯度下降
我们使用梯度下降的方法完成代价函数的收敛
η
i
=
η
i
−
α
∂
F
(
a
,
b
)
∂
η
\eta _i =\eta _i-\alpha \frac{\partial F(a,b) }{\partial \eta}
ηi=ηi−α∂η∂F(a,b)
其中
α
\alpha
α为步长。
def get_alpha(alpha, n):
c,d = 0, 0
for i in range(0, len(X)):
a = alpha[0] * X[i] + alpha[1] - y[i]
d = d + a * X[i]
c = c + a
e = alpha - n * np.array([d/(len(X)), c/(len(X))])
return e
这里得出了梯度下降的函数,就可以下一步了。
第六步:拟合
def count(X, y, alpha, n, s): # s为迭代次数,n为学习步长
Cost = [] #定义一个代价列表,用于后期绘图
i = [] #定义次数列表
j = 1 #用于学习次数
cost1 = cost(X, y, alpha)
while j < s:
Cost.append(cost1)
alpha = get_alpha(alpha, n)
cost1 = cost(X, y, alpha)
j += 1
i.append(j)
plt.plot(i, Cost) #画出迭代过程代价函数值的下降过程
plt.show()
return alpha
第七步:函数使用
X, y = get_data(2, 3, 100)#生成y=2x+3的模型数据
alpha = np.array([3,13])#设置初始的$\eta$的值
alpha = count(X, y, alpha, 0.0001, 1000000)#传入$\alpha$=0.0001,迭代次数1000000
print(alpha) #打印最后学习出的$\alpha$
plt.plot(X, y)#绘画原始数据图
plt.plot(X, alpha[0] * X + alpha[1])#绘画拟合数据图
plt.show()
第八步:完整代码展示
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
def get_data(a, b, n):
np.random.seed(0)
X = np.array([i for i in range(1, n)])
y = X * a + b + np.random.normal(0.0, 1.0, n-1)
return X,y
# 代价函数
def cost(X, y, alpha):
d = 0
for i in range(0, len(X)):
a = alpha[0] * X[i] + alpha[1] - y[i]
d =d + a * a
return d/(2 * len(X))
# 梯度下降策略
def get_alpha(alpha, n):
c,d = 0, 0
for i in range(0, len(X)):
a = alpha[0] * X[i] + alpha[1] - y[i]
d = d + a * X[i]
c = c + a
e = alpha - n * np.array([d/(len(X)), c/(len(X))])
return e
# 拟合求解
def count(X, y, alpha, n, s):
Cost = []
i = []
j = 1
cost1 = cost(X, y, alpha)
while j < s:
Cost.append(cost1)
alpha = get_alpha(alpha, n)
cost1 = cost(X, y, alpha)
j += 1
i.append(j)
plt.plot(i, Cost)
plt.show()
return alpha
X, y = get_data(2, 3, 100)
alpha = np.array([3,13])
alpha = count(X, y, alpha, 0.0001, 1000000)
print(alpha)
plt.plot(X, y)
plt.plot(X, alpha[0] * X + alpha[1])
plt.show()
第九步:效果展示
代价函数值得下降过程
原始数据图
拟合的数据图与原始数据图的对比
我是布丁,记录学习瞬间。