聚类和贝叶斯分类器Matlab

时间:2012-07-19 18:19:34

标签: matlab cluster-analysis classification bayesian fuzzy-c-means

所以我正处于下一步该做什么的交叉路上,我开始学习并在一个复杂的数据集上应用一些机器学习算法,我现在已经做到了。我的计划从一开始就是结合两种可能的分类器,试图建立一个多分类系统。

但这里是我被困的地方。我选择聚类算法(模糊C均值)(在学习一些样本K均值之后)和朴素贝叶斯作为MCS(多分类系统)的两个候选者。

我可以独立使用两者来对数据进行分类,但我正在努力以有意义的方式将两者结合起来。

例如,模糊聚类几乎捕获所有“蓝精灵”攻击,除了通常一个,我不知道为什么它没有捕捉到这个奇数球但我所知道的只是它没有。其中一个集群将由smurf攻击占主导地位,通常我会在其他集群中找到一个蓝精灵。如果我在所有不同的攻击类型(Smurf,普通,海王星......等)上训练贝叶斯分类器并将其应用于其余的群集以试图找到最后一个,那么这就是我遇到问题场景的地方剩下的蓝精灵会有很高的误报率。

我不确定如何继续,我不想将其他攻击带出训练集,但我只想训练贝叶斯分类器来发现“蓝精灵”攻击。目前,它经过培训可以尝试发现所有内容,在这个过程中,我认为(不确定)精确度会下降。

所以这是我在使用朴素贝叶斯分类器时的问题,你如何才能让它只查找smurf并将其他所有内容归类为“其他”。

 rows = 1000;
 columns = 6;

 indX = randperm( size(fulldata,1) );
 indX = indX(1:rows)';

 data = fulldata(indX, indY)

 indX1 = randperm( size(fulldata,1) );
 indX1 = indX1(1:rows)';


%% apply normalization method to every cell
%data = zscore(data);

training_data = data;
target_class = labels(indX,:)

class  = classify(test_data,training_data, target_class, 'diaglinear')
confusionmat(target_class,class)

我在想的是手动将target_class从所有正常流量和非smurf攻击转移到其他。然后我已经知道FCM正确地对除了一个smurf攻击之外的所有类别进行分类,我只需要在剩余的集群上使用朴素的贝叶斯分类器。

例如:

群集1 = 500次smurf攻击(重复此步骤可能会将“大多数”smurf攻击从1000个样本转移到另一个群集中,因此我必须检查或迭代群集中的最大值大小,一旦发现我可以从天真的贝叶斯分类器阶段中删除它)

然后我在每个剩余的集群上测试分类器(不知道如何在matlab中进行循环等),所以目前我必须在处理过程中手动选择它们。

    clusters = 4;
    CM = colormap(jet(clusters));
    options(1) = 12.0;
    options(2) = 1000;
    options(3) = 1e-10;
    options(4) = 0;
  [~,y] = max(U);
  [centers, U, objFun] = fcm(data, clusters, options); % cluster 1000 sample data rows

training_data = newTrainingData(indX1,indY); % this is the numeric data 
test_data = fulldata(indX(y==2),:); % this is cluster 2 from the FCM phase which will be classified. 
test_class = labels(indX(y==2),:); % thanks to amro this helps the confusion matrix give an unbiased error detection rate in the confusion matrix. 
 target_class = labels(indX,:) % this is labels for the training_data, it only contains the smurf attacks while everything else is classed as other 

 class  = classify(test_data,training_data, target_class, 'diaglinear')
 confusionmat(test_class,class)
然后,我为剩下的每个群集重复贝叶斯分类器,寻找那个smurf攻击。

我的问题是如果它将“其他”攻击错误分类为蓝精灵或者找不到剩余的蓝精灵会发生什么。

我觉得有点迷失在更好的方式上。我正在尝试选择一个很好的smurf攻击比例到“其他”,因为我不想过度适应,这在上一个问题here中有所解释。

但这需要一些时间,因为我还不知道如何将现有标签从海王星,背部,ipsweep,wareclient攻击更改/替换为matlab中的“其他”,所以我还不能测试这个理论(将到达那里)。

所以我的问题是:

1)找到一种难以捉摸的smurf攻击是否有更好的方法。

2)如何使用“其他

来grep target_class(标签)来替换所有非smurf的内容

1 个答案:

答案 0 :(得分:1)

我会尝试部分回答你的问题。

  

1)找到一种难以捉摸的smurf攻击是否有更好的方法。

我建议你不要试试这个。这显然是一个过度拟合数据的情况。您的分类器不能很好地概括为测试数据。

  

2)如何grep target_class(标签)用“other”替换所有非smurf

为此尝试遵循matlab代码。

clear all;
close all;
load fisheriris
IndexOfVirginica = strcmp (species, 'virginica');
IndexOfNotVirginica = IndexOfVirginica ==0;
otherSpecies = species;
otherSpecies(IndexOfNotVirginica) = {'other'};
otherSpecies