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

pw136qt2  于 5个月前  发布在  Python
关注(0)|答案(2)|浏览(100)

我在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)


不幸的是,我得到的结果是不同的两种方法。据我所知,第一个代码是正确的。
所以我不知道我是否可以计算距离矩阵,然后以某种方式使用它作为聚类的参数。

jfewjypa

jfewjypa1#

pdist返回一个numpy数组,即condensed distance matrix。您可以将这种形式的距离矩阵直接传递给linkage。不要将其转换为Pandas DataFrame。
因此,您的代码可以像这样简单:

dist_matrix = pdist(user_df.values, metric='hamming')
clusters = linkage(dist_matrix, method=metodo)

字符串

jv2fixgn

jv2fixgn2#

有多种聚类算法,不同的算法给予不同的结果是正常的。您可以检查scikit-learn clustering documentation有一个概述。
至于你的问题,这里有三个例子(我没有测试过),其中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-Means聚类(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_


编辑:
根据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.

相关问题