标签: hierarchical-clustering

测试聚类算法的最佳方法

测试聚类算法的最佳方法是什么?我正在使用带有停止标准的凝聚聚类算法。如何测试集群是否正确形成?

algorithm cluster-analysis hierarchical-clustering

5
推荐指数
1
解决办法
3473
查看次数

什么聚类算法适合在不知道聚类数的情况下的二维矩形?

我的问题是矩形中有矩形。想想一张地图,除了具有以下特征,关键点是:具有相似密度的矩形通常与其他矩形具有相似的尺寸和在 x 轴上的相似位置,但有时这些矩形之间的距离可能很大但通常很小。如果 x 轴上的位置或尺寸明显偏离,则它们不会相似。

  • 矩形不相交,较小的矩形完全在较大的矩形内。

  • 矩形通常具有相似的 x 位置和相似的尺寸(相似的高度和宽度),并且内部具有较小的矩形。矩形本身将被视为它自己的一个集群。

  • 有时这些集群与另一个集群的距离可能相当大(想想岛屿)。通常这些簇共享相同或相似的维度和相同或相似的子矩形密度。如果是这样,尽管两个集群之间存在距离,但它们应被视为同一集群的一部分。

  • 矩形越密集(内部的矩形越小),附近就有相似或相同的密集矩形共享相同或相似维度的可能性越大。

我附上了一张图表来更清楚地描述情况:

在此处输入图片说明

  • 红色边框表示这些组是异常值,不属于任何集群并被忽略。

  • 蓝色边框有许多簇(黑色边框包含黑色实心矩形)。由于上述标准(相似的宽度、相似的 X 位置、相似的密度),它们形成了一组相似的簇。由于标准(相似的宽度、相似的 X 位置、相似的密度),即使是右下角的集群仍然被视为该组的一部分。

  • 绿松石边框有许多簇(黑色边框包含黑色实心矩形)。但是,这些簇在维度、x 位置和密度上与蓝色边框中的簇不同。他们被认为是自己的一个群体。

到目前为止,我发现诸如 DBSCAN 之类的密度聚类似乎是完美的,因为它考虑了噪声(异常值),而且您不需要提前知道会有多少个聚类。

但是,您需要定义形成集群所需的最小点数和阈值距离。如果您不知道这两个并且它可以根据上述问题而变化,会发生什么?

另一个看似合理的解决方案是分层(凝聚)聚类(r-tree),但我担心我仍然需要知道树深度级别的截止点来确定它是否是一个集群。

cluster-analysis hierarchical-clustering r-tree dbscan

5
推荐指数
1
解决办法
1652
查看次数

使用Opencl有效地找到最小的大型数组

我正在开发opencl中的层次聚类算法.对于每个步骤,我在一个非常大的数组中找到最小值(大约10 ^ 8个条目),这样我就知道哪些元素必须组合成一个新的簇.最小值的识别必须进行9999次.使用我当前的内核,找到最小值(在所有迭代中累积)大约需要200秒.我是如何解决这个问题的方法是将数组分成2560个大小相同的片段(我的Radeon 7970上有2560个流处理器),并找到每个片段的最小值.我运行第二个内核,将这些最小值组合成全局最小值.

有没有更有效的方法来解决这个问题?最初的想法是通过使用OpenCL来加速HCA,但是识别最小值所花费的时间比CPU上的matlab HCA长得多.我究竟做错了什么?

