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

标签 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} 是具有名称属性的数据记录,因为名称包含在第一列中。

注意:我将给予帮助我的人50分的赏金。

最佳答案

不要一次做所有事情!

您正在计算很多您从不需要的东西,这让事情变慢了。比如好的DBSCAN不是用距离函数,而是用索引。

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

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

关于Matlab:如何将聚类代码自定义为多级聚类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39361199/

相关文章:

python - 决定包含分类变量和数值变量的数据集的聚类算法

reactjs - 如何将 React 应用程序部署到多个环境而无需多次构建?

docker - Docker:多阶段构建会生成多个镜像

Matlab:使用unicode字符从字符串中删除字符

matlab - 通过欧氏距离删除矩阵的元素

javascript - 马尔可夫聚类算法

matlab - 单应性投影变换

python - Python 3.x 中的 "bwlabeln (with 18 and 26-connected neighborhood)"相当于什么?

python - 如何使用距离矩阵和 kmedoids 将新观测值分配给聚类?