Logistic逻辑回归


    

1.二分类问题选择sigmoid函数


如果将上面的函数扩展到多维空间,并且加上参数,则函数变成:







是求最大值的问题,这次使用梯度上升法(梯度上升法是用来求函数的最大值,梯度下降法是用来求函数的最小值)。梯度上升法的的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻,这样梯度算子总是指向函数增长最快的方向:bubuko.com,布布扣,a为每次上升移动的步长,bubuko.com,布布扣是f(w)的导数。

下来呢,为了求bubuko.com,布布扣




再由:

wKioL1TEnT-xsSdfAABva83f19A126.jpg

可得:

wKiom1TEnGPTqcd8AAAxlx9xE7w874.jpg

接下来就剩下第三部分:

 wKioL1TEnT_jreuTAAA53p9A8ec077.jpg

(这个公式应该很容易理解,简单的偏导公式)

还有就是:

wKioL1TEnwPzRXsWAAAtwFC_Y7M157.jpg

综合三部分即得到:

wKiom1TEnGTAhlbMAAAfcirD1mM147.jpg

 

因此,梯度迭代公式为:

wKiom1TEnGSDl1JuAAAqXOo511s178.jpg

      以上部分内容引用:标题:Logistic 回归与梯度上升算法

               作者:

sbp810050504 的BLOG

               http://sbp810050504.blog.51cto.com/2799422/1608064

from numpy import *
def loaddata():#数据集
    datamat=[];labels=[]
    fr=open('D:/DATA/python/机器学习/machinelearninginaction/Ch05/testSet.txt')
    for i in fr.readlines():
        linearr=i.strip().split()
        datamat.append([1.0,float(linearr[0]),float(linearr[1])])
        labels.append(float(linearr[2]))
    return datamat,labels
    
def sigmod(inx):#sigmoid函数   
    return 1.0/(1+exp(-inx))
#梯度上升    
def gradascen(datamatin,classlabel):
    datamatrix=mat(datamatin)
    labelmat=mat(classlabel).transpose()
    m,n=shape(datamatrix)
    wight=ones((n,1))
    maxcy=500
    alpha=0.001
    for k in range(maxcy):
        h=sigmod(datamatrix*wight)
        error=labelmat-h
        wight=wight+alpha*datamatrix.transpose()*error
    return wight
    
def stocgradscen(dataatin,classlabel):
    m,n=shape(dataatin)
    weight=ones(n)
    alpha=0.001
    for i in range(m):
        h=sigmod(sum(datamatrix[i],weight))
        error=classlabel[i]-h
        weight=weight+alpha*error*dataatin[i]
    return weight
#随机梯度上升    
def stocgradscen1(datamatin,classlabel,numlter=150):
    m,n=shape(datamatin)
    weight=ones(n)
    for j in range(numlter):
        dataindex=list(range(m))
        for i in range(m):
            alpha=4/(1.0+i+j)+0.0001#步长
            randindex=int(random.uniform(0,len(dataindex)))
            h=sigmod(sum(datamatin[randindex]*weight))#计算预测标签
            error=classlabel[randindex]-h#实际减去预测
            weight=weight+alpha*error*datamatin[randindex]#求取系数w
            del (dataindex[randindex])
    return weight
#分类        
def classifyvector(inx,weight):
    prob=sigmod(sum(inx*weight))
    if prob>0.5:return 1.0
    else:return 0.0
#完整例子
def colictest():
    frtrain=open('D:/DATA/python/机器学习/machinelearninginaction/Ch05/horseColicTraining.txt')
    frtest=open('D:/DATA/python/机器学习/machinelearninginaction/Ch05/horseColicTest.txt')
    traindata=[];trainlabel=[]
    for line in frtrain.readlines():
        curline=line.strip().split('\t')
        linarr=[]
        for i in range(21):
            linarr.append(float(curline[i]))#注意数据格式
        traindata.append(linarr)
        trainlabel.append(float(curline[21]))
    weight=stocgradscen1(array(traindata),trainlabel,1000)#计算系数w
    numcishu=0.0;error=0.0
    for line in frtest.readlines():
        numcishu+=1#计数
        curline=line.strip().split('\t')
        linearr1=[]
        for i in range(21):
            linearr1.append(float(curline[i]))
        if int(classifyvector(array(linearr1),weight)) !=int(curline[21]):
            error+=1#计算错误率
    print('the error is:%f'% float(error/numcishu))
    return error
    
def mulitest():
    numshuzi=10
    errorsum=0.0
    for i in range(10):#进行多次计算错误率,看是否收敛
        errorsum+=colictest()
    print ('after %d iterations the average error is:%f'%(numshuzi,errorsum/numshuzi))
    



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值