matlab 神经网络输出概率
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab 神经网络输出概率相关的知识,希望对你有一定的参考价值。
如图,这是matlab2017a里面给的一个通过卷积神经网络识别数字的例子,图二是定义这个卷积神经网络的方法,目前这种方法给的classify函数给出的结果是类别而不是概率。请问这种方法下如何使输出结果为概率呢?谢谢
[class,err,POSTERIOR] = classify(...)用第三个参数获取它分类的后验概率 参考技术A ?
如何将人工神经网络的输出转换为概率?
【中文标题】如何将人工神经网络的输出转换为概率?【英文标题】:How to convert the output of an artificial neural network into probabilities? 【发布时间】:2010-12-04 03:37:30 【问题描述】:我不久前读过有关神经网络的文章,我了解 ANN(尤其是通过反向传播学习的多层感知器)如何学会将事件分类为真或假。
我认为有两种方法:
1) 你得到一个输出神经元。如果它的值 > 0.5 则事件可能是真的,如果它的值是
2) 你得到两个输出神经元,如果第一个的值大于第二个的值,则事件可能为真,反之亦然。
在这些情况下,ANN 会告诉您某个事件是真还是假。它没有说明可能性有多大。
有没有办法将此值转换为一些赔率或直接从 ANN 中获取赔率。我想得到像“事件有 84% 的概率是真实的”这样的输出
【问题讨论】:
【参考方案1】:我会非常谨慎地将神经网络(实际上是任何机器学习分类器)的输出解释为概率。训练机器区分类别,而不是估计概率密度。事实上,我们在数据中没有这个信息,我们必须推断它。根据我的经验,我不建议任何人将输出直接解释为概率。
【讨论】:
【参考方案2】:当使用 ANN 进行 2 类分类并在输出层使用逻辑 sigmoid 激活函数时,输出值可以解释为概率。
因此,如果您在 2 个类之间进行选择,则使用 1-of-C 编码进行训练,其中 2 个 ANN 输出将分别具有每个类的训练值 (1,0) 和 (0,1)。
要获得第一类的概率百分比,只需将第一个 ANN 输出乘以 100。要获得其他类的概率,请使用第二个输出。
这可以推广到使用 softmax 激活函数的多类分类。
您可以在此处阅读更多内容,包括概率解释的证明:
[1] Bishop,Christopher M. 用于模式识别的神经网络。牛津大学出版社,1995 年。
【讨论】:
【参考方案3】:你试过教授吗? Hinton 建议用 softmax 激活函数和交叉熵误差训练网络?
作为示例,使用以下内容创建三层网络:
linear neurons [ number of features ]
sigmoid neurons [ 3 x number of features ]
linear neurons [ number of classes ]
然后使用您最喜欢的优化器随机下降/iprop plus/grad 下降,使用交叉熵误差 softmax 转移来训练它们。训练后输出神经元应归一化为总和 1。
详情请见http://en.wikipedia.org/wiki/Softmax_activation_function。 Shark 机器学习框架确实通过结合两个模型来提供 Softmax 功能。和教授。 Hinton 是一个优秀的在线课程 @http://coursera.com 关于细节。
【讨论】:
4 之后真的吗?多年的深思熟虑:没有正确的回忆。我也不再认为计算 NN 的后验概率是那么简单。你也许是对的。实际上,要计算 NN 的概率,我建议将 Bishop 作为读数,并进行贝叶斯处理。【参考方案4】:单个输出神经元的激活值是一个线性加权和,如果网络被训练为给出从 0 到 1 的输出范围,则可以直接将其解释为近似概率。如果前一阶段和提供最终输出的传递函数(或输出函数)也在 0 到 1 的范围内(通常是 sigmoid 逻辑函数)。但是,不能保证它会,但可以进行维修。此外,除非 sigmoid 是逻辑的并且权重被限制为正且总和为 1,否则这是不可能的。通常,神经网络将使用 tanh sigmoid 以及正负范围内的权重和激活(由于该模型的对称性)以更平衡的方式进行训练。另一个因素是该类的流行度——如果它是 50%,那么 0.5 阈值可能对逻辑有效,而 0.0 阈值可能对 tanh 有效。 sigmoid 旨在将事物推向范围的中心(在反向传播中)并限制它超出范围(在前馈中)。性能的重要性(相对于伯努利分布)也可以解释为神经元做出真实预测而不是猜测的概率。理想情况下,预测变量对正数的偏差应该与现实世界中正数的普遍性相匹配(这可能在不同的时间和地点有所不同,例如牛市与熊市,例如申请贷款的人与未能偿还贷款的人的信誉度) ) - 校准到概率的优点是可以轻松设置任何所需的偏差。
如果你有两个类的两个神经元,每个都可以像上面那样独立解释,它们之间的差值减半也可以。这就像翻转负类神经元并进行平均。这些差异还可以产生显着性概率估计(使用 T 检验)。
Brier 分数及其墨菲分解给出了对平均答案正确概率的更直接估计,而 Informedness 给出了分类器做出明智决策而不是猜测的概率,ROC AUC 给出了正类概率将比负类排名更高(通过正预测),当流行 = 偏差时,Kappa 将给出与 Informedness 相匹配的相似数字。
您通常需要的是整个分类器的显着性概率(以确保您是在真实的领域中进行,而不是在虚拟的猜测框架中)和特定示例的概率估计。有多种校准方法,包括对概率进行回归(线性或非线性),并使用其反函数重新映射到更准确的概率估计。这可以从 Brier 分数的提高中看出,校准分量降低到 0,但区分分量保持不变,ROC AUC 和 Informedness 也应保持不变(Kappa 存在偏差,可能会恶化)。
校准概率的简单非线性方法是使用 ROC 曲线 - 随着单个神经元输出的阈值或两个竞争神经元之间的差异发生变化,我们将结果的真假阳性率绘制在ROC 曲线(假阴性率和真阴性率自然是互补的,因为不是真正的阳性就是阴性)。然后,您逐点扫描 ROC 曲线(折线)(每次梯度变化时),并且正样本的比例为您提供与产生该点的神经阈值相对应的正样本的概率估计。曲线上点之间的值可以在校准集中表示的值之间进行线性插值 - 事实上,ROC 曲线中的任何坏点,由反凸(凹痕)表示,都可以通过凸包平滑 - 概率插值在船体段的端点。 Flach 和 Wu 提出了一种实际上翻转片段的技术,但这取决于信息被错误地使用,虽然它可以重复用于对校准集的任意改进,但它越来越不可能推广到测试情况。
(我来这里是为了寻找我很久以前看到的关于这些基于 ROC 的方法的论文——所以这是来自记忆,没有这些丢失的参考资料。)
【讨论】:
【参考方案5】:您可以做的是在输出层节点上使用sigmoid transfer function(接受数据范围 (-inf,inf) 并输出 [-1,1] 中的值)。 然后通过使用 1-of-n 输出编码(每个类一个节点),您可以将范围 [-1,1] 映射到 [0,1] 并将其用作每个类的概率类值(请注意,这自然适用于两个以上的类)。
【讨论】:
您的 sigmoid 输出范围错误。 sigmoid 传递函数的输出是 [0,1] 中的值。它显示在您提供的链接中。 @FabriceDugas sigmoid 通常指一系列函数,其输出范围为 [0,1] 或 [-1,1],具体取决于约定。有关示例,请参见:***.com/a/1480075/97160 啊,我的错。公约 公约。谢谢你的例子!【参考方案6】:一旦神经网络被训练,例如。使用问题中提到的反向传播(反向传播逻辑以最小化误差函数的方式“轻推”权重)与所有单个输入(“外部”输入或NN内输入)相关的权重是固定的。然后可以将 NN 用于分类目的。
在学习阶段的数学(和“选项”)可能会有点厚,作为分类器操作时相对简单和直接。主要算法是计算每个神经元的激活值,作为该神经元的输入 x 权重之和。然后将该值馈送到激活函数,其目的是对其进行规范化并将其转换为布尔值(在典型情况下,因为某些网络对其某些层没有全有或全无规则)。激活函数可能比你指出的更复杂,特别是它不需要是线性的,但无论它的形状如何,通常是 sigmoid,它都以相同的方式运行:找出激活函数在曲线上的位置,如果适用,在上面或低于阈值。然后,基本算法会处理给定层的所有神经元,然后再进行下一层。
考虑到这一点,使用感知器的能力来限定其猜测(或实际上是猜测 - 复数)与百分比值的问题,找到了一个简单的答案:你打赌它可以,它的输出是实值(如果有任何需要标准化)在我们将其转换为离散值(在多个类别的情况下为布尔值或类别 ID)之前,使用问题中描述的激活函数和阈值/比较方法。
所以...我如何以及在哪里获得“我的百分比”?...一切都取决于 NN 的实现,更重要的是,实现规定了可用于将激活值带入0-1 范围和,所有百分比的总和“加起来”为 1。在最简单的形式中,激活函数可用于将输入的值和权重归一化为输出层可用作确保“加起来”为 1 个问题的因素(前提是这些权重本身确实如此归一化)。
等等!
澄清:(按照马修的说明) 无需改变神经网络本身的工作方式;唯一需要做的就是以某种方式“挂钩”输出神经元的逻辑,以访问他们计算出的 [real-valued] 激活值,或者更好的是,访问激活函数,在其布尔转换之前(通常基于阈值或某个随机函数)。
换句话说,NN 像以前一样工作,它的训练和识别逻辑都没有改变,NN 的输入保持不变,各层之间的连接等等。我们只得到一个实值的副本输出层中神经元的激活,我们用它来计算百分比。百分比计算的实际公式取决于激活值的性质及其相关函数(其规模、相对于其他神经元输出的范围等)。 以下是几个简单的案例(取自问题的建议输出规则) 1)如果有单个输出神经元:激活函数提供的值相对于该函数的范围应该做的比率。 2)如果有两个(或多个输出神经元),例如分类器:如果所有输出神经元具有相同的激活函数,则给定神经元的百分比是其激活函数值除以所有激活函数的总和价值观。如果激活函数不同,则需要逐案处理,因为不同的激活函数可能表明有目的的希望给予某些神经元更多的权重,并且百分比应该尊重这一点。
【讨论】:
您好,感谢您的回答,我不确定我是否理解正确。你说的是你只是威胁 ANN 的输出作为概率,并简单地确保概率加起来为 1? ANN 将如何得知它应该输出的是概率。当我训练它时,我会用真实的结果训练它,所以训练集中的每个输出值都是 0 或 1(0.05 或 0.95)。但是,当我将 ANN 用于实际工作时,我希望输出值为 0.7 意味着事件为真 (1),概率为 70%。你是说我不需要做任何特别的事情来获得这种输出吗? @Mathieu 见“澄清”。我希望它有效地澄清了事情,我有时会在试图做相反的事情时让事情变得更加混乱;-) 我认为简而言之,它只是复杂的,因为人们需要知道与神经元的输出能够正确地标准化这些值。 (我有 values -plural,因为它可以是激活值或激活函数的 [real-valued] 输出) 嗨,mjv,您的澄清有效地回答了我的询问,感谢您的回答,我会将其标记为已接受。 @Mathieu。谢谢!很高兴这是一个澄清。与问题无关但您可能感兴趣,我想在这里插入由 numenta (www.numenta.com) 开发的 HTM 概念,因为这为分类器提供了一个非常有趣的框架。 为什么这些值是概率?【参考方案7】:我记得我在《神经计算理论导论》(hertz krogh palmer) 一书中看到了一个用反向传播训练的神经网络来近似结果概率的例子。我认为该示例的关键是一个特殊的学习规则,因此您不必将单位的输出转换为概率,而是自动将概率作为输出。 如果你有机会,试着检查那本书。
(顺便说一句,“玻尔兹曼机器”虽然不太出名,但它是专门为学习概率分布而设计的神经网络,您可能也想检查一下)
【讨论】:
以上是关于matlab 神经网络输出概率的主要内容,如果未能解决你的问题,请参考以下文章
故障诊断分析基于matlab PNN概率神经网络柴油机故障诊断含Matlab源码 2343期
matlab --概率神经网PNN与广义回归神经网络GRNN
故障诊断分析基于matlab概率神经网络柴油机故障诊断含Matlab源码 1754期