您的位置:首页 > 编程语言 > Python开发

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

2016-03-15 18:52 806 查看
机器学习:逻辑回归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,labelMat

def 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的稍微区别:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: