Matlab 分类器产生连续的值而不是不同的标签

Matlab 分类器产生连续的值而不是不同的标签,matlab,neural-network,classification,pattern-recognition,mlp,Matlab,Neural Network,Classification,Pattern Recognition,Mlp,解释如何将多层感知器应用于分类任务。我有一个长度为80的输入特征向量,我想训练一个多层感知器,将输入向量分为两类-0和1。我的输出层包含1个节点 问题1我希望分类器有一个二进制输出,但是模型输出的实值数字在0和1之间。为什么会发生这种情况,以及如何将其转换为二进制类?教程链接中没有提到如何获取二进制值标签,即在最后一层中使用什么函数 为了澄清,一旦在下面计算了模型输出,则为前4个输出值 y= 0.1042 0.9961 0.9956 0.0049 我可以使用一个简单的阈值函数,如bin_targ

解释如何将多层感知器应用于分类任务。我有一个长度为80的输入特征向量,我想训练一个多层感知器,将输入向量分为两类-0和1。我的输出层包含1个节点

问题1我希望分类器有一个二进制输出,但是模型输出的实值数字在0和1之间。为什么会发生这种情况,以及如何将其转换为二进制类?教程链接中没有提到如何获取二进制值标签,即在最后一层中使用什么函数

为了澄清,一旦在下面计算了模型输出,则为前4个输出值

y= 0.1042 0.9961 0.9956 0.0049 我可以使用一个简单的阈值函数,如bin_target=y>=0.5,其中所有大于或等于0.5的数字都标记为1,其余的标记为0。但是,手动选择阈值对我来说似乎是任意的

问题2 MSE的计算:应在已知二值目标Y和实值模型输出Y或perfClassify=Y_bin-Y之间计算均方误差或简单误差以报告性能

下面的代码是我对数据输入进行分类的尝试

问题1之所以出现,是因为默认的输出传递函数是“softmax”,这在技术上是一个连续函数,是一个概率分布。这种输出包括置信度信息,而不仅仅是输出类。我的观点是0.5是二进制分类问题的正确阈值,因为据我所知,得到输出的值意味着这个输入对应于类true的概率

>>净=净; >>dispnet.layers{net.numLayers}.transferFcn; softmax 很遗憾,我无法评论softmax是否适合您的问题,但如果您想更改它,可以使用“帮助”找到选项列表:

>>帮助转移 神经网络传递函数。 竞争传递函数。 elliotsig-ElliotSigmoid传递函数。 hardlim-正硬极限传递函数。 hardlims-对称硬极限传递函数。 logsig-对数S形传递函数。 逆传递函数。 poslin-正线性传递函数。 purelin-线性传递函数。 radbas-径向基传递函数。 radbasn-径向基归一化传递函数。 satlin-正饱和线性传递函数。 对称饱和线性传递函数。 softmax-Soft max传递函数。 tansig-对称S形传递函数。 三角基传递函数。 主nnet功能列表。 也许你要找的是。要更改传递函数,只需为最后一层的transferFcn字段指定一个有效值,例如net.layers{net.numLayers}.transferFcn='hardlim'


至于问题2,如中所述,使用连续分数是有益的。

请尝试重新表述您的问题,以便更清楚地解释3件事:预期结果是什么,目前正在发生什么,以及您如何尝试解决它。请集中精力让你的问题变得独立,也就是说,在文章的正文中包含所有必要的信息,这样它就可以回答,而不必遵循链接。该链接有助于了解上下文,但可能链接到该页面中的特定数字会更有助于解释您的问题。谢谢您的回答。为了澄清,更改最后一层的传递函数的方法,我是否应该在语句net.layers{net.numLayers}.transferFcn='hardlim'中提到层的数量?那么,如果有一个输入层,后面是两个隐藏层,然后是一个输出层,那么这个命令应该是什么?不需要更改命令,它总是指最后一层。当然,不要相信我的话——你应该自己运行它并验证结果。非常感谢。关于MSE的答案,我确实关心将实值模型的输出与目标类标签进行比较的过程。这是因为在这种情况下,MSE可能不接近零。此外,如果混淆矩阵也用作性能工具,则使用实值输出可能是矛盾的-混淆矩阵将显示100%的准确性,而MSE相当高。然而,如果在标签之间比较MSE,即在使用0.5作为阈值转换实值模型的输出之后,则MSE可能为零。你的建议是什么?如果你能通过详细阐述这一点来更新你的答案,这将是很有帮助的-如果MSE和混淆矩阵都被使用,那么这两种方法都使用不同的值。MSE使用实值输出和二进制值目标之间的误差。另一方面,混淆矩阵使用二进制值。
不幸的是,我不是这方面的专家,所以我不能不阅读链接帖子中的文章来详细阐述。无论如何,这听起来像是一个完全不同的问题,值得单独讨论。我建议你或者在上打开一个新问题,对要求澄清的链接问题发表评论,或者向文章作者发送一封关于他们文章的电子邮件。如果没有这些信息,你觉得这个答案没有用,我会删除它。
% Create a Pattern Recognition Network
hiddenLayerSize = 10;
net = init(net);
net.performFcn = 'crossentropy';
net = patternnet(hiddenLayerSize);

% Train the Network
[net,tr] = train(net,inputs,Y);  % Y=targets

% Test the Network
y = net(inputs);

bin_target = y>=0.5;
error1 = bin_target-Y'; 
% OR
error2 = y - Y';