首先逻辑回归思想是什么:
1.列出线性方程(对于线性边界)
(①y指的是一条数据得出的数;②x0 = 1;③大西塔、大X ,矩阵)
2.给线性方程结果设置一个【函数】(使得数值在某一个范围进行拉伸,起到在某密度很高的数值段调节灵敏度的作用)
【sigmoid函数对于数据只有一个位置的密度进行拉伸(拉伸跟sigmoid各个位置的导数有关,也可以说跟在数轴上的位置移动有关,要是能掌握位置移动的导数,也可以做到只用sigmoid在只需要一个位置密度拉伸,效果不错)】
∵ 映射函数:
∵ 映射法则:
∴ 则对于其中一条数据(得数(0~1),标签是0或1):
则为了让1的预测结果+0的预测结果准确率最大,以【求和】方式(用中括号的理由是可以用其他方式)
标签为0时,预测越偏0越好;标签为1时,预测越偏1越好
则:
(举个这个例子,表示方法不止一个,但是这个不好ln(),但是用非ln的方法也可,主要是数学运算)
因此以下用L1()的方法
求其最大
令
有
核心:
迭代 :
评估:
求迭代1000次的 的值
或者
n = 预测对的数量/总数量
代码:
import math
import torch
import numpy as np
def sigmoid(x):
'''
①定义sigmoid函数,只能传一位数字
'''
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(100):
#【核心 得分函数求导】
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%10==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)
1 : y= -1.8804615 x -11.452393
1.0623912491920128e-05 1.6203702405112494e-06 2.471386774057889e-07 3.7693553923458884e-08 tensor([3.7305e-27])
11 : y= 29.794811 x -33.11068
4.170753723197619e-15 0.03503080444616677 0.9999999999968352 1.0 tensor([1.])
21 : y= 29.736506 x -33.16898
3.934550917254195e-15 0.03129583827562913 0.9999999999962303 1.0 tensor([1.])
31 : y= 29.73497 x -33.17052
3.9284919026086554e-15 0.031202702601275802 0.9999999999962128 1.0 tensor([1.])
41 : y= 29.734928 x -33.170563
3.928327059986707e-15 0.03120016577455888 0.9999999999962124 1.0 tensor([1.])
51 : y= 29.734928 x -33.170563
3.928327059986707e-15 0.03120016577455888 0.9999999999962124 1.0 tensor([1.])
61 : y= 29.734928 x -33.170563
3.928327059986707e-15 0.03120016577455888 0.9999999999962124 1.0 tensor([1.])
71 : y= 29.734928 x -33.170563
3.928327059986707e-15 0.03120016577455888 0.9999999999962124 1.0 tensor([1.])
81 : y= 29.734928 x -33.170563
3.928327059986707e-15 0.03120016577455888 0.9999999999962124 1.0 tensor([1.])
91 : y= 29.734928 x -33.170563
3.928327059986707e-15 0.03120016577455888 0.9999999999962124 1.0 tensor([1.])