Machine Learning in Action -- Logistic regression

这个系列,重点关注如何实现,至于算法基础,参考Andrew的公开课

相较于线性回归,logistic回归更适合用于分类

因为他使用Sigmoid函数,因为分类的取值是0,1

对于分类,最完美和自然的函数,当然是Heaviside step function,即0-1阶跃函数,但是这个函数中数学上有时候比较难处理

所以用Sigmoid函数来近似模拟阶跃函数,

可以看到Sigmoid在增大坐标尺度后,已经比较接近于阶跃函数

其中,

而logistic回归就是要根据训练集找到,最优的w向量

下面就通过源码来看看如何用梯度下降来解logistic问题,

def loadDataSet():
    dataMat = []; labelMat = []  #数组
    fr = open('testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #加入一个数据点,其中‘1.0’代表截距
        labelMat.append(int(lineArr[2])) #每个数据点的lable,用于训练
    return dataMat,labelMat

def sigmoid(inX):
    return 1.0/(1+exp(-inX))

def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)  #首先将array转换为matrix
    labelMat = mat(classLabels).transpose()  #将lables转秩,因为一个lable对应于dataMatrix中的一行,即一个数据点
    m,n = shape(dataMatrix)
    alpha = 0.001   #学习率
    maxCycles = 500  #迭代次数
    weights = ones((n,1))   #初始化weights向量
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weights)  #这里是矩阵计算,最终h是个列向量,表示每个数据点的预估值
        error = (labelMat - h)  #和真实值比较,算出error列向量
        weights = weights + alpha * dataMatrix.transpose()* error #这个公式是通过梯度下降推导出来的
    return weights #获得最终的weights参数

这里需要注意,numpy支持矩阵计算,所以

h = sigmoid(dataMatrix*weights), 其实是完成n×m矩阵和n×1矩阵乘,然后执行n次sigmoid,得到h列向量

至于那个公式,是由于由梯度下降求出的weight迭代公式如下,

得到weights后,进行predict很容易,直接把数据点和weights代入sigmoid函数算出h,以0.5为界近似成0或1

这种原始的梯度下降算法的问题,就是计算量比较大,对于每个weight的迭代都需要遍历数据集一遍,所以如果weight和数据集比较大,很低效

 

stochastic gradient ascent

对于随机梯度下降,每次只用一个数据点来迭代weights

def stocGradAscent0(dataMatrix, classLabels):
    m,n = shape(dataMatrix)
    alpha = 0.01
    weights = ones(n)
    for i in range(m):
        h = sigmoid(sum(dataMatrix[i]*weights)) #只取一个数据点
        error = classLabels[i] - h
        weights = weights + alpha * error * dataMatrix[i]
    return weights

但这个简单的随机算法有些问题,

首先只迭代训练集一遍,很可能没有达到收敛,所以准确率不够 
其次,每次是依次选取数据点,所以weights会产生周期性的波动 
最后,收敛速度不够

def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range(numIter):  #增加迭代次数
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.01   #动态改变学习率
            randIndex = int(random.uniform(0,len(dataIndex))) #随机选取数据点
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights

对于动态改变学习率, 
可以看到,学习率会随着迭代次数变大,不断变小,但不会为0,因为有常数项,可以缓解数据波动,并保持多次迭代后仍然对数据有一定的影响 
并且当i>>j时,学习略随着迭代次数增加,也不是严格下降的

而随机选取数据点,用于解决周期性波动问题

本文章摘自博客园,原文发布日期:2014-07-22

时间: 2024-09-08 18:20:28

Machine Learning in Action -- Logistic regression的相关文章

Machine Learning in Action -- 回归

机器学习问题分为分类和回归问题  回归问题,就是预测连续型数值,而不像分类问题,是预测离散的类别 至于这类问题为何称为回归regression,应该就是约定俗成,你也解释不通  比如为何logistic regression叫逻辑回归,明明解决的是分类问题,而且和逻辑没有半点关系 谈到回归,最简单的就是线性回归 用直线去拟合数据点, 我们通常用平方误差来作为目标函数,称为最小二乘(ordinary least squares),参考AndrewNG的讲义 如何解这个问题,可以用梯度下降,但其实更

Machine Learning in Action – PCA和SVD

