gpt4 book ai didi

matlab - 如何计算roc曲线?

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:17 26 4
gpt4 key购买 nike

我编写了一个分类器(高斯混合模型)来对五种人类行为进行分类。对于每个观察,分类器计算属于一个集群的后验概率。

我想用一个阈值来评估我的系统的性能,值从 0 到 100。对于每个阈值,对于每个观察,如果属于一个集群的概率大于阈值,我接受结果分类器,否则我将其丢弃。

对于每个阈值,我计算真阳性、真阴性、假阳性、假阴性的数量。

然后我计算两个函数:灵敏度和特异性

sensitivity = TP/(TP+FN);

specificity=TN/(TN+FP);

在 matlab 中:

plot(1-specificity,sensitivity);

拥有 ROC 曲线。但结果不是我所期望的。

这是丢弃、错误、纠正、灵敏度和特异性函数的图,它改变了一个 Action 的阈值。

This is the plot of the functions of discards, errors, corrects, sensitivity and specificity varying the threshold

这是一个 Action 的ROC曲线图 This is the plot of ROC curve

这是同一 Action 的 ROC 曲线的主干 enter image description here

我错了,但我不知道在哪里。也许我在 FP、FN、TP、TN 的计算上做错了,尤其是当分类器的结果小于阈值时,所以我放弃了。当有丢弃时我必须增加什么?

最佳答案

背景

我回答这个问题是因为我需要研究内容,像这样的问题是一个很好的借口。感谢您提供的好机会。

我使用来自内置 fisher iris 数据的数据: http://archive.ics.uci.edu/ml/datasets/Iris

我还使用 Mathworks 教程中关于分类和 plotroc 的代码片段

问题描述

域内有更清晰的边界来对“setosa”进行分类,但“versicoloir”与“virginica”存在重叠。这是一个二维图,一些其他信息已被丢弃以生成它。在这种情况下,分类边界的模糊性很有用。

%load data
load fisheriris

%show raw data
figure(1); clf
gscatter(meas(:,1), meas(:,2), species,'rgb','osd');
xlabel('Sepal length');
ylabel('Sepal width');
axis equal
axis tight
title('Raw Data')

display of the data

分析

假设我们要确定定义“virginica”与“non-virginica”的线性分类器的界限。我们可以看看其他类的“ self 与非 self ”,但他们会有自己的

现在我们制作一些线性判别式并为它们绘制 ROC:

%load data
load fisheriris
load iris_dataset

irisInputs=meas(:,1:2)';
irisTargets=irisTargets(3,:);

ldaClass1 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'linear')';
ldaClass2 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'diaglinear')';
ldaClass3 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'quadratic')';
ldaClass4 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'diagquadratic')';
ldaClass5 = classify(meas(:,1:2),meas(:,1:2),irisTargets,'mahalanobis')';

myinput=repmat(irisTargets,5,1);
myoutput=[ldaClass1;ldaClass2;ldaClass3;ldaClass4;ldaClass5];
whos
plotroc(myinput,myoutput)

结果如下所示,虽然删除了对角线的重复副本:

enter image description here

您可以在代码中注意到我堆叠了“myinput”和“myoutput”并将它们作为输入提供给“plotroc”函数。您应该将分类器的结果作为目标和实际值,您可以获得类似的结果。这会将分类器的实际输出与目标值的理想输出进行比较。这些是 plotroc 的输入。

所以这会给你“内置的”ROC,这对快速工作很有用,但不会让你详细了解每一步。

此时您可以提出的问题包括:

  • 哪个分类器最好?在这种情况下,我如何确定什么是最好的?
  • 分类器的凸包是什么?是否存在比任何纯方法提供更多信息的分类器混合?也许装袋?

关于matlab - 如何计算roc曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12980259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com