我正在使用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)
不幸的是,两种方法得到的结果都不同。据我所知,第一个代码是正确的。
所以我不知道是否可以计算距离矩阵,然后以某种方式使用它作为聚类的参数。
聚类算法有多种,不同的算法给出不同的结果是正常的。您可以查看 scikit-learn 集群文档 以了解概述。
对于你的问题,这里有三个例子(我没有测试过),其中
distance_matrix
是你计算的距离矩阵:
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
# Create a linkage matrix from the distance matrix
linkage_matrix = linkage(distance_matrix, method='ward')
# Obtain cluster assignments
clusters = fcluster(linkage_matrix, t=threshold, criterion='distance')
from sklearn.cluster import KMeans
# Specify the number of clusters (n_clusters)
kmeans = KMeans(n_clusters=num_clusters, random_state=seed)
# Fit the model to the distance matrix
kmeans.fit(distance_matrix)
# Obtain cluster assignments
clusters = kmeans.labels_
from sklearn.cluster import DBSCAN
# Specify epsilon (eps) and minimum samples (min_samples)
dbscan = DBSCAN(eps=epsilon, min_samples=min_samples, metric='precomputed')
# Fit the model to the distance matrix
dbscan.fit(distance_matrix)
# Obtain cluster assignments (Note: -1 indicates noise/outliers)
clusters = dbscan.labels_