【数据挖掘】分类器性能度量实验 使用 matlab 编程实现ROC曲线绘制的函数roc_plot

实验内容

实验1

1、编程实现ROC曲线绘制的函数roc_plot。其中,分类概率使用matlab自带的朴素贝叶斯函数得到。

测试数据

测试代码如下:

load('testingData.mat')
load('trainingData.mat')
nb = NaiveBayes.fit(trAttr, trLabels);
p=posterior (nb,tstAttr);
y1=p(:,2);
[auc1 ,FPR1 ,TPR1 ]  = roc_plot(y1,tstLabels);

训练数据见trainingData.mat,测试数据见testingData.mat

链接:https://pan.baidu.com/s/1Or3DpNVoCdzXoI2z3iu_mw
提取码:wa6z

实验代码

function [AUC,FPR,TPR] = roc_plot(y1,tstLabels)
[val,ind] = sort(y1);  %%对y1进行排序
roc_y = tstLabels(ind); %%根据下标对测试标签进行排序
num = length(roc_y);   %%求测试数据的长度
FPR = zeros(num,1) %%设置横坐标
TPR = zeros(num,1) %%设置纵坐标
P = sum(roc_y(:)==1);  %%P表示原本全为正的个数
N = sum(roc_y(:)==0);  %%N表示原本全为负的个数
for i=1:num
    TP = sum(roc_y(i:end)==1);
    FP = sum(roc_y(i:end)==0);   
    TPR(i) = TP/P;
    FPR(i) = FP/N;
end
TPR = [TPR;0];
FPR = [FPR;0];
AUC = 0;
for i=2:num+1
    AUC = AUC + TPR(i)*(FPR(i-1)-FPR(i));
end
figure,plot(FPR,TPR);
xlabel('False Positive Rate');  %%横坐标FPR
ylabel('True Positive Rate');   %%纵坐标TPR
title(['ROC curve (AUC = ' num2str(AUC) ' )']);
end

测试结果

实验2

(难度2)编程实现ROC曲线绘制的函数roc_plot。其中,分类概率使用自己编写的朴素贝叶斯函数bys_post1得到

测试数据

测试代码如下:

load('testingData.mat')
load('trainingData.mat')
[post4all]=bys_post1(trAttr, trLabels,tstAttr);
y2=post4all(:,2);
[auc2 ,FPR2 ,TPR2 ]  = roc_plot(y2,tstLabels);

训练数据见trainingData.mat,测试数据见testingData.mat

链接:https://pan.baidu.com/s/1Or3DpNVoCdzXoI2z3iu_mw
提取码:wa6z

实验代码

function [post4all] = bys_Classify(trAttr,trLabels,tstAttr)
%NaiveBayesTrain 只处理连续属性,不处理分类属性
[Params,prior,AllLabels] = NaiveBayesTrain(trAttr, trLabels);
N = size(tstAttr,1);
Labels = zeros(N,1);
for i=1 : N
    tstAttrSample = tstAttr(i,:);
    post = NaiveBayesPrdeict(Params,prior,tstAttrSample);
    post4all(i,:) = post./sum(post);
end
end
%NaiveBayesTrain 只处理连续属性,不处理分类属性
function [Params,prior,AllLabels] = NaiveBayesTrain(trAttr,trLabels)
AllLabels = unique(trLabels);
numClass = length(AllLabels);%取得所有类标号的种类个数
Ind4Class{numClass,1} = [];
for i =1 : numClass
   ind = find(trLabels == AllLabels(i));
   Ind4Class{i,1} = ind;
   prior(i) = length(ind)/length(trLabels);
end

numAttr = size(trAttr,2);
Params{numClass,numAttr} = [];

for AttrInd = 1 : numAttr
    AttrVals = trAttr(:,AttrInd);
    for i = 1 : numClass
        Params{i,AttrInd} = GetParams4ContiAttr(AttrVals,Ind4Class{i,1});
    end
end

end



function Paramsl = GetParams4ContiAttr(AttrVals,ind)
Attrvals4ThisClass = AttrVals(ind);
Paramsl(1) = mean(Attrvals4ThisClass);  %%求出均值
Paramsl(2) = var(Attrvals4ThisClass);   %%求出方差
end

function post = NaiveBayesPrdeict(Params,prior,tstAttr)
numClass = length(prior);
numAttr = length(tstAttr);
post = [];
for i = 1: numClass
    p_AttrCond = 1;
    for AttrInd = 1 : numAttr
        AttrVals = tstAttr(AttrInd);
            mean = Params{i,AttrInd}(1);
            sig = sqrt(Params{i,AttrInd}(2));
            p = (1/(sqrt(2*pi)*sig))*exp(-(AttrVals-mean)^2/(2*sig^2));
            p_AttrCond = p_AttrCond*p;
    end
    post(i) = p_AttrCond*prior(i);
end
end

测试结果

学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 Vue爱好者 博客之星
不是只会写业务代码的前端开发攻城狮!博客网站:yangchaoyi.vip做限量版的自己,就这样安静地努力。一个还在苦学前端的小小Chocolate,我的博客主要分享前端、算法、大学课程笔记、平常遇到的bug、心得感悟体会,感谢您的访问,若喜欢可以关注一下~每一个清晨,记得鼓励自己。没有奇迹,只有你努力的轨迹;没有运气,只有你坚持的勇气!每一份坚持都是成功的累积,只要相信自己,总会遇到惊喜!座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值