2020-11-2 逻辑回归 二分类 2.1

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


# 【文件操作】
def addwrite(filename,strr):
    with open(filename,'a+',encoding='utf-8')as f:
        f.write(str(strr))
def cleanfile(filename):
    with open(filename,'w',encoding='utf-8')as f:
        pass

方法一

# 【输入】①数据 ②标记 ③学习率
x=[[1,0],[1,1],[1,2],[1,3]]
y=[[0],[0],[1],[1]]


def Logistic_Regression__in_list_out_list(in_datas__list,in_targets__list,choose_training_times__int,out_times__int):
    '''
    输入“数据集” 和 “每一条数据集对应的标记张量”,
    输入“训练次数” 和 “每多少次输出”
    输出的内容是 “当前训练到第几次” 、“西塔张量【重要】”、“当前得分”、“两次的得分差值”
    return的是“最后的西塔张量”
    '''
    # 得到输入x,y
    x=torch.tensor(in_datas__list)
    y=torch.tensor(in_targets__list)

    # 得到西塔的大小,初始化西塔
    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

    logs=[]
    
    try:
        for times in range(choose_training_times__int):
        #【核心 得分函数求导】
            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
           # 【deerta为前后两次得分函数的差值 】       
            if deerta<=0:
                aefa=0.7*aefa
            if deerta>0:
                if deerta<0.000001:
                    aefa= aefa*1.42
            if aefa>10:
                aefa=10
            po=tensor_to_list(xita)
        # 【输出】
            if times%out_times__int==0:
                q1=times+1
                q2=po
                q3=tensor_to_list(pinggu_xian)
                logs.append([q1,q2,q3])
#                 print(times+1," | 西塔向量:",po," | 得分函数:",tensor_to_list(pinggu_xian),"| 相邻两次提高得分:",tensor_to_list(deerta)," |  \n")
    except:
        pass
    
    return po,tensor_to_list(pinggu_xian),logs

xi,score,logs=Logistic_Regression__in_list_out_list(in_datas__list=x,in_targets__list=y,choose_training_times__int=10000,out_times__int=1000)
for i in logs:
    print(i)
print(xi,score)

方法二

def Logistic_Regression__in_list_out_list(i,xx,yy,aefa,xita,pinggu_qian,pinggu_xian,max_aefa):
    '''
    输入“数据集” 和 “每一条数据集对应的标记张量”,
    输入“训练次数” 和 “每多少次输出”
    输出的内容是 “当前训练到第几次” 、“西塔张量【重要】”、“当前得分”、“两次的得分差值”
    return的是“最后的西塔张量”
    '''
    # 得到输入x,y
    x=torch.tensor(xx)
    y=torch.tensor(yy)


    xita=torch.tensor(xita)
    aefa=aefa
    pinggu_qian=pinggu_qian
    pinggu_xian=pinggu_xian

    log=[]
    
    try:
        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
       # 【deerta为前后两次得分函数的差值 】       
        if deerta<=0:
            aefa=0.7*aefa
        if deerta>0:
            if deerta<0.000001:
                aefa= aefa*1.42
        if aefa>max_aefa:
            aefa=max_aefa
        po=tensor_to_list(xita)
    # 【输出】
        q2=po
        q3=tensor_to_list(pinggu_xian)
#         q3=[str('%.07f'%i) for i in q3]
        log.append([i,q2,q3,aefa])
#                 print(times+1," | 西塔向量:",po," | 得分函数:",tensor_to_list(pinggu_xian),"| 相邻两次提高得分:",tensor_to_list(deerta)," |  \n") 
        log=log[0]
        wrong=0
    except:
        wrong=1
#         pass
#         return xx,yy,aefa,tensor_to_list(xita),float(pinggu_qian),float(pinggu_xian),log
        

    
    return xx,yy,aefa,tensor_to_list(xita),float(pinggu_qian),float(pinggu_xian),log,wrong

x=[[1,0],[1,1],[1,2],[1,3]]
y=[[0],[0],[1],[1]]

# 得到西塔的大小,初始化西塔
xita = (tensor_to_list(torch.rand(1,list(torch.tensor(x).shape)[1]))[0])
aefa=10
pinggu_qian=0
pinggu_xian=0
# cleanfile("data.txt")
for i in range(10000):
    x,y,aefa,xita,pinggu_qian,pinggu_xian,log,wrong=Logistic_Regression__in_list_out_list(i,x,y,aefa,xita,pinggu_qian,pinggu_xian,max_aefa=10)
    if wrong:
        break
#     if i%1000==0:
#         addwrite("data.txt",str(log)+'\n')
    if i%1000==0:
        
        print(log)
#     print(log)
#     with open('da.txt','a+',encoding='utf-8')as f:
#         f.write(str(log))
        
#     print(float('%.5f'%aefa),xita,str('%.05f'%(pinggu_xian-pinggu_qian)),log)
log

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值