在 Python 中使用 scipy 和距离矩阵对数据进行聚类

问题描述 投票:0回答:1

我正在使用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)

不幸的是,两种方法得到的结果都不同。据我所知,第一个代码是正确的。

所以我不知道是否可以计算距离矩阵,然后以某种方式使用它作为聚类的参数。

python dataframe matrix scipy hierarchical-clustering
1个回答
0
投票

聚类算法有多种,不同的算法给出不同的结果是正常的。您可以查看 scikit-learn 集群文档 以了解概述。

对于你的问题,这里有三个例子(我没有测试过),其中

distance_matrix
是你计算的距离矩阵:

凝聚层次聚类(SciPy):

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')

K 均值聚类(scikit-learn):

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_

DBSCAN(scikit-learn):

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_
© www.soinside.com 2019 - 2024. All rights reserved.