机器学习:逻辑回归python实现

来源:互联网 发布:爱尔兰留学知乎 编辑:程序博客网 时间:2024/06/06 08:42

                                             机器学习:逻辑回归python实现


     逻辑回归和PLA都可以用来分类,他们之间最大的区别就是,前者对分错的数据进行惩罚的时候是有一定的比率的,也就是说,当前数据分错的越来厉害,那就对当前的数据极大惩罚,要是错的程度小,那就对他的惩罚稍微的小点儿。但是后者PLA就是当前数据如果分对了就不惩罚,分错了就惩罚,没有强度之分。看看下图谈谈损失函数的区别:


       上面的图显示了不同的损失函数:绿色是最小二乘的,他的问题就是在0到1那儿的区间是下降的,因为0右边的就是分对了,那么error当然就是要变小啊。但是1之后却又上升了....蓝色的就是RELU,多用与神经网络,好牛逼吧,速度快,性能好,一直下降。红色的是交叉信息熵,也不错,他的下降速度也很快。黑色的就是PLA中的,但是他不好优化啊,我想变小上面那条线的同时下面那条先也会下降...

       下面是python实现笔记:

<span style="font-size:18px;">from numpy   import *//数据集加载def loadDataSet():    dataMat=[];labelMat=[]    data=open('testSet.txt')    for line in data.readlines():        templine=line.strip().split()//大部分情况需要把数据feature转化为float,标签是int类型        dataMat.append([1,float(templine[0]),float(templine[1])])        labelMat.append(int(templine[2]))    return dataMat,labelMatdef sigmod_func(value):    return 1.0/(1+exp(-value))//梯度上升和下降本质上都一样,一个是对w加上一个微分,一个减去微分//只不过注意的是error是预测减去实际还是相反def grandAscend(data,label):    dataMat=mat(data)//m*n    labelMat=mat(label).transpose()//读进来的lable是一行,当然要转置    m,n=shape(dataMat)    alpha=0.001//学习率    maxEpoch=500    weights=ones((n,1))//初始化权重,高斯会更好n*1,n是特征的个数    for epoch in xrange(maxEpoch):        #print "dataMat",dataMat        #print "weights",weights//m*n X n*1==m*1        resultPrediction=sigmod_func(dataMat*weights)//其实这里同时计算出m个数据的预测值,然后和实际标签做差,并不用循环实现        error=labelMat-resultPrediction//这里才是关键        weights=weights+alpha*dataMat.transpose()*error    return weights</span>

        考虑到速度太慢,因为每次的迭代都要对全部的数据进行训练,数据太多的时候会出问题,就差生了随机梯度下降,他在实际中用得最多。也就是说,根据大数定律,100个数的均值和10个数的均值都差不多,均值本来就是单个数据的整体表示,那就只用一条数据进行训练也是可以到啊。为甚要有均值呢?去看看他的损失函数你就知道了,大部分损失函数都和我们谈到的VC维相关。

     

def SGD(data,label):    dataMat=mat(data)    labelMat=mat(label)    m,n=shape(dataMat)    alpha=0.001    weigths=ones(n)    for i in xrange(m)://<span style="font-family: Arial, Helvetica, sans-serif;">有多少数据,就迭代多少次</span>        print shape(dataMat[i])        print shape(weigths)
        //这里并没有使用举证的乘法,仅仅是使用了一条数据进行每次调整。有多少数据,就迭代多少次        prediction=sigmod_func(sum(dataMat[i]*weigths))        error=labelMat[i]-prediction        weigths= weigths+alpha*error*dataMat[i]    return  weigths

  结果如下图所示;一个梯度下降,一个是随机的:看到其实结果并不怎么滴。两者相差并不大。所以还是下面的方便,速度快。


  另外注意python中list,array,mat的稍微区别:





0 0
原创粉丝点击