逻辑学论文回归 论文中写入的比较 倍数 怎么算

工具类服务
编辑部专用服务
作者专用服务
面向不平衡分类的逻辑回归算法
类分布不平衡的数据集在现实生活中大量存在,传统的成熟分类算法大多建立在数据集类分布大致平衡这一假设上,而对于类分布不平衡的数据集往往取得较差的分类效果。而且,在不平衡分类问题中往往少数类比多数类具有更重要的意义,因此不能仅仅使用准确率来评估不平衡分类算法的性能,对于不平衡分类问题可用召回率、g-mean值以及f-measure值等评估指标对不平衡分类算法进行评估。逻辑回归算法是数据挖掘中常用的分类方法,尤其对于两类分类问题。逻辑回归算法最明显的优势就是它是基于概率的分类算法并且很容易被扩展到多类问题,但是逻辑回归并不适应于不平衡分类问题,因为其目标函数是最大化每个实例被正确分类的概率的对数之和,而不考虑该实例是少数类还是多数类,这样会导致将更多的少数类实例误分为多数类。  本文在逻辑回归的基础处上,根据类分布不平衡数据集的特点,结合传统的逻辑回归算法和三个不平衡分类问题的评价指标召回率、g-mean值以及f-measure值提出了三种适合于不平衡分类的目标函数 LRM(Logistic and Recall based Metric)、GBM(G-mean based Metric)和FBM(F-measure based Metric),在这三种目标函数的基础上,本文提出三种适合于不平衡分类问题的分类算法RBLR(Recall Based Logistic Regression)、GBLR(G-mean Based Logistic Regression)和FBLR(F-measure Based Logistic Regression)。在这三种算法的求解过程中,使用拟牛顿法来解决最优化问题,预测阶段使用和传统的逻辑回归算法类似的方法进行预测。在16个UCI数据集上的实验结果表明,本文提出的三种算法RBLR、GBLR以及 FBLR能在很好的在保持较高准确率的前提下,有效地提高少数类的召回率、g-mean值以及f-measure值。与过采样逻辑回归OSLR(Over-Sampled Logistic Regression)和欠采样逻辑回归USLR(Under-Sampled Logistic Regression)相比,本文提出的算法也表现出明显的优势。
学科专业:
授予学位:
学位授予单位:
导师姓名:
学位年度:
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社当前位置: &
7,418 次阅读 -
在有监督学习算法用做分类问题时,有两种算法在实际中应用广泛,它们分别是Logistic regression和Naive bayes。今天我们讨论一下这两类算法在分类问题上面的异同点,以及它们的优缺点。
1.两类算法介绍
Logistic Regression
Naive Bayes
Naive Bayes模型是说我有一个很强的假设,这个假设是在y给定的条件下,xi相互独立,这个假设看上去非常stupid,但是在实际应用(比如垃圾邮件检测)中能够work非常好。这一方面也验证了Occam’s Theory: Simple model is better。继续主题,既然xi相互独立,我们想对测试数据x^进行预测,可以通过如下方法:
在这里,可以通过条件独立性写成:
而分母可以通过联合概率写成:
好的,下面我们开始分析Logistic Regression和Naive Bayes的异同点。
2.两者的异同点
Logistic regression和Naive bayes都是对特征的线性表达,只是区别在于两者所fit的参数不同。
Logistic regression和Naive bayes建模的都是条件概率,对所最终求得的不同类的结果有很好的解释性。而不像SVM,神经网络这样解释性不高。
Logistic regression在有相关性feature上面学习得到的模型在测试数据的performance更好。也就是说,logistic regression在训练时,不管特征之间有没有相关性,它都能找到最优的参数。而在Naive bayes中,由于我们给定特征直接相互独立的严格设定,在有相关性的feature上面学习到的权重同时变大或变小,它们之间的权重不会相互影响。从这方面来说,如果能够在对参数较好地控制,在损失项方面处理的很好的话,Logistic regression相对Naive bayes在应用时更不会限制在特征工程(feature engineering)上面。
Naive bayes的好处是我没有优化参数这一步,通过训练数据我直接得到一个counting table,这些有助于并行化。
Andrew Ng和Michael Jordan在2001年发了一篇NIPS短文《》,他们把这两个模型用在各种数据集上面进行测试,最后得到在小数据上面Naive bayes可以取得更好的效果,随着数据的增多、特征维度的增大,Logistic regression的效果更好。这也是因为Naive bayes是生成模型,在有prior的情况下模型能够把数据fit的更好,而Logistic regression属于生成模型,目标驱动化,不去建模联合概率,通过训练数据直接预测输出,因此在数据足够多的情况下能够得到更好一些的效果。
文章出处:
注:转载文章均来自于公开网络,仅供学习使用,不会用于任何商业用途,如果侵犯到原作者的权益,请您与我们联系删除或者授权事宜,联系邮箱:contact@dataunion.org。转载数盟网站文章请注明原文章作者,否则产生的任何版权纠纷与数盟无关。
相关文章!
不用想啦,马上 发表自已的想法.
做最棒的数据科学社区
扫描二维码,加微信公众号
联系我们:关于 TensorFlow 的 gentlest 的介绍:了解 TensorFlow(TF)进行多个特征的线性回归和逻辑回归-爱编程
关于 TensorFlow 的 gentlest 的介绍:了解 TensorFlow(TF)进行多个特征的线性回归和逻辑回归
本文标签:&
本文是日本东京 聚会联合组织者 Hin Khor 所写的 TensorFlow 系列介绍文章的Part 3 和 Part4,自称给出了关于 TensorFlow 的 的介绍。 在之前发布的前两部分介绍中 ,作者谈到以及训练(training)的含义,这两部分将讲解&(TF)进行多个特征的线性回归和。
矩阵和多特征
之前文章的前提是:给定特征——任何房屋面积(sqm),我们需要预测结果,也就是对应房价($)。为了做到这一点,我们:
我们找到一条「最拟合」所有数据点的直线(线性回归)。「最拟合」是当线性回归线确保实际数据点(灰色点)和预测值(内插在直线上的灰色点)之间的差异最小,即最小化多个蓝线之和。
使用这条直线,我们可以预测任何房屋的价格。
使用单一特征线性回归进行预测
多特征线性回归概述
实际上,任何预测都依赖于多个特征,于是我们从单特征的线性回归进阶到 带有两个特征的线性回归;之所以选择两个特征,是为了让可视化和理解简明些,但这个思想可以推广到带有任何数量特征的线性回归。
我们引进一个新的特征——房间数量。当收集数据点时,现在我们需要在现有特征「房屋面积」之上收集新特征「房间数」的值,以及相应的结果「房屋价格」。
我们的图表变成了 3 维的。
结果「房屋价格」以及 2 个特征(「房间数」,「房屋面积」)的数据点空间
然后,我们的目标变成:给定「房间数」和「房屋面积」,预测「房屋价格」(见下图)。
由于缺少数据点,有时无法对给定的 2 个特征进行预测
在单一特征的情形中,当没有数据点时,我们需要使用线性回归来创建一条直线,以帮助我们预测结果房屋价格。在 2 个特征的情形中,我们也可以使用线性回归,但是需要创建一个平面(而不是直线),以帮助我们预测(见下图)。
使用在 2 个特征空间中的创建一个平面来做预测
多特征线性回归模型
回忆单一特征的线性回归(见下图左边),线性回归模型结果为 y,权重为 W,房屋大面积为 x,偏差为 b。
对于 2 个特征的回归(参见下图右侧),我们引入另一个权重 W2,另一个自变量 x2 来代表房间数的特征值。
单特征 vs. 2 个特征的线性回归方程
如之前讨论的那样,当我们执行线性回归时,梯度下降算法能帮助学习系数 W、W2 和 b 的值。
Tensorflow 的多特征线性回归
1.快速回顾
单特征线性回归的 TF 代码由 3 部分组成(见下图):
构建模型(蓝色部分)
基于模型构建成本函数(红色部分)
使用梯度下降(绿色部分)最小化成本函数
用于单特征线性回归的 代码
2.Tensorflow 的 2 个特征的
TF 代码中 2 个特征的线性回归方程(如上所述)的变化(相比单特征)用红色显示。
注意,增加新特征的这种方式效率低;随着特征数量的增长,所需的变量系数和自变量的数量会增加。实际的模型有更多的特征,这恶化了这个问题。那么,如何能有效地表示特征呢?
解决方法:矩阵
首先,让我们将表征两个特征的模型推广到表征 n 个特征的模型:
复杂的 n 特征公式可以用矩阵简化,矩阵被内置于 TF 中,这是因为:
数据可以用多维表示,这契合我们表征具有 n 个特征的数据点(左下方,也称为特征矩阵)以及具有 n 个权重模型(右下,也称为权重矩阵)的方式
单个数据点的 n 个特征与模型的矩阵形式的 n 个权重
在 TF 中,它们将被写为:
x = tf.placeholder(tf.float,[1,n])
W = tf.Variable(tf.zeros [n,1])
注意:对于 W,我们使用 tf.zeros,它将所有 W1,W2,...,Wn 初始化为零。
在数学上,矩阵乘法是向量乘法的加总;因此自然地,特征(中间的一个)和权重(右边的)矩阵之间的矩阵乘法给出(左边的)结果,即等于 n 个特征的线性回归公式的第一部分(如上所述),没有截距项。
特征和权重矩阵之间的矩阵乘法给出结果(未添加截距项)
在 TF 中,这种乘法将表示为:
y = tf.matmul(x, W)
多行特征矩阵(每行表示数据点的 n 个特征)之间的矩阵乘法返回多行结果,每行代表每个数据点的结果/预测(没有加入截距项);因此一个矩阵乘法就可以将线性回归公式应用于多个数据点,并对应地产生多个预测(每个数据点对应一个结果)(见下文)
注意:特征矩阵中的 x 表示变的更复杂,即我们使用 x1.1、x1.2,而不是 x1、x2 等,因为特征矩阵(中间矩阵)从表示 n 个特征(1 行 x,n 列)的单个数据点扩展到表示具有 n 个特征(m 行 x,n 列)的 m 个数据点。因此,我们扩展 x &n&(如 x1)到 x &m &.&n&(如 x1.1),其中,n 是特征数,m 是数据点的数量。
具有模型权重的多行矩阵乘法产生矩阵的多个行结果
在 TF 中,它们将被写为:
x = tf.placeholder(tf.float,[m,n])
W = tf.Variable(tf.zeros [n,1])
y = tf.matmul(x,W)
最后,向结果矩阵添加常数,也就是将常数添加到矩阵中的每一行
在 TF 中,用矩阵表示 x 和 W,无论模型的特征数量或要处理的数据点数量,矩阵都可以简化为:
b = tf.Variable(tf.zeros[1])
y = tf.matmul(x, W) + b
的多特征备忘单
我们做一个从单一特征到多特征的线性回归的变化的并行比较:
中的单特征与 n 个特征的线性回归模型
在本文中,我们介绍了多特征线性回归的概念,并展示了我们如何将模型和 TF 代码从单特征的线性回归模型扩展到 2 个特征的线性回归模型,并可以推广到 n 特征线性回归模型。最后我们为多特征的 TF 线性回归模型提供了一张备忘单。
逻辑回归综述
我们已经学会了如何使用 Tensorflow(TF)去实现线性回归以预测标量值得结果,例如给定一组特征,如住房大小,预测房价。
然而,有时我们需要对事物分类(classify)而不是去预测一个具体的数值,例如给定一张含有数字(0-9 十个数字中的一个)的图片,我们需要将其分类为 0,1,2,3,4,5,6,7,8,9 十类。或者,我们需要将一首歌曲进行归类,如归类为流行,摇滚,说唱等。集合 [0,1,2,...,9]、[流行,摇滚,说唱,等等] 中的每一个元素都可以表示一个类。在计算机中,我们通常用数字对抽象名词进行表示,比如,pop = 0, rock = 1, 等等。为了实现分类,我们使用 TF 来实现逻辑回归。
在本文中,我们将使用将数字图片归类为 0,1,2,3,4,5,6,7,8,9 这十类。
逻辑回归的细节
线性回归中的许多概念仍然用于逻辑回归之中。我们可以再次使用公式 y = W.x + b,但是有一些不同的地方。让我们看看线性回归和逻辑回归的公式:
线性回归与逻辑回归的区别与相似
结果(y):对于线性回归,结果是一个标量值(可以是任意一个符合实际的数值),例如 5 等;对于逻辑回归,结果是一个整数(表示不同类的整数,是离散的),例如 0,1,2,... 9。
特征(x):对于线性回归,特征都表示为一个列向量;对于涉及二维图像的逻辑回归,特征是一个二维矩阵,矩阵的每个元素表示图像的像素值,每个像素值是属于 0 到 255 之间的整数,其中 0 表示黑色,255 表示白色,其他值表示具有某些灰度阴影。
成本函数(成本):对于线性回归,成本函数是表示每个预测值与其预期结果之间的聚合差异的某些函数;对于逻辑回归,是计算每次预测的正确或错误的某些函数。
训练:线性回归和逻辑回归的训练目标都是去学习权重(W)和偏置(b)值。
结果:线性回归与逻辑回归的目标都是利用学习到的权重和偏置值去预测/分类结果。
协调逻辑回归与线性回归
为了使利用 y = W.b + x,我们需要做出一些改变以协调上述差异。
1.特征变换,x
我们可以将二维的图片特征(假设二维特征有 X 行,Y 列)转换成一维的行向量:将第一行以外的其它行数值依顺序放在第一行后面。
转换图像特征以适用于逻辑回归公式
2.预测结果转换,y
对于逻辑回归,y 不能作为标量,因为预测可能最终为 2.3 或 11,这不在可能的类 [0,1,...,9] 中。
为了解决这个问题,y 应该被转换成列向量,该向量的每个元素代表逻辑回归模型认为属于某个特定类的得分。在下面的示例中,预测结果为类'1',因为它具有最高得分。
每个类的分数和具有最高分数的类成为被预测的类
对于给定的图片,为求这个分数向量,每个像素都会贡献一组分数(针对每一类),分数表示系统认为这张图片属于某类的可能性,每个像素分数之和成为预测向量。
每个像素提供一个分数向量;每个类别有一个分数,最后变成预测向量。所有预测向量的总和变成最终预测。
3.成本函数的变换
涉及到预测结果和实际结果之间数值距离的任何函数都不能作为成本函数。对于数字图片「1」,这样的成本函数将使预测值「7」(7-1=6)更严重地惩罚预测值「2」(2-1=1),尽管两个预测结果都是错误的。
我们即将使用的成本函数,交叉熵(H),用以下几个步骤实现:
1. 将实际图片的类向量(y')转化成 one-hot 向量,这是一个概率分布。
2. 将预测类 (y) 转化成概率分布。
3. 使用交叉熵函数去计算成本函数,这表示的是两个概率分布函数之间的差异。
第一步:One-hot 向量
由于我们已经将预测 (y) 转换成分数向量,因此,我们也应该将实际图片类(y』)转换成相同维数的向量;one-hot 向量是将对应于实际类的的元素为设为 1,其它元素为 0。下面,我们展示表示 0-9 十个类中一个类的 one-hot 向量。
图片类和它们的 one-hot 向量表示
假设实际图像上是数字「1」(y'),它的 one-hot 向量是 [0,1,0,0,0,0,0,0,0,0],假设其预测向量 (y) [1.3, 33, 2, 1.2, 3.2, 0.5, 3, 9.2, 1],绘制比较如下:
真实图片 one—hot 向量(顶)预测类别概率
第二步:用 softmax 实现概率分布
为了在数学上比较这两个「图」的相似性,交叉熵是一个好方法。(这里是一个很棒但比较长的解释,如果你对细节感兴趣的话。https://colah.github.io/posts/2015-09-Visual-Information/)
然而,为了利用交叉熵,我们需要将实际结果向量(y')和预测结果向量(y)转换为「概率分布」,「概率分布」意味着:
每个类的概率/分数值在 0-1 之间;
所以类的概率/分数和必须是 1;
实际结果向量(y')如果是 one-hot 向量,满足了上述限制。
为预测结果向量(y), 使用 softmax 将其转换为概率分布:
softmax 函数,这里 i 是表示 0, 1, 2, …, 9 十类
这个过程只需要简单的两步,预测向量(y)中的每个分量是 exp(y_i) 除以所有分量的 exp() 的和。
注意:softmax(y)图形在形状上与 prediction (y) 相似,但是仅仅有较大的最大值和较小的最小值
使用 softmax 前后预测(y)曲线
第三步:交叉熵
现在,我们将预测向量分数概率分布(y')和实际向量分数概率分布 (y) 运用交叉熵。
交叉熵公式:
交叉熵作为我们想最小化的成本函数
为了快速理解这个复杂的公式,我们将其分为 3 部分(见下文)。注意,本文中的符号,我们使用 y_i 表示 y 的第 i 个分量。
交叉熵(H)公式可视为三个部分:红,蓝,绿
蓝:实际图像类(y')对应的 one-hot 图,参看 one-hot 向量部分:
红:由预测向量元素(y)经过softmax(y),-og(softmax(y)一系列变化而来:
绿:每一图片类别 i,其中,i = 0, 1, 2, …, 9, 红蓝部分相乘的结果
以下图例会进一步简化理解。
蓝色制图只是真实图片类别(y')one-hot 向量。
每个预测向量元素,y,转换成 -log(softmax(y),就得到红图:
预测类别向量(y)一系列转换后,得到红图
如果你想完全地理解第二个变换 -log(softmax(y)) 与 softmax(y) 为什么成反比,请点击 video or slides(参见文末资源部分).
交叉熵(H),这个绿色的部分是每个类别的蓝色值和红色值的乘积和,然后将它们做如下相加:
交叉熵是每个图像类的蓝色值和红色值的乘积之和。
由于这张蓝色图片对应一个 one-hot 向量,one-hot 向量仅仅有一个元素是 1,它对应一个正确的图片类,交叉熵的其它所有元素乘积为 0,交叉熵简化为:
将所有部分放到一起
有了三个转换后,现在,我们就可以将用于线性回归的技术用于逻辑回归。下面的代码片段展示的是本系列文章第三部分线性回归代码和代码适用逻辑回归所需要的变化之间的对比。
逻辑回归的目标是最小化交叉熵(H),这意味着我们只需要最小化 -log(softmax(y_i)项;因为该项与 softmax(y_i)成反比,所以我们实际上是最大化该项。
使用反向传播去最小化交叉熵 (H ) 将改变逻辑回归的权重 W 和偏置 b。因此,每张图片的像素值将会给出对应图片类最高分数/概率!(最高分数/概率对应于正确的图片类)
将线性回归方法用于逻辑回归之中,「total_class」是欲分类问题的总类数量,例如,在上文手写数字体识别例子中,total_class=10。
1. 将特征变换成一维特征;
2. 将预测结果向量、实际结果向量变化成 one-hot 向量;
3. 将成本函数从平方误差函数变化到交叉熵。
线性回归对基于给定特征的预测(数值)是有帮助的,根据输入特征实现分类是有帮助的。
我们展示了如何调整线性回归 y = W.x + b 实现逻辑回归:(1)转换特征向量;2)转换预测/结果向量;(3)转换成本函数。
当你掌握了 one-hot 向量,softmax,交叉熵的知识,你就可以处理谷歌上针对「初学者」的图片分类问题。
针对初学者的图像识别的谷歌代码:/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py
slideshare 上的幻灯片:http://www.slideshare.net/KhorSoonHin/gentlest-introduction-to-tensorflow-part-3
油管上的视频:/watch?v=F8g_6TXKlxw油管上不去,下边有方法-》
写在最后:FOR Freedom 看看外边的世界,以及IT这一行,少不了去Google查资料,最后,安利一个V——PN代理。,去Google查资料是绝对首选,连接速度快,使用也方便。我买的是99¥一年的,通过这个链接()注册后输上会员中心得优惠码,平摊下来,每月才7块钱,特实惠。 本文标签:&
原文地址:
相关阅读:《》
相关阅读:《》
相关阅读:《》
相关阅读:《》
相关阅读:《》
相关阅读:《
相关阅读: 《》
相关BLOG:
原文地址:
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。逻辑回归(Logistic regression)详解-并用scikit-learn训练逻辑回归拟合Iris数据集
这篇文章主要介绍逻辑回归背后的一些概率概念,给你一些直观感觉关于它的代价函数的由来。并且我也介绍了关于最大似然估计(maximum likelihood)的概念,用这个强大的工具来导出逻辑回归的cost函数。接着,我用scikit-learn训练了感知机模型来让你熟悉scikit-learn,最后用scikit-learn来训练逻辑回归,并作出决策边界图,效果还算不错。
逻辑函数(logistic function)
为了更好地解释逻辑回归,让我们首先了解一下逻辑函数。逻辑函数由于它的S形,有时也被称为sigmoid函数。
现在我要引入比值比(odds ratio)的概念,它可以被写成p(1?p),其中的p代表正事件(positive event)的概率,正事件并不是代表好的方面的概率,而是代表我们想要预测的事件。比如:病人患有某种疾病的概率。我们把正事件的类标签设置为1。比值比的对数称为Logit函数,它可以写成如下形式:
logit(p)=logp(1?p)
它的函数图像如下:
从图像上我们可以看出,logit函数输入0到1的值并把它们转换为整个实数范围内的值。上面的p代表正事件的概率,因此在给定特征向量x的条件下,类别y=1的概率可以写成P(y=1|x)。大家都知道概率的范围为0到1,如果我把这个概率传递给logit函数那么它的输出范围是整个实数,因此如果我用某些合适的权重向量w参数化特征向量x后,可以有如下等式:
logit(P(y=1|x))=w0x0+w1x1+?+wnxn=&i=0nwixi
但是在实际应用中,我们更想求的是P(y=1|x),因此,我们需要找到logit函数的反函数,通过输入用权重向量w来参数化的x,来输出我们想要知道的正事件的概率,即P(y=1|x)。而这个反函数就是我们的sigmoid函数,它可以写成S(h)=11+e?h,公式中的h为样本特征和权重的线性组合,即,w0x0+w1x1+?+wnxn。下面我们来画出这个函数图像的样子:
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(h):
return 1.0 / (1.0 + np.exp(-h))
h = np.arange(-10, 10, 0.1) # 定义x的范围,像素为0.1
s_h = sigmoid(h) # sigmoid为上面定义的函数
plt.plot(h, s_h)
plt.axvline(0.0, color='k') # 在坐标轴上加一条竖直的线,0.0为竖直线在坐标轴上的位置
plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted') # 加水平间距通过坐标轴
plt.axhline(y=0.5, ls='dotted', color='k') # 加水线通过坐标轴
plt.yticks([0.0, 0.5, 1.0]) # 加y轴刻度
plt.ylim(-0.1, 1.1) # 加y轴范围
plt.xlabel('h')
plt.ylabel('$S(h)$')
plt.show()
从上图我们可以看出,函数接收整个实数范围的输入,输出0到1之间的数。
因此S(w0x0+w1x1+?+wnxn)=P(y=1"x;w),这个概率我们可以解释成:给定用权重w参数化后的特征x,样本属于类别1的概率。通过阶跃函数(step function),我们可以得到如下公式:
f(n)={1,0,if S(h)&0.5otherwise
还有一个等价的公式如下:
f(n)={1,0,if h&0.0otherwise
实际上,很多应用不只仅仅是想得到一个类标签,而是算出属于某个类别的概率。比如逻辑回归就是这样的,它不仅仅是告诉你是否患有疾病,而是告诉你有多大概率患有这个疾病。
在上面的例子当中,我们一直都看到权重w的出现,那么我们如何学习出最佳的权重w呢?在告诉你答案之前,让我们先复习一下最大似然估计(maximum likelihood)的概念。
最大似然估计(maximum likelihood)
这个方法的本质就是:选择最佳的参数值w,来最大化我们样本数据的可能性。
假设我们给定样本X1,X2,X3,&,Xn,那么我可以写出一个关于参数w的可能性函数,如下:
lik(w)=f(X1,X2,X3,&,Xn|w)
实际上,可能性函数就是样本数据作为参数w的函数的概率。
如果X1,X2,X3,&,Xn相互之间是独立的,可能性函数可以简化成如下形式:
lik(w)=&1nf(Xi|w)
但是,如果我们有很多的样本数据呢?这时,你就会乘上很多项,这些项通常都很小,可能性函数就会变得很小。因此,你应该采用log可能性函数。第一,如果在可能性很小的时候它可以防止潜在的数值下溢;第二,我们把乘积转换为求和,这可以使我们更加容易求得函数的导数。第三,log函数是单调的,最大化可能性函数的值也就是最大化log可能性函数的值。log可能性函数公式如下:
l(w)=log(lik(w))=&inlog(f(Xi|w))
下面,我举2个例子来应用一下这个强大的工具:
1、假设你口袋里有2枚硬币,1枚硬币出现正面的概率为p=0.5,另1枚硬币出现正面的概率为p=0.8,现在你从口袋里随机拿出一枚硬币(你并不知道拿的是哪枚硬币),然后随机投掷4次,出现3次正面,1次反面。你觉得你拿出的是哪枚硬币?或者哪枚硬币的最大似然估计更大?
答:通过问题我们可以得出这个是属于二项分布。它的概率为P(x|n,p)=(nx)px(1?p)n?x.现在,我们来写出log可能性函数:
l(p)=log((43)p3(1?p))
由于我们已经给出了p的值只能为0.5或0.8,因此,我们不必求导来算出p的值最大化可能性。这里我们只需要把两个p值代入就行了,分别得出如下结果:
l(0.5)=?0.6021
l(0.8)=?0.3876
因此当p为0.8时,使可能性函数更大,所以我更可能拿出的是正面概率为p=0.8的硬币。
2、假设Xi~N(&,&2),并且相互之间是独立的。求出最佳参数?
答:log可能性函数如下:
l(&,&2)=&i=1nlog[1&2&??&exp(?(Xi?&2)2&2)]=?&i=1nlog(&)?&i=1nlog(2&??&)?&i=1n[(Xi?&)22&2]=?nlog(&)?nlog(2&??&)?12&2&i=1n(Xi?&)2
因为我们想找到参数&和&使得可能性函数最大,因此我们需要找到它们的偏导:
?l(&,&2)?&=??&(?nlog(&)?nlog(2&??&)?12&2&i=1n(Xi?&)2)=?1&2&i=1n(Xi?&)
?l(&,&2)?&2=??&2(?n2log(&2)?nlog(2&??&)?12(&2)?1&i=1n(Xi?&)2)=?n2&2+12(&2)?2&i=1n(Xi?&)2
让两个偏导都等于0,然后求出最佳参数。
&=1n&i=1nXi=Xˉ
&2=1n&i=1n(Xi?&)2
掌握了最大似然估计,现在你就可以知道逻辑回归cost函数的由来了。
逻辑回归的cost函数
现在,我们可以用可能性函数来定义上面的权重w了。公式如下:
L(w)=&i=1nP(y(i)|x(i);w)=&i=1nS(h(i))y(i)(1?S(h(i)))1?y(i)
上面公式中的h为假设函数w0x0+w1x1+?+wnxn,把上面的函数加上对数,公式如下:
l(w)=log(L(w))=&i=1ny(i)log(S(h(i)))+(1?y(i))log(1?S(h(i)))
现在,我们的目的是最大化log可能性函数,找到一个最佳的权重w。我们可以在上面的log可能性函数前加上负号,用梯度下降算法来最小化这个函数。现在,我得到了逻辑回归的cost函数如下:
J(w)=?&i=1ny(i)log(S(h(i)))+(1?y(i))log(1?S(h(i)))
n:训练集样本总数 S:sigmoid函数 h:假设函数
假设我们只有一个样本,现在我们可以把上面的cost函数拆分成分段函数如下:
J(w)=????log(S(h)),?log(1?S(h)),if y = 1if y = 0
我们把逻辑回归的cost函数做成了图像如上。当实际类别为1时,如果我们预测为1则需要很小的cost,如果我们预测为0则需要很大的反过来,当实际类别为0时,如果我们预测为0则需要很小的cost,如果我们预测为1则需要很大的cost
下面是一些关于逻辑回归更详细的一些理论知识,感兴趣的可以看看。
下面我要用scikit-learn的逻辑回归来拟合Iris数据集。
Iris数据集概述
首先,我们取得数据,下面这个链接中有数据的详细介绍,并可以下载数据集。
从数据的说明上,我们可以看到Iris有4个特征,3个类别。但是,我们为了数据的可视化,我们只保留2个特征(sepal length和petal length)。让我们先看看数据集的散点图吧!
下面,我们进入Ipython命令行。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None) # 加载Iris数据集作为DataFrame对象
X = df.iloc[:, [0, 2]].values # 取出2个特征,并把它们用Numpy数组表示
plt.scatter(X[:50, 0], X[:50, 1],color='red', marker='o', label='setosa') # 前50个样本的散点图
plt.scatter(X[50:100, 0], X[50:100, 1],color='blue', marker='x', label='versicolor') # 中间50个样本的散点图
plt.scatter(X[100:, 0], X[100:, 1],color='green', marker='+', label='Virginica') # 后50个样本的散点图
plt.xlabel('petal length')
plt.ylabel('sepal length')
plt.legend(loc=2) # 把说明放在左上角,具体请参考官方文档
plt.show()
从上图我们可以看出,数据集是线性可分的。为了更好地演示效果,我只用setZ喎"/kf/ware/vc/" target="_blank" class="keylink">vc2G6zXZlcnNpY29sb3LV4sG9uPbA4LHwoaM8L3A+DQo8cD6908/CwLSjrM7Sw8fSqtPDx7+087XEc2Npa2l0LWxlYXJuwLTE4rrPxKPQzaGjPC9wPg0KPGgyIGlkPQ=="初识scikit-learn">初识scikit-learn
有一些开源库已经把机器学习算法封装到黒盒中,别人已经替我们做了大量的工作。在实际应用中,我们主要的工作是对数据的预处理、挑选出好的特征、调试算法、多试一些算法,比较它们之间的性能、选择出好的模型。因此我并不会建议你自己去实现这些机器学习算法。那么你可能会有疑问,既然别人已经都实现了,我们还了解这些算法有什么用?就和我刚才说的一样,我们大部分的工作都是在调试算法,找到其最好的性能,如果你不了解它们的原理,你能知道怎么调试它们吗?
现在我要用scikit-learn来训练感知机模型,让你了解一下scikit-learn的一些方法。如果你并不了解感知机模型(perceptron),你可以去Google一下,有很多关于它的文章,这个算法很早就出现了,也很简单。
在用scikit-learn之前,你需要安装它,步骤请参考
下面,让我们来看看scikit-learn的强大吧!
from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris() # 由于Iris是很有名的数据集,scikit-learn已经原生自带了。
X = iris.data[:, [2, 3]]
y = iris.target # 标签已经转换成0,1,2了
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 为了看模型在没有见过数据集上的表现,随机拿出数据集中30%的部分做测试
# 为了追求机器学习和最优化算法的最佳性能,我们将特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train) # 估算每个特征的平均值和标准差
sc.mean_ # 查看特征的平均值,由于Iris我们只用了两个特征,所以结果是array([ 3.,
sc.scale_ # 查看特征的标准差,这个结果是array([ 1.,
X_train_std = sc.transform(X_train)
# 注意:这里我们要用同样的参数来标准化测试集,使得测试集和训练集之间有可比性
X_test_std = sc.transform(X_test)
# 训练感知机模型
from sklearn.linear_model import Perceptron
# n_iter:可以理解成梯度下降中迭代的次数
# eta0:可以理解成梯度下降中的学习率
# random_state:设置随机种子的,为了每次迭代都有相同的训练集顺序
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)
ppn.fit(X_train_std, y_train)
# 分类测试集,这将返回一个测试结果的数组
y_pred = ppn.predict(X_test_std)
# 计算模型在测试集上的准确性,我的结果为0.9,还不错
accuracy_score(y_test, y_pred)
注意:如果上面的学习率过大,算法可能会越过全局最小值,收敛地很慢,甚至有可能发散。如果学习率过小,算法需要很多次迭代才能收敛,这会使学习过程很漫长。
现在估计你已经大概了解scikit-learn了,接下来,我们来实现逻辑回归。
scikit-learn实现逻辑回归
scikit-learn的逻辑回归中有很多调节的参数,如果你不太熟悉,请参考下面的文档。
下面,我将用scikit-learn来训练一个逻辑回归模型:
from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_split
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=1000.0, random_state=0)
lr.fit(X_train_std, y_train)
lr.predict_proba(X_test_std[0,:]) # 查看第一个测试样本属于各个类别的概率
plot_decision_regions(X_combined_std, y_combined, classifier=lr, test_idx=range(105,150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.show()
从上图我们看到逻辑回归模型把类别很好地分开了。还有一点你需要注意的是,上面代码中的plot_decision_regions函数是我自己写的,scikit-learn中并没有这个函数,如果你需要的话,给我留言,我发给你!!!}

我要回帖

更多关于 法律逻辑学论文 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信