Matlab:如何自定义聚类代码作为多级聚类?

时间:2016-09-07 04:26:44

标签: matlab cluster-analysis multistage

我想聚集大量的数据记录。我正在处理的数据是字符串类型。聚类过程需要很长时间 让我们假设我想将一组电子邮件数据记录聚集到群集中,同一个人写的电子邮件被分配到同一个群集(考虑到一个人可能以不同的方式写下他/她的名字)。 /> 我想执行多阶段群集:

  • 基于名称的第一阶段聚类,如果两个记录之间的名称距离小于阈值,我们会考虑这些聚类......
  • 数据记录基于其他属性(名称除外)进入群集的第二阶段。

计算成对距离。现在我正处于聚类阶段。我想对dbscan群集使用以下代码:

function [IDX, isnoise] = dbscan_strings(X,epsilon,MinPts)
C = 0;
n = size(X,1); 
IDX = zeros(n,1);
D = pdist2(X,X,@intersection);
visited = false(n,1);
isnoise = false(n,1);
for i = 1:n
    if ~visited(i)
        visited(i) = true;
        Neighbors = RegionQuery(i);
        if numel(Neighbors)<MinPts
            % X(i,:) is NOISE
            isnoise(i) = true;
        else
            C = C+1;
            ExpandCluster(i,Neighbors,C);
        end
    end
end

function ExpandCluster(i,Neighbors,C)
    IDX(i) = C;
    k = 1;
    while true
        j = Neighbors(k);
        if ~visited(j)
            visited(j) = true;
            Neighbors2 = RegionQuery(j);
            if numel(Neighbors2)>=MinPts
                Neighbors = [Neighbors Neighbors2];   %#ok
            end
        end
        if IDX(j)==0
            IDX(j) = C;
        end
        k = k + 1;
        if k > numel(Neighbors)
            break;
        end
    end
end

function Neighbors = RegionQuery(i)
    Neighbors = find(D(i,:)<=epsilon);
end
end

我需要帮助将以下群集过程转换为多级过程,其中X包含具有所有属性的数据记录。我们假设X{:,1}是具有name属性的数据记录,因为名称包含在第一列中。

注意:对于帮助我的人,我会给予50分的赏金。

1 个答案:

答案 0 :(得分:3)

不要马上做所有事情!

你正在计算很多你不需要的东西,这会使事情变得缓慢。例如,一个好的DBSCAN不使用距离函数,而是使用索引。

对于名称,仅适用于唯一名称!你应该有许多完全相同的名字,但你最终会一次又一次地计算相同的距离。

首先,构建一组唯一名称​​ only 。在此执行相似性匹配(但我建议使用OpenRefine而不是Matlab!)。 确定要合并的名称后,为每个名称组构建新的数据矩阵。然后运行你想要的任何聚类。好的候选者可能是HDBSCAN和OPTICSXi(看看ELKI中可用的聚类算法,它可能有最广泛的选择)。也许只从一个普通的通用名称开始,以了解算法的参数。不要立刻对所有子集进行聚类。