【机器学习实战】Logistic回归
全部程序均是依照《机器学习实战》书写,然后进行了一些修改(顺便巩固python)
Logistic原理简单解释
作者在书中这样描述Logistic回归
根据现有数据对分类边界线建立回归公式,以此进行分类
--《机器学习实战》P73
这本书对于理论的东西介绍的实在不算多,读到现在感觉作者想保持的状态时在不影响编程基础上尽可能的少,十分照顾我这种数学渣。
简单的说,所谓Logistic回归其实就是
- 建立该模型的代价方程
Cost function$$ Cost function = f(z) - y $$ - 通过对代价方程求导,利用
$$w = w \pm \alpha \Delta f(w)$$
求极值来优化参数,使参数更好的反应总体情况
程序抄写与思考
程序剖析
数据载入
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(文件地址)
for line in fr.readlines()
开始的时候一直不好使,总说找不到,后来直接在VS code 左侧框选择复制地址过来才有效- python中主要有三种读取文件内容方式:
- read()
- readline()
- readlines()
- python中主要有三种读取文件内容方式:
不进行重复造轮子,直接贴别人写好的:Python中read()、readline()和readlines()三者间的区别和用法
- 输入文字处理
strip函数
简单的使用方法为
strip([chars])
移除字符串首尾特定的的字符$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形式如下:
$$
\left[
\begin{matrix}
x_{00} & x_{01} & x_{02}
x_{10} & x_{11} & x_{12}
x_{n0} & x_{n1} & x_{n2}
\end{matrix}
\right]
$$
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}
\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}
label[n] - \theta_{0} * x_{n0} + \theta_{1} * x_{n1} + \theta_{2} *x_{n2}
\end{matrix}
\right]
$$
求参数核心的一行是:
weights = weights + alpha * dataMatrix.transpose() * error
回顾上文提到的优化参数方法$w = w \pm \alpha \Delta f(w)$
未完待续