机器学习手记[10]--logistic回归和python实现

logstic回归


logistic的基本是线性回归。

一、线性回归
目的就是尽量的使得线和真实数据的差距最小,这也是评价拟合程度的标准。
1 数学方法:
以均值误差衡量方法作为误差函数,误差函数=求和((WTX-y)的平方)
误差最小的时候,是极值点,因此误差函数关于权重矩阵W的导数为0
通过这个方法计算w矩阵=inverse((xTx))*x.T*y


2 梯度下降法:也就是说误差函数,关于矩阵w的变化,是个二次凸曲线,越向低处走,误差最小处走,其实梯度就越低,我们可以不断用w试探,慢慢获取低梯度,直到梯度收敛不变的时候就是最低点的时候
所以误差函数的梯度变化就是我们的判断的标准和方向


二、logstic回归
目的不再是使得线和点数据集尽可能靠近,而是依据线和点数据的距离判断属于某类的分类的概率。
1 如果距离很远,那么概率=1
2 如果距离为0,那么正好在线上,判定就是五五开
3 如果距离是反向的那么肯定是往返方向走了,那么概率就趋近与0
上面这个假设是基于二值满足伯努利分布的。
p(类别为0的概率)=sigmoid(wTx-y)
p(类别为1的概率)=1-sigmoid(wTx-y)
其中sigmoid函数,也即f(x)=1/(1-e的-x次方),能够将距离投射到0-1区间。
距离通过sigmoid函数得到的0-1之间的值,其实就是属于某个类的概率


logistic回归的理论基础和线性回归是相同的,只是在特征结果表示中加了投射函数而已,利用的方式不一样而已。


要注意的是logistic函数的误差函数的计算
从大脑的第一反应来看,我们可以根据分类的概率和实际分类情况计算误差,
比如我们计算例子a属于1类的概率是0.7,实际上我们的数据就是1,那么我们的误差就是1-0.7=0.3
costfunction-F(w)=sum(sigmoid(wTx-y)-y)=sum(h(x)-y)


但是其实logistic回归的误差函数不像线性回归那样是凸二次的,
因为logistic是非线性函数,非要按上述方法计算costfunction和梯度,那么它的曲线是非凸二次函数,如图所示,它的极值点不唯一
这样我们用梯度法求得的只能是局部极值,不是全局极值


我们通过log函数,可以计算新的误差函数,如下
y=1时,-log(h(x))
y=0时,-log(1-h(x))
整合起来就是
J=-1/m*sum([ y*log(h(x))+(1-y)log(1-h(x))])
求得梯度计算公式
w=w + alpha *(y-h(x)) *x 
含义就是
w+= alpha*(计算和实际的差距)*计算所用的输入数据x
具体代码可见下面


三、logistic实现

数据集格式

-0.017612 14.0530640
-1.395634 4.6625411
-0.752157 6.5386200
-1.322371 7.1528530
0.423363 11.0546770
0.406704 7.0673351
0.667394 12.7414520
-2.460150 6.8668051
0.569411 9.5487550
-0.026632 10.4277430


# -*- coding: utf-8 -*-
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet():
    f=open('testSet.txt')
    dataMat=[]
    labelMat=[]
    for line in f.readlines():
        lineList=line.strip().split()
        dataMat.append([1.0,float(lineList[0]),float(lineList[1])])
        labelMat.append(int(lineList[2]))
    return dataMat,labelMat
    
def sigmoid(x):
   return 1/(1+exp(-x))
   
def gradAscent(dataMat,labelMat):
    dataMat=mat(dataMat)  
    labelMat=mat(labelMat).T
    r,c=shape(dataMat)
    alpha=0.001
    maxIteration=500
    w=ones((c,1))
    for k in range(maxIteration):
        h=sigmoid(dataMat*w)
        error=labelMat-h        
        w=w+alpha*dataMat.T*error #梯度下降法的关键
    return w
    
        
def plotBestFit(weights):
    import matplotlib.pyplot as plt
    dataMat,labelMat=loadDataSet()
    dataArr = array(dataMat)
    n = shape(dataArr)[0] 
    xcord1 = []; ycord1 = []
    xcord2 = []; ycord2 = []
    for i in range(n):
        if int(labelMat[i])== 1:
            xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
        else:
            xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
    ax.scatter(xcord2, ycord2, s=30, c='green')
    x = arange(-3.0, 3.0, 0.1)
    y = (-weights[0]-weights[1]*x)/weights[2]
    ax.plot(x, y)
    plt.xlabel('X1'); plt.ylabel('X2');
    plt.show()

四、参考资料

<机器学习实战-logistic回归>

Andrew Ng机器学习视频公开课笔记 http://blog.csdn.net/linuxcumt/article/details/8572746

你可能感兴趣的:(机器学习手记[10]--logistic回归和python实现)