逻辑回归 python手打例子

首先逻辑回归思想是什么:

1.列出线性方程(对于线性边界)

 

\large y=\theta_{0}+\theta_{1}x{1}+\theta_{2}x{2}+\cdots +\theta_{n}x_{n}=\sum_{i=0}^{n}\theta_{i}x _{i}=\Theta ^{T}\chi __{t}

(①y指的是一条数据得出的数;②x0 = 1;③大西塔、大X ,矩阵)

 

2.给线性方程结果设置一个【函数】(使得数值在某一个范围进行拉伸,起到在某密度很高的数值段调节灵敏度的作用)

【sigmoid函数对于数据只有一个位置的密度进行拉伸(拉伸跟sigmoid各个位置的导数有关,也可以说跟在数轴上的位置移动有关,要是能掌握位置移动的导数,也可以做到只用sigmoid在只需要一个位置密度拉伸,效果不错)】

 

∵ 映射函数:   

 \large [sigmoid=1/(1+e^{-x})]

 

∵ 映射法则:   

 \large f\Rightarrow x_{sigmoid}=y

 

∴ 则对于其中一条数据(得数(0~1),标签是0或1):  

\large h_{\Theta } (\chi_{t} )=1/(1+e^{-(\Theta ^{T}\chi_{t}) })=1/(1+e^{-(\sum_{i=0}^{n}\theta_{i}x _{i}) })

则为了让1的预测结果+0的预测结果准确率最大,以【求和】方式(用中括号的理由是可以用其他方式)

标签为0时,预测越偏0越好;标签为1时,预测越偏1越好

则:

\large P(y_{(t)}|\chi _{(t)};\Theta )=h_{\Theta } (\chi_{(t)} )^{y_{(t)}}\cdot (1-h_{\Theta } (\chi_{(t)}) )^{1-y_{(t)}}

\large L_{1}(\Theta )=\prod_{t=1}^{m}h_{\Theta } (\chi_{(t)} )^{y_{(t)}}\cdot (1-h_{\Theta } (\chi_{(t)}) )^{1-y_{(t)}}

\large L_{2}(\Theta )=\sum_{t=1}^{m}h_{\Theta } (\chi_{(t)} )^{y_{(t)}}\cdot (1-h_{\Theta } (\chi_{(t)}) )^{1-y_{(t)}}(举个这个例子,表示方法不止一个,但是这个不好ln(),但是用非ln的方法也可,主要是数学运算)

因此以下用L1()的方法

\large \ln L_{1}(\Theta )=\sum_{t=1}^{m}({y_{(t)}}\cdot \ln h_{\Theta } (\chi_{(t)} )+ ({1-y_{(t)}})\cdot \ln(1-h_{\Theta } (\chi_{(t)}) ))求其最大

令 \large J(\Theta )=-\ln L_{1}(\Theta )

\large Y'=\frac{\partial }{\partial \overrightarrow{\Theta} }J(\overrightarrow{\Theta} ) \\ =\sum_{t=1}^{m}\overrightarrow{\chi _{t}}(1-y _{t})+\frac{1}{1+e^{- (\overrightarrow{\Theta } \cdot \overrightarrow{\chi _{t} })}}\cdot \frac{\partial }{\partial \overrightarrow{\Theta} }(e^{- (\overrightarrow{\Theta } \cdot \overrightarrow{\chi _{t} })}) \\=\sum_{t=1}^{m}\overrightarrow{\chi _{t}}(1-y _{t})-(\frac{1}{1+e^{- (\overrightarrow{\Theta} \cdot \overrightarrow{\chi _{t} })}}\cdot e^{- (\overrightarrow{\Theta} \cdot \overrightarrow{\chi _{t} })}\cdot \overrightarrow{\chi _{t}}) \\=\sum_{t=1}^{m}\overrightarrow{\chi _{t}}\cdot (\frac{1}{1+e^{- (\overrightarrow{\Theta } \cdot \overrightarrow{\chi _{t} })}}-y_{t}) \\=\sum_{t=1}^{m} \overrightarrow{\chi _{t}}\cdot (h(\overrightarrow{\Theta })-y _{t})

核心:

迭代 \large \overrightarrow{\Theta }

\large \overrightarrow{\Theta }\Leftarrow \overrightarrow{\Theta }-\alpha \cdot\sum_{t=1}^{m} \overrightarrow{\chi _{t}}\cdot (h(\overrightarrow{\Theta })-y _{t})

评估:

求迭代1000次的\large L_{1}(\Theta ) 的值

\large L_{1}(\Theta )=\prod_{t=1}^{m}h_{\Theta } (\chi_{(t)} )^{y_{(t)}}\cdot (1-h_{\Theta } (\chi_{(t)}) )^{1-y_{(t)}}

或者

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.])

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值