__kernel void findMinValue(__global float * myArray, __global double * mins, __global int * elementsToWorkOn, __global int * arraysize){
int gid = get_global_id(0);
int minloc = 0;
float mymin = INFINITY;
int eltoWorkOn = *elementsToWorkOn;
int offset = gid*eltoWorkOn;
int target = offset + eltoWorkOn;

if (offset<*arraysize){
    //make sure the array size is not exceeded
    if (target > *arraysize){
        target = *arraysize;
    }

    //find minimum for the kernel
    for (int i = offset; i < …
Run Code Online (Sandbox Code Playgroud)

c++ hierarchical-clustering opencl

5
推荐指数
1
解决办法
2730
查看次数

如何使用相关性而不是 R 中的欧几里德距离创建用于聚类的距离矩阵?

目标

我想在我的数据集中对样本(行)进行层次聚类。

我知道的:

我已经看到使用欧几里得距离等创建距离矩阵的例子,通过dist()在 R 中使用函数。我还看到相关性用于创建变量(列)之间的不相似性(或相似性度量)。

我想做的事?

我想使用相关性为数据中的 ROWS 创建一个距离矩阵。所以,dist()我想使用每一行之间的相关性,而不是欧氏距离。但可用的methods不包括相关性。有什么办法可以做到吗?这可能不是一种常见的做法,但我认为它适合我的应用程序。

r hierarchical-clustering

5
推荐指数
1
解决办法
9582
查看次数

R中的分层聚类并行处理

是否有直接的方法在HPC集群中利用R中的并行处理来使我的计算更快地进行分层聚类算法?因为现在,处理器的平均利用率只有1,但我可以请求和使用更多.谢谢.

parallel-processing hpc r hierarchical-clustering

5
推荐指数
0
解决办法
605
查看次数

在凝聚聚类中指定最大距离(scikit learn)

使用聚类算法时,您始终必须指定关闭参数。

我目前正在使用 scikit learn 的凝聚聚类,我能看到的唯一关闭参数是集群的数量。

agg_clust = AgglomerativeClustering(n_clusters=N)
y_pred = agg_clust.fit_predict(matrix)
Run Code Online (Sandbox Code Playgroud)

但是我想找到一种算法,您可以在其中指定集群元素内的最大距离,而不是集群数量。因此,该算法将简单地聚集集群,直到达到最大距离。

有什么建议吗?

python algorithm hierarchical-clustering scikit-learn

5
推荐指数
1
解决办法
1330
查看次数

用于聚类(和分类)短句的 NLP 词袋/TF-IDF

我想通过它们的字符串键值 ( description)之一对 Javascript 对象进行聚类。我已经尝试了多种解决方案,并希望获得有关如何解决问题的一些指导。

我想要什么:假设我有一个对象数据库。可能有很多(可能有数千个,也可能有数万个)。我需要能够:

  1. 通过逻辑(有点)组中的相似性对对象进行聚类。语义匹配会很棒,但现在只要字符串相似就足够了。在它们被聚类后,我需要为它们中的categoryId每一个分配一些(代表它们所属的集群)。
  2. 每当将新对象添加到数据库时,我都需要将它们分类到现有组/提出新集群。

我还没有尝试解决问题 #2,但这是我尝试解决问题 #1 的方法。

  • 具有 Levenshtein 距离(单链接)的层次聚类- 这里的问题是性能,结果令人满意(我使用了hierarchical-clustering来自 的库npm)但在 150 左右我将不得不等待大约一分钟。不会为数千人工作。

  • TF-IDF,矢量化 + k-means - 性能很棒。它将轻松通过 5000 个对象。但结果肯定是关闭的(可能是我的实现中的一个错误)。我使用(natural库 fromnpm来计算 TF-IDF 和node-kmeans)。

  • Bag-of-Words + k-means - 我现在正在尝试实现这个,还没有任何运气。

对于#2,我想过使用朴素贝叶斯(但我还没有尝试过)。

有什么建议?如果对象只是聚集在一起就好了。如果我可以提取组聚类所依据的标签(如从 TF-IDF 中提取),那就更好了。

algorithm nlp hierarchical-clustering k-means tensorflow.js

5
推荐指数
1
解决办法
1233
查看次数

稀疏观测矩阵上的分层聚类

我正在尝试对大型稀疏观察矩阵执行分层聚类。该矩阵表示多个用户的电影评分。我的目标是根据他们的电影偏好对相似的用户进行聚类。但是,我需要一个树状图,而不是单一的部门。为了做到这一点,我尝试使用SciPy

R = dok_matrix((nrows, ncols), dtype=np.float32)

for user in ratings:
    for item in ratings[user]:
        R[item, user] = ratings[user][item]

Z = hierarchy.linkage(R.transpose().toarray(), method='ward')
Run Code Online (Sandbox Code Playgroud)

这适用于小数据集:

在此处输入图片说明

但是,我(显然)在扩展时遇到内存问题。如果有什么办法可以将稀疏矩阵提供给算法?

python hierarchical-clustering scipy

5
推荐指数
1
解决办法
2088
查看次数

在 Python 中聚类时间序列数据

我正在尝试使用不同的聚类技术在 Python 中对时间序列数据进行聚类。K-means 没有给出好的结果。以下图像是我使用凝聚聚类进行聚类后的图像。我也尝试过动态时间扭曲。这两个似乎给出了相似的结果。

理想情况下,我想要的是第二张图像中时间序列的两个不同集群。第一个图像是一个快速增加的集群。第二个没有增加,有点像稳定,第三个是减少趋势的集群。我想知道哪些时间序列既稳定又流行(这里流行,我的意思是高计数)。我尝试了层次聚类,但结果显示层次结构太多,我不确定如何选择层次结构级别。有人可以阐明如何将第二张图像中的时间序列分成两个不同的集群,一个计数低,另一个计数高?有可能做到吗?或者我应该只是在视觉上选择一个阈值将它们切成两半?

快速增长的集群:

在此处输入图片说明

具有稳定计数的集群:

在此处输入图片说明

具有下降趋势的集群:

在此处输入图片说明

这是非常非常模糊的,但这是我的层次聚类的结果。

在此处输入图片说明 我知道这个特定的图像根本没有用,但这对我来说也是一个死胡同。

一般而言,如果您想区分趋势,例如 YouTube 视频,如何仅选择一些用于“趋势”部分,而另一些则用于“本周趋势”部分?我知道“趋势”部分的视频显示出与第一张图像相似的特征。“本周热门”部分有一系列视频,这些视频具有很高的观看次数,但在数量方面非常稳定(即没有显示出快速增长)。我知道在 YouTube 的情况下,除了观看次数之外,还有许多其他因素需要考虑。对于第二张图片,我想要做的类似于“本周趋势”部分。我想挑选那些计数非常高的。在这种情况下如何拆分时间序列?

我知道 DTW 捕捉趋势。DTW 给出了与上图相同的结果。它已经确定了第二个图像中“稳定”的趋势。但它没有在这里捕获“计数”元素。我希望捕获趋势和计数,在这种情况下稳定和高计数。

上面的图像是基于计数聚类的时间序列。我是否错过了可以实现这一目标的任何其他聚类技术?即使只是计数,我如何根据需要进行不同的聚类?

任何想法将不胜感激。提前致谢!

cluster-analysis machine-learning hierarchical-clustering time-series

5
推荐指数
1
解决办法
8020
查看次数

如何使用PHP从距离矩阵中获取聚类?

我将距离矩阵作为二维数组,如下所示:

距离矩阵

所以,我需要在它的帮助下找到元素集群.我可以使用层次聚类来完成它,就像k-means一样.我在PHP K-Means中找到了这样的例子

如何将我的二维数组转换为此数组中列出的点数组?

$points = [
[80,55],[86,59],[19,85],[41,47],[57,58],
[76,22],[94,60],[13,93],[90,48],[52,54],
[62,46],[88,44],[85,24],[63,14],[51,40],
[75,31],[86,62],[81,95],[47,22],[43,95],
[71,19],[17,65],[69,21],[59,60],[59,12],
[15,22],[49,93],[56,35],[18,20],[39,59],
[50,15],[81,36],[67,62],[32,15],[75,65],
[10,47],[75,18],[13,45],[30,62],[95,79],
[64,11],[92,14],[94,49],[39,13],[60,68],
[62,10],[74,44],[37,42],[97,60],[47,73],
];
Run Code Online (Sandbox Code Playgroud)

php arrays hierarchical-clustering matrix k-means

5
推荐指数
1
解决办法
396
查看次数