机器学习算法-logistic回归算法

Logistic回归算法调试

一、算法原理

Logistic回归算法是一种优化算法,主要用用于只有两种标签的分类问题。其原理为对一些数据点用一条直线去拟合,对数据集进行划分。从广义上来讲这也是一种多元线性回归方法,所不同的是这种算法需要找出的是能够最大可能地将两个类别划分开来而不是根据直线关系预测因变量的值。Logistic回归算法的核心部分是sigmoid函数:

其中xi为数据集的第i个特征。定义损失函数损失函数:

损失函数越小表明曲线拟合的效果就越好。利用梯度向上法更新x的系数W,求出W的最优解。梯度向上法的原理就是要求得一个函数的极值最好的方法就是沿着该函数的梯度方向进行,梯度可用偏导数求解。Logistic回归算法的损失函数的梯度grad为 

通过不断的更新x的权重迭代一定次数之后就能够得到想要的w

二、算法调试

2.1梯度下降法算法

  首先定义导入数据的函数loadDataSet(),使得数据的导入更加方便。为运行方便,对书中的代码稍作改变,有输入文件位置改成直接输入矩阵。梯度下降算法中的下面两行来自于对损失函数的求解,推到过程并不复杂。

运行loadDataSet对输入的算法进行测试,能够正常运行结果如下:

2.2  画出决策边界

在测试完梯度上升算法可行之后,实际上解出了一组回归系数。为了更好的理解logistic算法,需要把分隔线画出来。定义函数plotBestFit,在pycharm中输入代码。在这个程序中值得注意的是其中使用的getA这个函数,这是numpy库中的maxtri模块中的一个函数,作用刚好与mat相反,是把矩阵转化成数组。如果去掉之后则不能正常运行,主要原因是矩阵的每一行长度只能为1,不能像数组一样。通过测试之后的结果如图1.

图1

2.3随机梯度上升算法

  由于构造梯度上升算法时每次都要便历整个数据集,当数据量非常庞大时,运算量非常大。下面是梯段上升算法的一种改进算法,随机梯度上升算法。其原理是每一次只用一个样本更新回归系数,当新的样本输入时再进行增量式更新。定义stocGradAscent0函数,期待与梯度上升算法非常相似。输入代码进行验证,发现之间验证会出现以下错误:

出现这种问题是因为“*”这个运算符号的问题,在列表之间的计算时,只能够用整数去乘另外一个列表,这可能是因为在python中一个数字乘一个矩阵时会先把数字复制成为一个长度与被乘列表相同的列表,然后再相乘。但是其中的问题在于生成复制列表时只能对整数起作用,因而出现上述问题。修改的方法是将列表转化为矩阵,然后在再运算。修改的地方为:

经过调试能够很好的输出结果,如图2所示:

图2

从结果来看划分的效果并不如之前的好,这是因为有些系数的收敛速度非常慢,经过500次迭代并不能达到稳定值,因此需要进行下一步改进。

2.4 改进的随机梯度上升法

为了避免系数在迭代过程中来回波动,从而收敛到某个值。对随机上升梯度法进行了改进,一方面对α进行调整,这回使得波动减小;另一方面采用随机选择样本来更新回归系数,这将会减少周期性波动。然后调试程序,输入代码运行并未发现问题,能够直接运行出结果,如图3所示:

            图3

从图中可以看出分类的效果非常好,把数据集完全分类开来,证明了算法的有效性。

2.5 logistic回归分类算法

Logistic优化算法已经找出来了,下面需要用logistic回归进行分类测试。首先构造logistic分类器。由于选取的为西瓜数据集,与教材中的数据有所不用,因此代码稍有不同。但方法是一样的。主要程序代码如下:

def classifyVector(inX,weights):
    prob=sigmoid(sum(inX*weights))
    if prob>0.5:return 1.0
    else: return 0.0

def colicTest(testSet,weights,labelset):#输入测试集,回归系数,标签
    errorcount = 0
    n = shape(testSet)[0]
    for i in range(n):
        if classifyVector(array(testSet[i]),weights) != labelset[i]:
            errorcount = errorcount + 1
    errorrate = errorcount*1.0/n
    return errorrate

def multiTest(testSet,weights,labelSet):
    numTests=10;errorSum=0.0
    for k in range(numTests):
        errorSum=errorSum+colicTest(testSet,weights,labelSet)
    print(‘平均错误率为%s‘%(errorSum/numTests))

  这里我们采用的是西瓜数据集,由于样本较少预测效果不太好,使用三种算法之后,错误率在55%左右。如果把数据集即作为训练集又作为测试集准确率在75%左右,通过修改迭代次数最终准确率会收敛到84%。

三、总结

首先通过算法的调试,对算法的原理及实现方法有了进一步的理解。从理论上来看,logistic函数时一种比较理想的算法。算法中对梯度上升法进行了一些改进,使得收敛速度更快,使得算法的可行性有了大大提高。但是通过实例分析,分类的效果并不如预期的效果那么好。算法中是否还存在能够改进的地方,值得进一步探究。

