Logistic逻辑回归

来源:互联网 发布:nokia5230软件下载 编辑:程序博客网 时间:2024/06/13 21:32

    

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
原创粉丝点击