《机器学习实战》——Logistic回归

原创 2017年03月04日 11:32:53

这是《机器学习实战》中的第五章Logistic回归知识的整理以及自己的一些私人理解,之后运用原理对周志华的《机器学习》中的西瓜数据进行分类。(PS:因为上述两本书以及网易公开课上的斯坦福的机器学习视频都在同时看,所以博客可能有点杂。)最后希望给一起学习机器学习的同学一些帮助。资源也已经上传了,名称叫做Logistic回归笔记及代码。链接为:http://download.csdn.net/detail/qq_30091945/9770127如果有人要转载,请注明:http://blog.csdn.net/qq_30091945


这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
《机器需学习实战》中的代码如下:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import numpy as np
import matplotlib.pyplot as plt

def sigmiod(x):
    '''
        Logistic回归模型的Sigmiod函数
    '''
    function = 1.0/(1+np.exp(-x))
    return function

def loadDataSet():
    '''
        这是进行加载数据的函数
        strip()是删除\t,\n,\r,' '的方法
    '''
    dataMat = []
    labelMat = []
    f = open("C:\\Users\\Administrator\\Desktop\\machinelearninginaction\\Ch05\\testSet.txt")
    for line in f.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat

def gradAscent(dataMatIn,classLabels,alpha,maxCycles):
    """
        这是梯度上升算法的函数
        alpha梯度上升算法中的学习系数 
        maxCycles进行迭代的最大次数
    """

    '''
        把数据转换成Numpy矩阵
    '''
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()

    m,n = np.shape(dataMatrix)          #m,n是测试数据的行数与列数
    weights = np.ones((n,1))
    for k in range(maxCycles):
        h = sigmiod(dataMatrix*weights)
        error = (labelMat-h)
        weights = weights + alpha *dataMatrix.transpose()*error
    return weights

def RandomGradAscent(dataMatIn,classLabels,maxCycles):
    m,n = np.shape(dataMatIn)
    weights = np.ones(n)
    for j in range(maxCycles):
        dataIndex = np.arange(m)
        for i in range(m):
            alpha = 4/(1.0+i+j)+0.001
            randomIndex = int(np.random.uniform(0,len(dataIndex)))
            h = sigmiod(sum(dataMatIn[randomIndex]*weights))
            error = classLabels[randomIndex] - h
            weights = weights + alpha * error * dataMatIn[randomIndex]
            np.delete(dataIndex,dataIndex[randomIndex])
    return weights

def plotBestFit(weights):
    '''
        这是数据可视化的函数
        画最佳拟合直线
    '''

    dataMat,labelMat = loadDataSet()
    print("最佳系数为:")
    print(weights)

    dataArr = np.mat(dataMat)
    n = np.shape(dataArr)[0]

    """
        x1,y1存放分类为1的数据
        x2,y2存放分类为0的数据
    """

    x1 = []
    y1 = []
    x2 = []
    y2 = []
    for i in range(n):
        if int(labelMat[i]) == 1:
            x1.append(dataArr[i,1])
            y1.append(dataArr[i,2])
        else:
            x2.append(dataArr[i,1])
            y2.append(dataArr[i,2])

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x1,y1,s = 30,c='red',marker = 's')
    ax.scatter(x2,y2,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,c='blue')
    plt.xlabel("X1")
    plt.ylabel("X2")
    plt.show()

def run_main():
    '''
        这是主函数
    '''

    dataMat,labelMat = loadDataSet()

    """
        下面是梯度上升算法得到的分类
    """
    weights1 = gradAscent(dataMat,labelMat,0.001,1000)
    plotBestFit(weights1.getA())

    """
        下面是随机梯度上升算法得到的分类
    """
    weights2 = RandomGradAscent(np.array(dataMat),labelMat,1000)
    plotBestFit(weights2)

if __name__ == '__main__':
    run_main()

这里写图片描述
这里写图片描述


