logistic 回归

来源:互联网 发布:java初中高级工程师 编辑:程序博客网 时间:2024/06/11 09:13

Logist回归  “对数几率回归” ;实际是一种分类学习方法

优点 1、直接对分类可能性进行建模,无需事先假设数据分布,避免了假设分布不准确所带来的问题;

        2、不仅预测出类别,而且可以得到近似概率预测,对许多需要利用概率辅助决策的任务很有用;

        3、对率函数是任意阶可导凸函数

1、模型

对数几率函数:一种sigmoid 函数

                                                                       (1)

转换成广义线性模型 变成   

                                ;                               (2)

 进一步

                                                     (3)


若将y视为样本x作为正例的可能性,1-y是其反例的可能性,两者比值,就是“几率” (odds)。反映了x作为正例的相对可能性。

通过数据计算出对数几率,然后带入到(1) 中,得到 y的值,就是当前分类器对y的分类结果。通过一系列的优化过程最终得到一个好的分类器,

即好的权重和偏置,能够把正例和反例尽可能多的分开。

2、策略

    损失函数,目标是求最小值:

                                                                     (4)

    需要找到最佳参数即找到最佳权重和偏置使得f(x)的取值与y最接近。

3、算法

    优化器最基本的是梯度下降算法 。这里讲的很清楚了

    http://www.ishowcode.com/ai/ml/linear-regression-gradient-descent/                 


**实验部分  参照《机器学习实战》第五章 Logistic 回归部分进行。

1、数据集使用 西瓜数据集3.0a ----西瓜数据集汇总    http://whatbeg.com/2016/04/22/xiguadataset.html

     17个样本,8个正例,9个反例。共两列属性,密度、含糖率;

2.导入数据集     

 

def loadDataSet():    dataMat=[]    labelMat=[]    fr = open('dataset/watermelon.txt')    for line in fr.readlines():        lineArr = line.strip().split(" ")        if(len(lineArr)<3):            continue        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])#第一项是偏置b        labelMat.append(int(lineArr[2]))    return dataMat,labelMatdef sigmoid(inX):    return 1.0/(1+exp(-inX))

  这里粗心大意遇到了几个坑

    1)  readlines()  写成了 readline() 这两个函数的功能差距还是很大的。

         readline() 读一行,readlines()依次读取每一行

    2)在文件的最后多加了回车,然后readlines()依然会把空行读入作为一行。但是这一行没有数据,所以在切分数据之后,按数组下标获取数据时,会报错:List index out of range.  所以在切分数据后加入判断,若当前行没有切分出足够长度的list 则continue.

   3)看到数据在文件中是浮点型,想当然的认为,读入的数据也是浮点型。其实读入之后,切分到list中,都是string型。所以在append的时候一定要将获取到的数据转为float.

未完。。。