《机器学习实战》——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 举报

相关文章推荐

maven项目切换jdk版本后的注意事项

1、添加jre环境 右键项目-->properties-->java Build Path-->Libraries-->Add Libraries-->JRE syetem Library-->选择新...

Java开发中的23种设计模式详解

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

HDFS详解

摘要 HDFS体系结构中有两类节点,一类是NameNode,又叫"元数据节点";另一类是DataNode,又叫"数据节点"。这两类节点分别承担Master和Worker具体任务的执行节点。 ...

Doctype作用?严格模式与混杂模式如何区分?它们有何差异?

一、Doctype作用是什么? 声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该文件的类型。让浏览器解析器知道应该用哪个规范来解析文档。声明必须在 HTML 文档的第一行,这并不是一个...

深入分析:Fragment与Activity交互的几种方式(一,使用Handler)

这里我不再详细介绍那写比较chang gui

序列的获取

获取序列常用方法为range和xrange 两者都可以以一定的步长获取指定区间内的序列 唯一的区别在于range不可作为元素进行赋值,赋值也是记录这个语句或者对象本身,不会作为列表存在 xrange本...

【分享】PPT--你不知道的使用技巧

1、改后缀提取 PPT 图片 如何快速提取 PPT 中多张图片,保存到本地? 很多人有个习惯,做完 PPT 后,就把制作素材都删了,为了节省存储空间。但这有一个坏处,万一以后还要用到这些素材呢,尤其...

数据可视化matplotlib的应用(四)

创建子plot: import random import matplotlib.pyplot as plt from matplotlib import style style.use('five...

IOS 七种手势详解(动图+Demo下载)

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的博客专栏,这个关于IOS SDK的专栏我会持续更新 IOS SDK详解前言: 触摸是交互的核心,而手势...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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