【问题标题】:clustering data outputs irregular plot graph聚类数据输出不规则图
【发布时间】:2011-12-08 16:41:06
【问题描述】:

好的,我将介绍我试图实现的目标以及我是如何实现它的,然后我将解释我为什么尝试这种方法。

我有来自 1999 年 KDD 杯的原始格式数据,该数据有 494k 行和 42 列。

我的目标是尝试在无人监督的情况下对这些数据进行聚类。来自上一个问题:

clustering and matlab

我收到了这样的反馈:

对于初学者,您需要将属性标准化为相同 规模:计算欧几里得距离作为步骤 3 的一部分时 方法,以 239 和 486 等值的特征为主 超过其他小值为 0.05 的特征,从而破坏了 结果。

要记住的另一点是,太多的属性可能是不好的 事情(维度的诅咒)。因此,您应该研究功能 选择或降维技术。

所以我开始做的第一件事就是解决与本文相关的功能选择:http://narensportal.com/papers/datamining-classification-algorithm.aspx#_sec-2-1

选择必要的功能后看起来像这样:

因此,对于聚类,我删除了离散值,这让我留下了 3 列带有数字数据的列,然后我开始删除重复的行,请参阅:junk, index and unique on a matrix (how to keep matrix format) 在文件中将 3 列从 494k 减少到 67k,这已完成像这样:

[M,ind] = unique(data, 'rows', 'first');
[~,ind] = sort(ind);
M = M(ind,:);

然后我使用随机排列将文件大小从 67k 减少到 1000,如下所示:

m = 1000;
n = 3;

%# pick random rows
indX = randperm( size(M,1) );
indX = indX(1:m);

%# pick random columns
indY = randperm( size(M,2) );
indY = indY(1:n);

%# filter data
data = M(indX,indY)

所以现在我有一个文件,其中包含我选择的 3 个特征我已经删除了重复记录并使用随机排列来进一步减少数据集我的最后一个目标是规范化这些数据,我这样做了:

normalized_data = data/norm(data);

然后我使用了以下 K-means 脚本:

%% generate clusters
K = 4;

%% cluster
opts = statset('MaxIter', 500, '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), 50, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
%% plot clusters quality
figure
[silh,h] = silhouette(data, clustIDX);
avrgScore = mean(silh);

%% Assign data to clusters
% calculate distance (squared) of all instances to each cluster centroid
D = zeros(numObservarations, K);     % init distances
for k=1:K
%d = sum((x-y).^2).^0.5
D(:,k) = sum( ((data - repmat(clusters(k,:),numObservarations,1)).^2), 2);
end

% find  for all instances the cluster closet to it
[minDists, clusterIndices] = min(D, [], 2);
% compare it with what you expect it to be
sum(clusterIndices == clustIDX)

但我的结果仍然像我在这里提出的原始问题一样出来:clustering and matlab

这是绘制时数据的样子:

和:

任何人都可以帮助解决这个问题,我使用的方法不正确还是我缺少什么?

【问题讨论】:

    标签: matlab sorting random cluster-analysis normalization


    【解决方案1】:

    就像感谢 cyborg 和 Amro 的帮助一样,我意识到我没有创建自己的预处理,而是保留了维度,最终我设法获得了一些集群数据!

    输出!

    当然,我仍然有一些异常值,但如果我能摆脱它们并从 -0.2 到 0.2 绘制图表,我相信它看起来会好很多。但是,如果您看一下最初的尝试,我似乎已经到了那里!

      %% 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 = 42
        [U,S,V]=svds(fulldata,columns)
        %% randomly select dataset
        rows = 5000;
        %# pick random rows
        indX = randperm( size(fulldata,1) );
        indX = indX(1:rows);
        %# pick random columns
        indY = randperm( size(fulldata,2) );
        indY = indY(1:columns);
        %# filter data
        data = U(indX,indY)
        %% apply normalization method to every cell
        data = data./repmat(sqrt(sum(data.^2)),size(data,1),1)
        %% generate sample data
        K = 4;
        numObservarations = 5000;
        dimensions = 42;
        %% cluster
        opts = statset('MaxIter', 500, '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')
        %% plot clusters quality
        figure
        [silh,h] = silhouette(data, clustIDX);
        avrgScore = mean(silh);
        %% Assign data to clusters
        % calculate distance (squared) of all instances to each cluster centroid
        D = zeros(numObservarations, K);     % init distances
        for k=1:K
        %d = sum((x-y).^2).^0.5
        D(:,k) = sum( ((data - repmat(clusters(k,:),numObservarations,1)).^2), 2);
        end
        % find  for all instances the cluster closet to it
        [minDists, clusterIndices] = min(D, [], 2);
        % compare it with what you expect it to be
        sum(clusterIndices == clustIDX)
    

    【讨论】:

    • ...或者,您可以更详细地检查它们,而不是摆脱异常值。当您进行异常检测时,通常异常值比“表现良好”的点更有趣。那里可能会发生一些有趣的事情。
    • 啊,好点 Bob 事实上异常可能是 r2l 和 u2r 攻击,我将进一步调查! +1 发现它!
    【解决方案2】:

    你在规范化中有问题:data/norm(data);。你可能需要做的是 使用:data_normed = data./repmat(sqrt(sum(data.^2)),size(data,1),1)。这会计算data 每一列的范数,然后将答案复制到data 的原始大小,然后将data 除以列的范数。

    评论:

    降低特征数量的维数的更好方法是[U,S,V]=svd(data); U=U(:,1:m) 或稀疏数据[U,S,V]=svds(data,m)。它可能会在途中丢失一些信息,但它比随机挑选要好得多。

    【讨论】:

    • [U,S,V]=svds(data,m) 不会减小矩阵的大小?
    • 嗯...您是否阅读了所有您之前发布的stackoverflow.com/questions/7715891/clustering-and-matlab 的反馈?建议您首先在更容易的事情上切齿,因为您正在处理的数据来自一个非常困难的问题。尽管如此,如果您想减少数据的维度(您可能会这样做,因为此类高维数据具有影响这些方法的属性),那么您可以在 @ 987654322@.
    猜你喜欢
    • 2020-06-06
    • 2012-07-07
    • 2021-03-17
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多