如何使用具有设定数目的集群的聚类使用kmedoids

时间:2019-07-10 21:04:16

标签: cluster-analysis

我正在尝试使用k型特征对我正在使用的某些轨迹数据进行聚类(沿着飞机轨迹的多个点)。我想将这些群集到一定数量的群集中(因为我知道应该有多少种类型的路径)。

我发现pyclustering包内部实现了k-medoids,并且正在尝试使用它。从技术上讲,我可以将其群集,但是我不知道如何控制群集的数量。我本来以为它直接与所谓的initial_medoids内部的元素数量有关,但是实验表明它比这更复杂。我的相关代码段如下。

请注意,D包含一个列表列表。每个列表对应一个轨迹。

def hausdorff( u, v):
    d = max(directed_hausdorff(u, v)[0], directed_hausdorff(v, u)[0])
    return d

traj_count = len(traj_lst)
D = np.zeros((traj_count, traj_count))

for i in range(traj_count):
    for j in range(i + 1, traj_count):
        distance = hausdorff(traj_lst[i], traj_lst[j])
        D[i, j] = distance
        D[j, i] = distance


from pyclustering.cluster.kmedoids import kmedoids
initial_medoids = [104, 345, 123, 1]

kmedoids_instance = kmedoids(traj_lst, initial_medoids)
kmedoids_instance.process()
cluster_lst = kmedoids_instance.get_clusters()[0]

num_clusters = len(np.unique(cluster_lst))
print('There were %i clusters found' %num_clusters)

我总共有1900条轨迹,上面的代码找到了1424个簇。我曾期望可以通过initial_medoids的长度来控制簇的数量,因为我看不到任何将簇的数量输入程序的选项,但这似乎无关。有人能指导我我犯的错误吗?如何选择群集数?

2 个答案:

答案 0 :(得分:0)

如果需要获取集群,则需要致电get_clusters()

cluster_lst = kmedoids_instance.get_clusters()

不是get_clusters()[0](在这种情况下,它是第一个集群中的对象索引列表):

cluster_lst = kmedoids_instance.get_clusters()[0]

那是正确的,您可以通过initial_medoids控制群集的数量。

答案 1 :(得分:0)

确实可以控制群集的数量,该数量与initial_medoids长度相对应。

文档尚不清楚。 get__clusters函数“从输入数据中返回由索引表示的已分配簇的质体列表”。因此,该功能不会返回群集标签。它返回原始(输入)数据中的行的索引

请检查示例中cluster_lst的形状,使用.get_clusters()而不是annoviko建议的.get_clusters()[0]。在您的情况下,此形状应为(4,)。因此,您有一个包含四个元素(簇)的列表,每个元素包含索引或原始数据中的行。

例如,要从第一个群集中获取数据,请使用:

kmedoids_instance = kmedoids(traj_lst, initial_medoids)
kmedoids_instance.process()
cluster_lst = kmedoids_instance.get_clusters()
traj_lst_first_cluster = traj_lst[cluster_lst[0]]