【问题标题】:warning: uncondensed distance matrix in python警告:python 中未压缩的距离矩阵
【发布时间】:2020-07-04 03:32:00
【问题描述】:

我尝试制作与凝聚层次聚类相关的树状图,我需要距离矩阵。我开始了:

import numpy as np 
import pandas as pd
from scipy import ndimage 
from scipy.cluster import hierarchy 
from scipy.spatial import distance_matrix 
from matplotlib import pyplot as plt 
from sklearn import manifold, datasets 
from sklearn.cluster import AgglomerativeClustering 
from sklearn.datasets.samples_generator import make_blobs 
%matplotlib inline
X1, y1 = make_blobs(n_samples=50, centers=[[4,4], [-2, -1], [1, 1], [10,4]], cluster_std=0.9)
plt.scatter(X1[:, 0], X1[:, 1], marker='o') 
agglom = AgglomerativeClustering(n_clusters = 4, linkage = 'average')
agglom.fit(X1,y1)
# Create a figure of size 6 inches by 4 inches.
plt.figure(figsize=(6,4))

# These two lines of code are used to scale the data points down,
# Or else the data points will be scattered very far apart.

# Create a minimum and maximum range of X1.
x_min, x_max = np.min(X1, axis=0), np.max(X1, axis=0)

# Get the average distance for X1.
X1 = (X1 - x_min) / (x_max - x_min)

# This loop displays all of the datapoints.
for i in range(X1.shape[0]):
    # Replace the data points with their respective cluster value 
    # (ex. 0) and is color coded with a colormap (plt.cm.spectral)
    plt.text(X1[i, 0], X1[i, 1], str(y1[i]),
             color=plt.cm.nipy_spectral(agglom.labels_[i] / 10.),
             fontdict={'weight': 'bold', 'size': 9})

# Remove the x ticks, y ticks, x and y axis
plt.xticks([])
plt.yticks([])
#plt.axis('off')



# Display the plot of the original data before clustering
plt.scatter(X1[:, 0], X1[:, 1], marker='.')
# Display the plot
plt.show()
dist_matrix = distance_matrix(X1,X1) 
print(dist_matrix)

当我写这个时我得到一个错误:

Z = hierarchy.linkage(dist_matrix, 'complete')

/home/jupyterlab/conda/envs/python/lib/python3.6/site-packages/ipykernel_launcher.py:1: ClusterWarning: scipy.cluster: 对称非负空心观察矩阵看起来很可疑未压缩的距离矩阵 """启动 IPython 内核的入口点。

首先,这是什么意思,我该如何解决?谢谢

【问题讨论】:

  • 看起来像是警告,而不是错误
  • 是的,仍然是什么意思?还没找到合适的答案

标签: python machine-learning scikit-learn hierarchical-clustering


【解决方案1】:

这意味着X1与X1.T太接近了

agglom.fit(X1,y1)

您可以在标题中添加以下代码以忽略它!

from scipy.cluster.hierarchy import ClusterWarning
from warnings import simplefilter
simplefilter("ignore", ClusterWarning)

【讨论】:

    【解决方案2】:

    scipy.cluster.heirarchy.linkage 需要 压缩 距离矩阵,而不是 方形/非压缩 距离矩阵。您计算了一个方形距离矩阵,需要将其转换为 压缩 形式。我建议使用scipy.spatial.distance.squareform。以下片段在没有警告的情况下重现了您的功能(为了简洁起见,我删除了绘图)。

    from sklearn.cluster import AgglomerativeClustering 
    from sklearn.datasets import make_blobs
    from scipy.spatial import distance_matrix
    from scipy.cluster import hierarchy
    from scipy.spatial.distance import squareform
    
    X1, y1 = make_blobs(n_samples=50, centers=[[4,4],
                                               [-2, -1],
                                               [1, 1],
                                               [10,4]], cluster_std=0.9)
    
    agglom = AgglomerativeClustering(n_clusters = 4, linkage = 'average')
    agglom.fit(X1,y1)
    
    dist_matrix = distance_matrix(X1,X1)
    print(dist_matrix.shape)
    condensed_dist_matrix = squareform(dist_matrix)
    print(condensed_dist_matrix.shape)
    Z = hierarchy.linkage(condensed_dist_matrix, 'complete')
    

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 1970-01-01
      • 2016-08-15
      • 2012-10-16
      • 2013-08-28
      • 2017-11-06
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      相关资源
      最近更新 更多