下面是运用Logistic回归算法对周志华的《机器学习》中的西瓜数据集进行分类的代码(PS:遗憾的是把迭代次数换了又换但最低的错误率都有将近30%,想了一下,毕竟西瓜数据只有17组,而且我只选取了其中密度以及含糖率两个特征,造成误差很大也在所难免了。)

# -*- coding: utf-8 -*-
"""
Created on Fri Mar  3 14:15:43 2017

@author: Administrator
"""

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    '''
        Sigmiod函数
    '''
    function = 1.0/(1+np.exp(-x))
    return function

def LoadDataSet():
    '''
        导入西瓜数据
    '''
    file = 'D:\\Program Files (x86)\\机器学习\\周志华机器学习\\WatermelonDataSet.txt'
    ftrain = open(file)
    trainingset = []
    labelset = []
    for line in ftrain.readlines():
        LineArr = line.strip().split(',')
        trainingset.append([1.0,float(LineArr[7]),float(LineArr[8])])
        if ("是" == LineArr[9]):
            labelset.append(1.0)
        else:
            labelset.append(0.0)
    return trainingset, labelset

def RandomGradDscent(trainingset,labelset,maxcircle):
    '''
        随机梯度下降算法函数
        alpha是学习速率,maxcircle是迭代次数
        trainingset是训练数据集,labelset是数据对应的标记集
    '''
    row,col = np.shape(trainingset)
    weights = np.ones(col)
    for j in range(maxcircle):
        DataIndex = np.arange(row)
        for i in range(row):
            alpha = 4.0/(i+j+1.0) + 0.01
            randomindex = int(np.random.uniform(0,len(DataIndex)))
            h = sigmoid(sum(trainingset[randomindex]*weights))
            error = labelset[randomindex] - h
            weights = weights + alpha * trainingset[randomindex]*error
            np.delete(DataIndex,DataIndex[randomindex])
    return weights

def plotBestFit(weights):
    '''
        这是数据可视化的函数
        画最佳拟合直线
    '''

    trainingset,labelset = LoadDataSet()

    dataArr = np.mat(trainingset)
    n = np.shape(dataArr)[0]

    """
        x1,y1存放分类为1的数据
        x2,y2存放分类为0的数据
    """

    x1 = []
    y1 = []
    x2 = []
    y2 = []
    for i in range(n):
        if int(labelset[i]) == 1:
            x1.append(dataArr[i,1])
            y1.append(dataArr[i,2])
        else:
            x2.append(dataArr[i,1])
            y2.append(dataArr[i,2])

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x1,y1,s = 30,c='red',marker = 's')
    ax.scatter(x2,y2,s = 30,c='green')
    x = np.arange(0.0,1.0,0.1)
    y = (-weights[0]-weights[1]*x)/weights[2]
    ax.plot(x,y,c='blue')
    plt.xlabel("X1")
    plt.ylabel("X2")
    plt.show()

def ClassifyVector(X,weights):
    """
        判断分类的函数
    """
    result = sigmoid(sum(X*weights))
    flag = 0;
    if result > 0.5:
        flag = 1;
    else:
        flag = 0;
    return flag

def ErrorRate(trainingset,weights,labelset,maxcircle):
    errorcount = 0
    n = np.shape(trainingset)[0]
    for i in range(n):
        if ClassifyVector(np.array(trainingset[i]),weights) != labelset[i]:
            errorcount = errorcount + 1
    errorrate = errorcount*1.0/n
    return errorrate

def gradAscent(dataMatIn,classLabels,alpha,maxCycles):
    """
        这是梯度上升算法的函数
        alpha梯度上升算法中的学习系数 
        maxCycles进行迭代的最大次数
    """

    '''
        把数据转换成Numpy矩阵
    '''
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()

    m,n = np.shape(dataMatrix)          #m,n是测试数据的行数与列数
    weights = np.ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)
        error = (labelMat-h)
        weights = weights + alpha *dataMatrix.transpose()*error
    return weights

