def H(x,theta):
return np.dot(x,theta)
# 4、创建激活函数
def S(h):
return 1.0/(1.0+np.exp(-h))
# 5、代价函数
def J(s,y):
return -np.mean(y*np.log(s)+(1-y)*np.log(1-s))
# 6、创建正向传播函数
def FP(x,theta1,theta2):
a1=x
h2=H(a1,theta1)
a2=S(h2)
h3=H(a2,theta2)
a3=S(h3)
return a1,a2,a3
# 7、创建反向传播函数
def BP(a1,a2,a3,theta2,y):
m=len(y)
delta3=a3-y #输出层误差
delta2=np.dot(delta3,theta2.T)*a2*(1-a2) #隐藏层误差
deltheta2=1.0/m*np.dot(a2.T,delta3) #隐藏层梯度值
deltheta1=1.0/m*np.dot(a1.T,delta2) # 输入层梯度值
return deltheta1,deltheta2
# 8、创建梯度下降函数
# 9、隐藏神经元8个
def G(x,y,lr=0.01):
hidden=8
xm,xn=x.shape # 获取 x 的特征和数量
ym,yn=y.shape # 获取 y 的特征和数量
theta1=np.ones((xn,hidden)) #随机生成theta1的值
theta2=np.ones((hidden,yn)) #随机生成theta2的值
j_list=[]
for i in range(1000):
a1, a2, a3=FP(x,theta1,theta2) #计算模型值
j=J(a3,y) #计算代价值
j_list.append(j)
deltheta1, deltheta2=BP(a1,a2,a3,theta2,y) #计算梯度值
theta1=theta1-deltheta1*lr # 更新theta值
theta2=theta2-deltheta2*lr
return theta1,theta2,j_list