【十】机器学习之路——logistic回归python实现

  前面一个博客机器学习之路——logistic回归讲了logistic回归的理论知识,现在咱们来看一下logistic回归如何用python来实现,代码、数据参考《机器学习实战》。

  首先看下我们要处理的数据,

【十】机器学习之路——logistic回归python实现_第1张图片


我们要做的就是通过logistic回归的方法,拟合一条曲线将红色和绿色的点区分开来。话不多说,直接上代码,代码里我已经尽可能的加了注释,让大家更容易看懂:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#上两行代码作用是可以在注释里写中文
import numpy as np
import matplotlib.pyplot as plt

#将测试数据导入
def loadDataSet ():
    dataMat = []; labelMat = []#dataMat为X输入数据,labelMat为输出0,1数据
    fr = open('/Users/cailei/Cai_Lei/AI/MachineLearning_data/Ch05/testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        #移除头尾指定字符,并将数据分割为不同部分
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])#令X0=1.0,X1为第一列数据,X2为第二列数据
        labelMat.append(int(lineArr[2]))
        #将第三列数据赋值为输出数据
    #print(dataMat)
    return dataMat,labelMat

#定义Sigmond函数
def sigmoid (inX):
    return 1.0/(1+np.exp(-inX))

#定义梯度上升函数
def gradAscent(dataMatIn,classLabels):
    dataMatrix = np.mat(dataMatIn)#将X数据转换为矩阵处理
    labelMat = np.mat(classLabels).transpose()
    #将输出数据0,1转换为矩阵并转置
    m,n=np.shape(dataMatIn)
    #输出dataMatIn矩阵维度,m=100行数据,n=3三列
    alpha=0.01
    maxCycle=500
    weights=np.ones((n,1)) 
    #定义w0,w1,w2初值为1,这里用一个3*1的矩阵表示
    for k in range(maxCycle):
        h = sigmoid(dataMatrix*weights) 
        #这里输出X0,X1,X2代入到Sigmond的函数结果
        error=labelMat-h #这里计算(h(x)-y)*x里的h(x)-y
        weights=weights + alpha * dataMatrix.transpose()*error
        #这里进行w0,w1,w2权重的迭代计算,由于error是一个100*1列向量,dataMatrix是一个100*3的向量,因此相乘的话需要将dataMatrix进行转置
    print(weights)
    return weights

#将拟合结果图形和数据用plot函数显示
def plotBestFit(weights):
    dataMat,labelMat=loadDataSet()
    dataArr = np.array(dataMat)
    #将dataMat转换为一个array,不懂的同学可以参考下面介绍的链接
    n = np.shape(dataArr)[0]
    #读取第一维的长度,则shape函数后面加[0],其实我们知道共100组数据,这里可以直接将n赋值100
    xcord1 = []; ycord1 = []
    xcord2 = []; ycord2 = []
    #将数据分组,输出为0的一组,输出为1的一组
    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 = np.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()

def run():
    dataArr,labelMat=loadDataSet()
    weights=gradAscent(dataArr,labelMat)
    plotBestFit(weights.getA())

if __name__ == '__main__':
    run()


  最终输出的拟合曲线如下图所示:

【十】机器学习之路——logistic回归python实现_第2张图片


  代码里涉及到一些python的矩阵、数组的处理等,初学python的同学可能会看的不太懂,append(),shape(),split()等一些函数的使用,网上有很多资源可以搜到,这里不一一叙述。在写代码的时候我也碰到了一些函数使用细节上的问题,打算下个博客写一个python里矩阵数组基本运算的一些函数的讲解,尽请期待。

你可能感兴趣的:(机器学习)