def run_main():
    """
        这是主函数
    """
    trainingset,labelset = LoadDataSet()
    maxcircle1 = np.arange(150,300,5)
    maxcircle2 = np.arange(500,580,5)


    print("以下是应用随机梯度上升算法的分类")
    for i in maxcircle1:
        weights = RandomGradDscent(np.array(trainingset),labelset,i)
        print("最佳系数为:")
        print(weights)
        errorrate = ErrorRate(trainingset,weights,labelset,i)
        print("迭代次数为%d时,错误率为:%f" %(i,errorrate))
        plotBestFit(weights)

    print("以下是应用梯度上升算法的分类")
    for i in maxcircle2:
        weights = gradAscent(trainingset,labelset,0.001,i)
        print("最佳系数为:")
        print(weights)
        errorrate = ErrorRate(trainingset,weights,labelset,i)
        print("迭代次数为%d时,错误率为:%f" %(i,errorrate))
        plotBestFit(weights.getA())

if __name__ == '__main__':
    run_main()
版权声明:本文为博主原创文章,若需转载,请注明http://blog.csdn.net/qq_30091945

相关文章推荐

机器学习实战——第五章:Logistic回归

本系列目的在于总结每一个分类器的特点(优点、缺点、使用数据类型、使用时的注意事项等)。相关代码自己搜。 python:建议使用2.7 python常用函数库:NumPy、scikit-le...
  • mmc2015
  • mmc2015
  • 2015年05月17日 10:29
  • 815

决策树ID3基本代码,周志华《机器学习》练习

# -*- coding: utf-8 -*- """ Created on Wed Dec 28 09:33:11 2016 @author: ZQ """ import numpy as np ...

机器学习(周志华)习题解答4.3: Python小白详解ID3决策树的实现

我是刚刚学python,所以尽我所能十分详细地解释了几乎每个步骤……希望和我一样的新手可以从中获益。本文以周志华《机器学习》习题4.3为例,用python实现了ID3决策树的构建和绘图。...

《机器学习实战》笔记之五——Logistic回归

第五章 Logistic回归 回归:对一些数据点,算法训练出直线参数,得到最佳拟合直线,能够对这些点很好的拟合。 训练分类器主要是寻找最佳拟合参数,故为最优化算法。 5.1 基于Logisti...

机器学习实战笔记5(logistic回归)

1:简单概念描述 假设现在有一些数据点,我们用一条直线对这些点进行拟合(改线称为最佳拟合直线),这个拟合过程就称为回归。训练分类器就是为了寻找最佳拟合参数,使用的是最优化算法。 基于sigmoid函数...

《机器学习实战》Logistic回归算法(1)

============================================================================================ 《机器学习实战...

机器学习实战(四)——logisticRegression逻辑回归

学习了机器学习实战第五章 这一章用到了最优化方法中的梯度上升法,简单说,梯度上升法基于函数的单调性,我们如果想求得函数的极值,就可以让自变量根据梯度的方向进行变化,这样根据函数的单调性可以保证变化的...
  • lvsolo
  • lvsolo
  • 2016年03月23日 20:19
  • 635

机器学习实战笔记之五(Logistic 回归)

Logistic 回归的一般过程 收集数据:采用任意方法收集数据。 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式最佳。 分析数据:采用任意方法对数据进行分析。 训练算...
  • newfayi
  • newfayi
  • 2015年11月17日 21:15
  • 4073

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)zouxy09@qq.comhttp://blog.csdn.net/zouxy09        机器学习算法...
  • zouxy09
  • zouxy09
  • 2014年03月02日 23:49
  • 185734

机器学习总结二:逻辑回归Logistic Regression

机器学习总结之逻辑回归Logistic Regression 逻辑回归logistic regression,虽然名字是回归,但是实际上它是处理分类问题的算法。简单的说回归问题和分类问题如下: 回归问...
  • HUSTLX
  • HUSTLX
  • 2016年04月14日 17:01
  • 1951
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《机器学习实战》——Logistic回归
举报原因:
原因补充:

(最多只允许输入30个字)