こんにちは、私は 1999 年の darpa データ セットからネットワーク データをクラスター化しようとしています。残念ながら、同じ手法と方法を使用して、一部の文献と比較するのではなく、実際にはクラスター化されたデータを取得していません。
私のデータは次のようになります。
ご覧のとおり、あまりクラスター化されていません。これは、データセットに多くの外れ値 (ノイズ) があるためです。いくつかの外れ値除去手法を見てきましたが、これまで試したことはありませんが、実際にデータをきれいにします。私が試した方法の1つ:
%% When an outlier is considered to be more than three standard deviations away from the mean, determine the number of outliers in each column of the count matrix:
mu = mean(data)
sigma = std(data)
[n,p] = size(data);
% Create a matrix of mean values by replicating the mu vector for n rows
MeanMat = repmat(mu,n,1);
% Create a matrix of standard deviation values by replicating the sigma vector for n rows
SigmaMat = repmat(sigma,n,1);
% Create a matrix of zeros and ones, where ones indicate the location of outliers
outliers = abs(data - MeanMat) > 3*SigmaMat;
% Calculate the number of outliers in each column
nout = sum(outliers)
% To remove an entire row of data containing the outlier
data(any(outliers,2),:) = [];
最初の実行では、完全なデータセットから選択された 1000 の正規化されたランダム行から 48 行が削除されました。
これは、データで使用した完全なスクリプトです。
%% load data
%# read the list of features
fid = fopen('kddcup.names','rt');
C = textscan(fid, '%s %s', 'Delimiter',':', 'HeaderLines',1);
fclose(fid);
%# determine type of features
C{2} = regexprep(C{2}, '.$',''); %# remove "." at the end
attribNom = [ismember(C{2},'symbolic');true]; %# nominal features
%# build format string used to read/parse the actual data
frmt = cell(1,numel(C{1}));
frmt( ismember(C{2},'continuous') ) = {'%f'}; %# numeric features: read as number
frmt( ismember(C{2},'symbolic') ) = {'%s'}; %# nominal features: read as string
frmt = [frmt{:}];
frmt = [frmt '%s']; %# add the class attribute
%# read dataset
fid = fopen('kddcup.data_10_percent_corrected','rt');
C = textscan(fid, frmt, 'Delimiter',',');
fclose(fid);
%# convert nominal attributes to numeric
ind = find(attribNom);
G = cell(numel(ind),1);
for i=1:numel(ind)
[C{ind(i)},G{i}] = grp2idx( C{ind(i)} );
end
%# all numeric dataset
fulldata = cell2mat(C);
%% dimensionality reduction
columns = 6
[U,S,V]=svds(fulldata,columns);
%% randomly select dataset
rows = 1000;
columns = 6;
%# pick random rows
indX = randperm( size(fulldata,1) );
indX = indX(1:rows)';
%# pick random columns
indY = indY(1:columns);
%# filter data
data = U(indX,indY);
% apply normalization method to every cell
maxData = max(max(data));
minData = min(min(data));
data = ((data-minData)./(maxData));
% output matching data
dataSample = fulldata(indX, :)
%% When an outlier is considered to be more than three standard deviations away from the mean, use the following syntax to determine the number of outliers in each column of the count matrix:
mu = mean(data)
sigma = std(data)
[n,p] = size(data);
% Create a matrix of mean values by replicating the mu vector for n rows
MeanMat = repmat(mu,n,1);
% Create a matrix of standard deviation values by replicating the sigma vector for n rows
SigmaMat = repmat(sigma,n,1);
% Create a matrix of zeros and ones, where ones indicate the location of outliers
outliers = abs(data - MeanMat) > 2.5*SigmaMat;
% Calculate the number of outliers in each column
nout = sum(outliers)
% To remove an entire row of data containing the outlier
data(any(outliers,2),:) = [];
%% generate sample data
K = 6;
numObservarations = size(data, 1);
dimensions = 3;
%% cluster
opts = statset('MaxIter', 100, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);
%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 5, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 100, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
grid on
view([90 0]);
%% plot clusters quality
figure
[silh,h] = silhouette(data, clustIDX);
avrgScore = mean(silh);
これは、出力からの 2 つの異なるクラスターです。
ご覧のとおり、データは元のデータよりもクリーンでクラスター化されているように見えます。しかし、私はまだより良い方法を使用できると思います。
たとえば、全体的なクラスタリングを観察すると、データセットからまだ多くのノイズ (外れ値) があります。ここに見られるように:
後で分類するために、外れ値の行を別のデータセットに入れる必要があります (クラスタリングからのみ削除されます)。
darpa データセットへのリンクは次のとおりです。10% のデータ セットでは列が大幅に削減されていることに注意してください。0 または 1 が連続している列の大部分は削除されています (42 列から 6 列)。
http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html
編集
データセットに保持される列は次のとおりです。
src_bytes: continuous.
dst_bytes: continuous.
count: continuous.
srv_count: continuous.
dst_host_count: continuous.
dst_host_srv_count: continuous.
再編集:
Anony-Mousse との議論と彼の回答に基づいて、K-Medoids http://en.wikipedia.org/wiki/K-medoidsを使用してクラスタリングのノイズを減らす方法があるかもしれません。現在持っているコードに大きな変更がないことを願っていますが、これを実装してノイズが大幅に削減されるかどうかをテストする方法はまだわかりません。したがって、誰かが私に実際の例を示すことができれば、これは答えとして受け入れられます。