【机器学习实战】Logistic回归 总结与思考

【机器学习实战】Logistic回归

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

Logistic原理简单解释

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

根据现有数据对分类边界线建立回归公式,以此进行分类

--《机器学习实战》P73

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

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

  1. 建立该模型的代价方程Cost function $$ Cost function = f(z) - y $$
  2. 通过对代价方程求导,利用
    $$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(文件地址)
    开始的时候一直不好使,总说找不到,后来直接在VS code 左侧框选择复制地址过来才有效

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

不进行重复造轮子,直接贴别人写好的: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)$

未完待续

转载于:https://www.cnblogs.com/Zach-Xue/p/10243212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值