我在Python中工作。我使用一个二进制数组,其中我有一系列0和1的值,用于不同的用户在不同的时间。
我可以直接从该框架执行层次聚类,
metodo='average'
clusters = linkage(user_df, method=metodo,metric='hamming')
# Create a dendrogram
plt.figure(figsize=(10, 7))
dendrogram(clusters, labels=user_df.index, leaf_rotation=90)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('User')
plt.ylabel('Distance')
# Save the figure
plt.savefig(f'dendrogram_{metodo}_entero.png')
plt.show()
字符串
然而,我想把距离矩阵的计算和聚类分开,为此,我已经计算了距离矩阵,并将其作为参数发送给聚类。
dist_matrix = pdist(user_df.values, metric='hamming')
# Convert the distance matrix to a square form
dist_matrix_square = squareform(dist_matrix)
# Create a DataFrame from the distance matrix
dist_df = pd.DataFrame(dist_matrix_square, index=user_df.index, columns=user_df.index)
clusters = linkage(dist_df, method=metodo)
型
不幸的是,我得到的结果是不同的两种方法。据我所知,第一个代码是正确的。
所以我不知道我是否可以计算距离矩阵,然后以某种方式使用它作为聚类的参数。
2条答案
按热度按时间jfewjypa1#
pdist
返回一个numpy数组,即condensed distance matrix。您可以将这种形式的距离矩阵直接传递给linkage
。不要将其转换为Pandas DataFrame。因此,您的代码可以像这样简单:
字符串
jv2fixgn2#
有多种聚类算法,不同的算法给予不同的结果是正常的。您可以检查scikit-learn clustering documentation有一个概述。
至于你的问题,这里有三个例子(我没有测试过),其中
distance_matrix
是你计算的距离矩阵:凝聚层次聚类(SciPy):
字符串
K-Means聚类(scikit-learn):
型
DBSCAN(scikit-learn):
型
编辑:
根据scipy.cluster.hierarchy.linkage documentation,数组可以是:
A condensed distance matrix. A condensed distance matrix is a flat array containing the upper triangular of the distance matrix. This is the form that pdist returns.
个Alternatively, a collection of observation vectors in dimensions may be passed as an m by n array.
个