【问题标题】:Out of memory error while using clusterdata in MATLAB在 MATLAB 中使用 clusterdata 时出现内存不足错误
【发布时间】:2011-02-26 03:04:12
【问题描述】:

我正在尝试对矩阵进行聚类(大小:20057x2)。:

T = clusterdata(X,cutoff);

但我收到此错误:

???使用 ==> pdistmex 时出错 记不清。键入 HELP MEMORY 作为您的选项。 ==> pdist 中的错误在 211 Y = pdistmex(X',dist,additionalArg); ==> 链接中的错误 139 Z = linksmex(Y,method,pdistArg); ==> clusterdata 中的错误为 88 Z = 链接(X,linkageargs{1},pdisargs); ==> kmeansTest 在 2 处出错 T = 集群数据(X,1);

谁能帮帮我。我有 4GB 的内存,但认为问题出在其他地方..

【问题讨论】:

    标签: matlab cluster-analysis hierarchical


    【解决方案1】:

    X 太大,无法在 32 位机器上执行。 pdist 正在尝试制作一个 201,131,596 行向量(clusterdata 使用 pdist)的双精度,这将使用大约 1609MB(double 是 8 个字节)......如果你在 /3GB 的 Windows 下运行它切换您的最大矩阵大小为 1536MB(请参阅here)。

    您将需要以某种方式划分数据,而不是一次性直接将所有数据聚集在一起。

    【讨论】:

      【解决方案2】:

      PDIST 计算所有可能的行对之间的距离。如果您的数据包含 N=20057 行,则对数将为 N*(N-1)/2,在您的情况下为 201131596。对您的机器来说可能太多了。

      【讨论】:

        【解决方案3】:

        正如其他人所提到的,层次聚类需要计算成对距离矩阵,这在你的情况下太大而无法放入内存。

        尝试改用 K-Means 算法:

        numClusters = 4;
        T = kmeans(X, numClusters);
        

        或者,您可以选择数据的随机子集并用作聚类算法的输入。接下来,您将集群中心计算为每个集群组的平均值/中位数。最后,对于未在子集中选择的每个实例,您只需计算其到每个质心的距离并将其分配给最近的一个。

        这里有一个示例代码来说明上面的想法:

        %# random data
        X = rand(25000, 2);
        
        %# pick a subset
        SUBSET_SIZE = 1000;            %# subset size
        ind = randperm(size(X,1));
        data = X(ind(1:SUBSET_SIZE), :);
        
        %# cluster the subset data
        D = pdist(data, 'euclid');
        T = linkage(D, 'ward');
        CUTOFF = 0.6*max(T(:,3));      %# CUTOFF = 5;
        C = cluster(T, 'criterion','distance', 'cutoff',CUTOFF);
        K = length( unique(C) );       %# number of clusters found
        
        %# visualize the hierarchy of clusters
        figure(1)
        h = dendrogram(T, 0, 'colorthreshold',CUTOFF);
        set(h, 'LineWidth',2)
        set(gca, 'XTickLabel',[], 'XTick',[])
        
        %# plot the subset data colored by clusters
        figure(2)
        subplot(121), gscatter(data(:,1), data(:,2), C), axis tight
        
        %# compute cluster centers
        centers = zeros(K, size(data,2));
        for i=1:size(data,2)
            centers(:,i) = accumarray(C, data(:,i), [], @mean);
        end
        
        %# calculate distance of each instance to all cluster centers
        D = zeros(size(X,1), K);
        for k=1:K
            D(:,k) = sum( bsxfun(@minus, X, centers(k,:)).^2, 2);
        end
        %# assign each instance to the closest cluster
        [~,clustIDX] = min(D, [], 2);
        
        %#clustIDX( ind(1:SUBSET_SIZE) ) = C;
        
        %# plot the entire data colored by clusters
        subplot(122), gscatter(X(:,1), X(:,2), clustIDX), axis tight
        

        【讨论】:

        • 感谢您的全面回答,我使用层次聚类的原因是我事先不知道需要多少个聚类。在 kmeans 中,我必须从一开始就定义,并且由于我的项目的性质,我不可能使用 Kmeans。无论如何谢谢...
        • @Hossein:我将代码更改为使用cutoff 值来查找最佳集群数量,而无需事先指定...
        • 再次感谢您,但我得到了错误:表达式或语句不正确--可能不平衡 (、{ 或 [。对于这一行:%# 将每个实例分配给最近的集群 [~ ,clustIDX] = min(D, [], 2);
        • 我修复了错误。但是我对这段代码有一个主要问题,问题是每次我运行它时,它都会给我不同的集群......有时差异微不足道且可以接受,但有时没有。是否有可能以始终给出相同结果的方式对其进行更改?谢谢
        • 请注意,我在上面的示例中生成随机数据作为输入,此外我从该数据中随机选择了一个子集。因此,如果您使用特定的数据集并始终选择相同的实例子集,则结果将是确定性的……请记住,您始终可以为截止值和子集大小变量尝试不同的值,直到您对结果满意为止跨度>
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多