我正在尝试使用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的长度来控制簇的数量,因为我看不到任何将簇的数量输入程序的选项,但这似乎无关。有人能指导我我犯的错误吗?如何选择群集数?
答案 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]]