降维技术,  首先举的例子觉得很好,因为不知不觉中天天都在做着降维的工作 对于显示器显示一个图片是通过像素点0,1,比如对于分辨率1024×768的显示器,就需要1024×768个像素点的0,1来表示,这里每个像素点都是一维,即是个1024×768维的数据.而其实眼睛真正看到的只是一副二维的图片,这里眼睛其实在不知不觉中做了降维的工作,把1024×768维的数据降到2维 降维的好处,显而易见,数据更易于显示和使用,去噪音,减少计算量,更容易理解数据  主流的降维技术,包含:  主成分分析,pri

机器学习实战(Machine Learning in Action)笔记--Chapter1:机器学习基础

Part1 分类 监督学习一般使用两种类型的目标变量:标称型(主要用于分类).数值型(主要用于回归). 非均衡分类问题 第1章 机器学习基础 专家系统 训练样本.特征.目标变量(分类问题中为类别) 训练数据和测试数据 知识表示 监督学习:分类.回归 无监督学习 将数据集合分成由类似的对象组成的多个类的过程被称为聚类 将寻找描述数据统计值的过程称之为密度估计 监督学习的用途:k-近邻算法.朴素贝叶斯算法.支持向量机.决策树.线性回归.局部加权线性回归.Ridge回归.Lasso最小回归系数估计 无

Machine Learning in Action -- Support Vector Machines

虽然SVM本身算法理论,水比较深,很难懂 但是基本原理却非常直观易懂,就是找到与训练集中支持向量有最大间隔的超平面 形式化的描述: 其中需要满足m个约束条件,m为数据集大小,即数据集中的每个数据点function margin都是>=1,因为之前假设所有支持向量,即离超平面最近的点,的function margin为1 对于这种有约束条件的最优化问题,用拉格朗日定理,于是得到如下的形式, 现在我们的目的就是求出最优化的m个拉格朗日算子,因为通过他们我们可以间接的算出w和b,从而得到最优超平面 考

Machine Learning in Action -- AdaBoost

初始的想法就是,结合不同的分类算法来给出综合的结果,会比较准确一些  称为ensemble methods or meta-algorithms,集成方法或元算法 集成方法有很多种,可以是不同算法之间的,也可以是同一个算法但不同参数设置之间的,也可以是将数据集分成多分给不同的分类器之间的  总的来说,有3个维度可以进行集成,算法,算法参数和数据集 下面简单介绍两种比较流行的元算法思路, 1. Building classifiers from randomly resampled data: b

Machine Learning in Action -- FP-growth

要解决的问题,频繁项集 最暴力的方法,就是遍历所有的项集组合,当然计算量过大  最典型的算法apriori, 算法核心思想,当一个集合不是频繁项集,那么它的超集也一定不是频繁项集  这个结论是很明显的,基于这样的思路,可以大大减少频繁项集的候选项  因为你只要发现一个集合非频繁项集,那么他所有的超集都可以忽略 但apriori算法的问题是,计算每个候选项的出现频率的时候都需要遍历整个数据集,这个明显是低效的  很自然的想法,就是否有办法可以尽量少的遍历数据集?比如遍历一遍就可以得到所有的项集的出

Awesome Machine Learning

  Awesome Machine Learning  A curated list of awesome machine learning frameworks, libraries and software (by language). Inspired by awesome-php. If you want to contribute to this list (please do), send me a pull request or contact me @josephmisiti A

Logistic Regression——用线解决问题

LR一般用于预测二分类问题,即yes no和0\1问题,我们构建了X(设备属性和行为属性),我们需要预测Y(是否异常),而反作弊项目中,我们需要预测的就是设备作弊or正常,即0\1问题.选择LR一个很重要的原因是我们相信X和Y是有联系的,不同的类型的Y会有不同的X表现. 而X和Y是否有线性关系? 普通线性回归(Ordinary Linear Regression)是否就能满足需求?我们需要先论证这个问题,我们看一下普通线性回归,模型是这样的: 在线性回归中,随机误差项服从正态分布.这也意味着回归

machine learning-Matlab实现Logistic Regression时的一个小问题

问题描述 Matlab实现Logistic Regression时的一个小问题 Ng机器学习编程作业matlab实现LR时里有这样一段 %% ============= Part 3: Optimizing using fminunc ============= % In this exercise, you will use a built-in function (fminunc) to find the % optimal parameters theta. % Set options f