机器学习:逻辑回归python实现
2016-03-15 18:52
806 查看
机器学习:逻辑回归python实现
逻辑回归和PLA都可以用来分类,他们之间最大的区别就是,前者对分错的数据进行惩罚的时候是有一定的比率的,也就是说,当前数据分错的越来厉害,那就对当前的数据极大惩罚,要是错的程度小,那就对他的惩罚稍微的小点儿。但是后者PLA就是当前数据如果分对了就不惩罚,分错了就惩罚,没有强度之分。看看下图谈谈损失函数的区别:
上面的图显示了不同的损失函数:绿色是最小二乘的,他的问题就是在0到1那儿的区间是下降的,因为0右边的就是分对了,那么error当然就是要变小啊。但是1之后却又上升了....蓝色的就是RELU,多用与神经网络,好牛逼吧,速度快,性能好,一直下降。红色的是交叉信息熵,也不错,他的下降速度也很快。黑色的就是PLA中的,但是他不好优化啊,我想变小上面那条线的同时下面那条先也会下降...
下面是python实现笔记:
考虑到速度太慢,因为每次的迭代都要对全部的数据进行训练,数据太多的时候会出问题,就差生了随机梯度下降,他在实际中用得最多。也就是说,根据大数定律,100个数的均值和10个数的均值都差不多,均值本来就是单个数据的整体表示,那就只用一条数据进行训练也是可以到啊。为甚要有均值呢?去看看他的损失函数你就知道了,大部分损失函数都和我们谈到的VC维相关。
结果如下图所示;一个梯度下降,一个是随机的:看到其实结果并不怎么滴。两者相差并不大。所以还是下面的方便,速度快。
另外注意python中list,array,mat的稍微区别:
逻辑回归和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的稍微区别:
相关文章推荐
- Python图像处理库:PIL中Image,ImageDraw等基本模块介绍
- Python正则表达式集锦
- python中文分词:结巴分词
- Python图表绘制:matplotlib绘图库入门
- 如何用python 写 adb 命令脚本
- OpenGL with PyOpenGL Python and PyGame p.3 - Movement and Navigation
- C#中调用python方法
- python 容器的使用
- 一个简单的抓取中国城市空气质量的python包chinaAQI
- MySQLdb python
- python线程、协程
- python基础一
- Python自定义函数排序
- 12步教你理解Python装饰器
- 两张神图介绍python3和 2.x与 3.x 的区别
- python子进程模块subprocess详解
- python学习 3笔记
- 关于python中,map,reduce,filter,sort函数的用法:
- python3中__get__,__getattr__,__getattribute__的区别
- python学习笔记-Day18 -django(第一部分)