关闭

[置顶] 《机器学习实战》——Logistic回归

标签: 机器学习Logistic回归
1096人阅读 评论(0) 收藏 举报
分类:

这是《机器学习实战》中的第五章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()
1
0
查看评论

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

============================================================================================ 《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记,包含对其中算法的理解和算法的Python代码实现 ...
  • Gamer_gyt
  • Gamer_gyt
  • 2016-04-25 00:13
  • 14442

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

转自:http://lib.csdn.net/article/machinelearning/35245 《机器学习实战》——logistic回归 作者:ztf312 说明:对书中代码错误部分做了修正,可运行于python3.4 基本原理:现在有一些数据点,用一条...
  • Julialove102123
  • Julialove102123
  • 2017-02-16 21:13
  • 611

机器学习实战——Logistic回归

回归概述(个人理解的总结)回归是数学中的一种模拟离散数据点的数学模型的方法,拟合一个连续的函数从而可以对未知的离散数据点进行分类或预测。这种方法有一个统一的形式,给定nn维特征的数据集合,对任意一个数据点Xi={x(1)i,x(2)i,...,x(n)i}X_i=\{x_i^{(1)},x_i^{(...
  • u010487568
  • u010487568
  • 2015-04-30 19:47
  • 1120

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

学习了机器学习实战第五章 这一章用到了最优化方法中的梯度上升法,简单说,梯度上升法基于函数的单调性,我们如果想求得函数的极值,就可以让自变量根据梯度的方向进行变化,这样根据函数的单调性可以保证变化的方向正确而且可以保证效率最高,因为梯度指示的方向相当于山脊的方向,沿梯度方向函数变化是最快的。 以...
  • lvsolo
  • lvsolo
  • 2016-03-23 20:19
  • 955

PYTHON机器学习实战——逻辑回归

逻辑回归 其实是分类问题。 从这节算是开始进入“正规”的机器学习了吧,之所以“正规”因为它开始要建立价值函数(cost function), 接着优化价值函数求出权重,然后测试验证。这整套的流程是机器学习必经环节。 今天要学习的话题是逻辑回归,逻辑回归也是一种有监督学习方法(supervi...
  • xiaoxiaowenqiang
  • xiaoxiaowenqiang
  • 2017-08-05 20:30
  • 228

【机器学习-实战】逻辑回归学习心得

1、对于理论推导部分,建立基本概念,但是不要求去实现和非常完美的理解过程,甚至可以不求胜解。       从程序员入门机器学习,因为大学数学没学好,理论部分其实比较难,但是我的想法是理论上可以记住结论。重点是要写代码去感受过程。《机器学习-实战》第5章,把代码都实现了...
  • springtty
  • springtty
  • 2018-01-20 20:35
  • 27

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

1:简单概念描述 假设现在有一些数据点,我们用一条直线对这些点进行拟合(改线称为最佳拟合直线),这个拟合过程就称为回归。训练分类器就是为了寻找最佳拟合参数,使用的是最优化算法。 基于sigmoid函数分类:logistic回归想要的函数能够接受所有的输入然后预测出类别。这个函数就是sigmoid函数...
  • Lu597203933
  • Lu597203933
  • 2014-08-10 11:12
  • 19129

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

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)zouxy09@qq.comhttp://blog.csdn.net/zouxy09        机器学习算法与Python实践这个系列主要是参考《机器学习实战...
  • zouxy09
  • zouxy09
  • 2014-03-02 23:49
  • 203860

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

机器学习总结之逻辑回归Logistic Regression 逻辑回归logistic regression,虽然名字是回归,但是实际上它是处理分类问题的算法。简单的说回归问题和分类问题如下: 回归问题:预测一个连续的输出。 分类问题:离散输出,比如二分类问题输出0或1. 逻辑回归常用于垃圾邮件分类...
  • HUSTLX
  • HUSTLX
  • 2016-04-14 17:01
  • 2347

机器学习实战.mobi

  • 2016-01-26 16:14
  • 12.00MB
  • 下载
    个人资料
    • 访问:155576次
    • 积分:4928
    • 等级:
    • 排名:第6843名
    • 原创:329篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论