首页 > 解决方案 > pyclustering clarans.get_clusters() 返回空列表

问题描述

我正在尝试使用pyclustering模块进行 CLARANS 聚类,但是对于我尝试过的所有数据clarans(data, number_clusters, numlocal, maxneighbor) ,无论参数值是什么,所有方法都返回 [] (一个空列表)。我做了一个随机数据来测试方法,但答案是一样的,唯一有效的数据是 iris 数据 datasets.load_iris() 形式的 sklearn模块。难道我做错了什么?

这是测试数据:

import pandas as pd
import numpy as np
import seaborn as sns
from pyclustering.cluster.clarans import clarans

x1 = np.random.normal(10, 5, 100)
x2 = np.random.normal(30, 5, 100)
x = np.concatenate((x1, x2), axis=0)
y1 = np.random.normal(50, 5, 100)
y2 = np.random.normal(60, 5, 100)
y = np.concatenate((y1, y2), axis=0)
Gr = np.array(['G1']*100 + ['G2']*100)

df = pd.DataFrame(x, columns=['X'])
df['Y'] = y
df['Gr'] = Gr

这是我运行聚类技术时(我将 df 转换为 2D 列表):

datalist = np.zeros((200,2))
for i in df.index:
    datalist[i][0] = round(float(df['X'][i]), 2)
    datalist[i][1] = round(float(df['Y'][i]), 2)

cluster_clarans = clarans(datalist, 2, 6, 4)

cluster_clarans.get_clusters()

答案是:

[]

标签: pythoncluster-analysis

解决方案


process()在打印出簇之前,您忘记使用函数执行处理。

这个说法

cluster_clarans = clarans(datalist, 2, 6, 4)

初始化类对象。然后,您需要调用 process 方法。

cluster_clarans.process()

现在,当您打印出集群时,您将获得 2 个列表,每个列表都包含每个集群中数据点的索引。get_clusters 请参阅此处的官方文档。

print(cluster_clarans.get_clusters())

这是下面的完整代码。请注意,我已更改以下随机数据的大小:

import pandas as pd
import numpy as np
import seaborn as sns
from pyclustering.cluster.clarans import clarans

x1 = np.random.normal(30, 10, 20)
x2 = np.random.normal(60, 5, 20)
x = np.concatenate((x1, x2), axis=0)
y1 = np.random.normal(20, 5, 20)
y2 = np.random.normal(40, 15, 20)
y = np.concatenate((y1, y2), axis=0)
Gr = np.array(['G1']*20 + ['G2']*20)

df = pd.DataFrame(x, columns=['X'])
df['Y'] = y
df['Gr'] = Gr

datalist = np.zeros((40,2))
for i in df.index:
    datalist[i][0] = round(float(df['X'][i]), 2)
    datalist[i][1] = round(float(df['Y'][i]), 2)

# Initialize the cluster object
cluster_clarans = clarans(datalist, 2, 6, 4)

# Process the data
cluster_clarans.process()

# Get the points in each clusters
print(cluster_clarans.get_clusters())
# Output: [[9,14,15,16,20,21,27,28,29,30,31,32,33,34,35,37,38,39],
           [0,1,2,3,4,5,6,7,8,10,11,12,13,17,18,19,22,23,24,25,36]]

您可以在此处阅读有关该process()功能的更多信息。


推荐阅读