【机器学习实战】Logistic回归(一)

【机器学习实战】Logistic回归


全部程序均是依照《机器学习实战》书写,然后进行了一些修改(顺便巩固python)


Logistic原理简单解释

作者在书中这样描述Logistic回归

根据现有数据对分类边界线建立回归公式,以此进行分类
--《机器学习实战》P73

这本书对于理论的东西介绍的实在不算多,读到现在感觉作者想保持的状态时在不影响编程基础上尽可能的少,十分照顾我这种数学渣。

简单的说,所谓Logistic回归其实就是

  1. 建立该模型的代价方程Cost function
  2. 通过对代价方程求导,利用

    求极值来优化参数,使参数更好的反应总体情况

程序抄写与思考

程序剖析

数据载入

def loadDataSet():
    dataMat = []
    labelMat = []
    fr = open('/Users/macbookair/Documents/python/logRegres/testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat
  • 文件打开

    open(文件地址)
    

开始的时候一直不好使,总说找不到,后来直接在VS code 左侧框选择复制地址过来才有效

for line in fr.readlines()
- python中主要有三种读取文件内容方式:
    - read()
    - readline()
    - readlines()

不进行重复造轮子,直接贴别人写好的:
Python中read()、readline()和readlines()三者间的区别和用法

  • 输入文字处理
    • strip函数
      简单的使用方法为

          strip([chars])
      

      移除字符串首尾特定的的字符,默认为空格

    • split函数

      简单使用为:

           str.split(str="", num=string.count(str))
      

      str:分割符,默认所有分割符
      num:分割次数,默认为-1,即分割所有

Logisitic核心程序

from numpy import *

def sigmoid(inX):       #�定义函数f()
    return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn,classLabels):  #这里采用了梯度上升
                                        #其实无所谓了,主要保证的是取到极值
    dataMatrix = mat(dataMatIn) #转换为Numpy矩阵
    labelMat = mat(classLabels).transpose() #transpose()进行转置
    m,n = shape(dataMatrix) #返回矩阵行、列数
    alpha = 0.001   #设置步长
    maxCycles = 500 
    weights = ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = labelMat - h
        weights = weights + alpha * dataMatrix.transpose() * error  
        #书上没有提如何得来的,后面猜一猜
    return weights


dataMatrix形式如下:

h形式如下:

\left[ \begin{matrix}\theta_{0} * x_{00} + \theta_{1} * x_{01} + \theta_{2} * x_{02}\\ \theta_{0} * x_{10} + \theta_{1} *x_{11} +\theta_{2} *x_{12}\\ \vdots \\\theta_{0} *x_{n0} + \theta_{1} * x_{n1} + \theta_{2} * x_{n2} \end{matrix} \right]

则error形式便很好得出:

\left[ \begin{matrix}label[0] - \theta_{0} *x_{00} - \theta_{1} * x_{01} - \theta_{2} * x_{02}\\label[1] - \theta_{0} * x_{10} - \theta_{1} *x_{11} -\theta_{2} *x_{12}\\ \vdots \\label[n] - \theta_{0} * x_{n0} - \theta_{1} * x_{n1} - \theta_{2} *x_{n2}\end{matrix} \right]

求参数核心的一行是:

    weights = weights + alpha * dataMatrix.transpose() * error 

回顾上文提到的优化参数方法

由可知,

剩余的可见Logistic回归(二)

你可能感兴趣的:(【机器学习实战】Logistic回归(一))