原文地址:https://www.cnblogs.com/xfydjy/p/9291180.html

时间: 2025-01-13 23:35:56

机器学习算法-logistic回归算法的相关文章

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

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

机器学习--Logistic回归算法案例

案例:从疝气病症预测病马的死亡率 准备数据时,数据中的缺失值是个非常棘手的问题.因为有时候数据相当昂贵,扔掉和重新获取都是不可取的,所以必须采用一些方法来解决这个问题. 在预处理阶段需要做两件事:第一,所有的缺失值必须用一个实数值来替换,因为我们使用的NumPy数据类型不允许包含缺失值.这里选择实数0来替换所有缺失值,恰好能适用于Logistic回归.第二,如果在测试数据集中发现了一条数据的类别标签已经缺失,那么我们可以将该条数据丢弃.因为类别标签与特征不同,很难确定采用某个合适的值来替换. 1

4.机器学习之逻辑回归算法

理论上讲线性回归模型既可以用于回归,也可以用于分类.解决回归问题,可以用于连续目标值的预测.但是针对分类问题,该方法则有点不适应,因为线性回归的输出值是不确定范围的,无法很好的一一对应到我们的若干分类中.即便是一个二分类,线性回归+阈值的方式,已经很难完成一个鲁棒性很好的分类器了.为了更好的实现分类,逻辑回归诞生了.逻辑回归(Logistic Regression)主要解决二分类问题,用来表示某件事情发生的可能性.逻辑回归是假设数据服从Bernoulli分布的,因此LR也属于参数模型,他的目的也

机器学习之logistic回归与分类

logistic回归与分类是一种简单的分类算法.在分类的过程中只需要找到一个划分不同类的权重向量即可,对新的数据只需要乘上这个向量并比较就可以得到分类.比如下图的二分类问题: 每个样本点可以看成包含两个特征(x1,x2),现在需要把他们分开,如果这是训练集,他们本身属于哪一个类是已知的,比如说蓝色的属于0类,红色的属于1类,现在我们想通过这些数据建立一个分类标准可以将他们分开,这样再来了一个不知道类别的数据,我们看看这个标准就知道他是属于哪一类的. 像上面这个线性的,那么我们可以建立一个函数模型

机器学习笔记—Logistic回归

本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻]数理逻辑;符号逻辑;[军]后勤学, “回归”是由英国著名生物学家兼统计学家高尔顿在研究人类遗传问题时提出来的.为了研究父代与子代身高的关系,高尔顿搜集了1078对父亲及其儿子的身高数据.他发现这些数据的散点图大致呈直线状态,也就是说,总的趋势是父亲的身高增加时,儿子的身高也倾向于增加.但是,高尔顿对

机器学习实战——Logistic回归

回归概述(个人理解的总结) 回归是数学中的一种模拟离散数据点的数学模型的方法,拟合一个连续的函数从而可以对未知的离散数据点进行分类或预测.这种方法有一个统一的形式,给定n维特征的数据集合,对任意一个数据点Xi={x(1)i,x(2)i,...,x(n)i}的每个维度都有一个回归系数wi与之对应,整个模型就存在一个系数向量w={w1,w2...wn}.如果是系数向量w与特征Xi的线性组合,那么就是一个n空间下的超平面,如果对应分类问题,那么这个超平面就是分类器的决策平面(分类超平面).由于线性组合

[机器学习实战] Logistic回归

1. Logistic回归: 1)优点:计算代价不高,易于理解和实现: 2)缺点:容易欠拟合,分类精度可能不高: 3)适用数据类型:数值型和标称型数据: 2. 分类思想: 根据现有数据对分类边界线建立回归公式,以此进行分类. 这里借助sigmoid函数,其特点为当z为0时,sigmoid函数值为0.5:随着z的增大,对应的sigmoid值将逼近1: 而随着z的减小,sigmoid值将逼近0. σ(z) = 1/(1 + e-z) 上述 z = w0x0 + w1x1 + w2x2 + ....

logistic回归算法的损失函数:binary_crossentropy(二元交叉熵)

假设函数: 更为一般的表达式:        (1) 似然函数:              (2) 对数似然函数: 如果以上式作为目标函数,就需要最大化对数似然函数,我们这里选择最小化负的对数似然函数           (3) 对J(w)求极小值,对求导                 (4) 上述中 表示第i个样本的第j个属性的取值. 于是的更新方式为:                         (5) 将(5)式带入(4)式,得: 梯度下降GD的更新方式,使用全部样本:  (6) 当

监督学习的Logistic回归算法

函数原型 \[h_\theta(X)=\frac{1}{1+e^{-\theta^TX}}...称h_\theta(X)为y=1的概率.\] 决策界限的定义 \(根据函数表达式可知当z>=0时y>=0.5当z<0时y<0.5...z=\theta^TX,y=h_\theta(X)\) \(故直线z=\theta^TX为决策界限\) ## 代价函数 线性回归的代价函数为: \[J(\theta)=2\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^i)-y(x