import numpy as np
#import matplotlib.pyplot as plt
def f_function(x):
data=0.5*x+1.8+np.random.uniform(0.01,0.02,(1,1)) #注意是这样调用
return data
###生成带噪音的数据的公式
def use_function():
x=np.mat(np.linspace(0,100,num=1000))
y=np.mat(f_function(x))
return x,y
##生成噪音
def mse_function(w_current1,b_current1,x,y):
x=np.mat(x)
y=np.mat(y)
##损失函数
loss_f=np.mat(np.zeros((1,1000)))
for i in range(1000):
x_s=x[0,i]
real=y[0,i]
cla=w_current1*x_s+b_current1 #算出每个x对应的y
loss_f[0,i]=(real-cla)*(real-cla) #这是损失函数
##计算出来后,要计算
loss_real=np.sum(np.array(loss_f))*0.001 #求此时的均误差
return loss_real,w_current1,b_current1
##计算均方误差
def xiajiang_fun(x_old,y_old,w,b,learnrate1,learnrate2):
##对均方误差公式求w,b的导数
x_old=np.mat(x_old)
y_old=np.mat(y_old)
new_w=0
new_b=0 #每次迭代都进行初始化,因为这只是用来求梯度的
#new_w=np.mat(np.zeros((1,1000)))
#new_b=np.mat(np.zeros((1,1000)))
for i in range(1000):
x=x_old[0,i]
y=y_old[0,i]
new_w += -2*x*(y-(w*x+b))*0.001
new_b += -2*(y-(w*x+b)) *0.001
#new_w_sum=np.sum(np.array(new_w)) #这里的加法是公式 缘由 前面的loss_real 里面有加法
#new_b_sum=np.sum(np.array(new_b)) #这里的加法是公式 缘由 全面的loss_real 里面有加法
##更新完权重。使用最速下降法
w_new= (w-learnrate1*new_w)
b_new= 3.6*(w-learnrate2*new_b)
return w_new,b_new
###更新最速法更新权重
###主函数
##生成噪音数据
x,y=use_function()
##初始化w,b
w=13
b=14
iteration=100 #设置迭代次数
for i in range(iteration):
loss_function_reault,w_old,b_old = mse_function(w,b,x,y) #计算一次均方误差
if loss_function_reault <0.01:
print('ok',i ,'break')
break
else:
w_new1,b_new1=xiajiang_fun(x,y,w_old,b_old,0.0001,0.0001) #生成新的w,b,通过调试,得到学习率为,0001最佳
w=w_new1
b=b_new1 #生成之后再次更新
print(w,b)
11-15
2063
07-09
9795
11-06
549
02-22
2368