Machine Learning in Action -- Logistic regression

简介:

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

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

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

image

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

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

image

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

其中,

image

而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支持矩阵计算,所以

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

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

image

得到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

目录
相关文章
|
3月前
|
机器学习/深度学习 算法 关系型数据库
Hierarchical Attention-Based Age Estimation and Bias Analysis
【6月更文挑战第8天】Hierarchical Attention-Based Age Estimation论文提出了一种深度学习方法,利用层次注意力和图像增强来估计面部年龄。通过Transformer和CNN,它学习局部特征并进行序数分类和回归,提高在CACD和MORPH II数据集上的准确性。论文还包括对种族和性别偏倚的分析。方法包括自我注意的图像嵌入和层次概率年龄回归,优化多损失函数。实验表明,该方法在RS和SE协议下表现优越,且在消融研究中验证了增强聚合和编码器设计的有效性。
29 2
|
11月前
|
数据挖掘
【提示学习】Automatic Multi-Label Prompting: Simple and Interpretable Few-Shot Classification
文章提出了一种简单确高效地构建verbalization的方法:
|
机器学习/深度学习 人工智能 自然语言处理
OneIE:A Joint Neural Model for Information Extraction with Global Features论文解读
大多数现有的用于信息抽取(IE)的联合神经网络模型使用局部任务特定的分类器来预测单个实例(例如,触发词,关系)的标签,而不管它们之间的交互。
157 0
|
机器学习/深度学习 自然语言处理 算法
TASLP21-Reinforcement Learning-based Dialogue Guided Event Extraction to Exploit Argument Relations
事件抽取是自然语言处理的一项基本任务。找到事件论元(如事件参与者)的角色对于事件抽取至关重要。
87 0
|
11月前
|
机器学习/深度学习 数据挖掘
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
52 1
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
|
机器学习/深度学习 编解码 数据可视化
Speech Emotion Recognition With Local-Global aware Deep Representation Learning论文解读
语音情感识别(SER)通过从语音信号中推断人的情绪和情感状态,在改善人与机器之间的交互方面发挥着至关重要的作用。尽管最近的工作主要集中于从手工制作的特征中挖掘时空信息,但我们探索如何从动态时间尺度中建模语音情绪的时间模式。
126 0
|
数据可视化 数据挖掘
【论文解读】Dual Contrastive Learning:Text Classification via Label-Aware Data Augmentation
北航出了一篇比较有意思的文章,使用标签感知的数据增强方式,将对比学习放置在有监督的环境中 ,下游任务为多类文本分类,在低资源环境中进行实验取得了不错的效果
344 0
PointNet++:Deep Hierarchical Feature Learning on Points Sets in a Metrci Space 学习笔记
PointNet++:Deep Hierarchical Feature Learning on Points Sets in a Metrci Space 学习笔记
76 0
|
机器学习/深度学习 算法 数据挖掘
A Generative Adversarial Network-based Deep Learning Method for Low-quality Defect ImageReconstructi
本文提出了一种基于生成对抗网络 (GAN) 的 DL 方法,用于低质量缺陷图像识别。 GAN用于重建低质量缺陷图像,并建立VGG16网络识别重建图像。
136 0
|
机器学习/深度学习 算法 数据挖掘
【多标签文本分类】Improved Neural Network-based Multi-label Classification with Better Initialization ……
【多标签文本分类】Improved Neural Network-based Multi-label Classification with Better Initialization ……
116 0
【多标签文本分类】Improved Neural Network-based Multi-label Classification with Better Initialization ……