import math
import torch
import numpy as np
def sigmoid(x):
'''
①定义sigmoid函数,只能传一位数字
'''
if x>700:
x=700
if x<-700:
x=-700
res=1/(1+math.exp(-x))
return res
def mul_1(a,b):
'''
①把两个横着的一维矩阵对应乘起来,然后相加,得数是一个数字
②y=a0·x0+a1·x1+…+an·xn
'''
a=torch.tensor([tensor_to_list(a)])
b=torch.tensor([tensor_to_list(b)])
res=a.float().mm(b.float().t())
return res
def tensor_to_list(x):
'''
将tensor转换成list形式
'''
y=np.array(x)
res=list(y)
return res
# 【输入】①数据 ②标记 ③学习率
x=[[1,0],[1,1],[1,2],[1,3]]
y=[[0],[0],[1],[1]]
# 得到输入x,y
x=torch.tensor(x)
y=torch.tensor(y)
# 得到西塔的大小,初始化西塔
leng=x.shape
leng = list(leng)[1]
xita = torch.rand(1,leng)
xita = torch.tensor(tensor_to_list(xita)[0])
aefa=10.
pinggu_qian=0
pinggu_xian=0
for times in range(10000):
#【核心 得分函数求导】
sum=0 #算员
for t in range(len(x)):#算员
sum+=x[t]*(sigmoid(mul_1(xita,x[t]))-y[t])#算员
#【核心 更新】
xita=xita-aefa*sum
#【评估】
pinggu_qian=pinggu_xian
pinggu=1
for t in range(len(x)):
pinggu=pinggu* (sigmoid(mul_1(xita,x[t]))**y[t])*(1-sigmoid(mul_1(xita,x[t])))**(1-y[t])
pinggu_xian=pinggu
#【自动改学习率】
deerta=pinggu_xian-pinggu_qian
if deerta<=0:
aefa=0.7*aefa
if deerta>0:
if deerta<0.000001:
aefa= aefa/0.75
# 【输出】
if times%100==0:
po=tensor_to_list(xita)
print(times+1,": y=",po[1],"x",po[0]," \n",
(sigmoid(mul_1(xita,x[0]))),
(sigmoid(mul_1(xita,x[1]))),
(sigmoid(mul_1(xita,x[2]))),
(sigmoid(mul_1(xita,x[3]))),
pinggu_xian)