【问题标题】:Error complex data not supported in spectral clustering谱聚类不支持错误复杂数据
【发布时间】:2020-08-02 17:09:01
【问题描述】:

我正在对 1000*1000 的相似度矩阵进行谱聚类。我的相似度矩阵如下:

matrix([[0.000, 0.031, 0.030, ..., 0.850, 0.867, 0.838],
        [0.031, 0.000, 0.005, ..., 0.780, 0.805, 0.781],
        [0.030, 0.005, 0.000, ..., 0.803, 0.823, 0.795],
        ...,
        [0.850, 0.780, 0.803, ..., 0.000, 0.024, 0.008],
        [0.867, 0.805, 0.823, ..., 0.024, 0.000, 0.014],
        [0.838, 0.781, 0.795, ..., 0.008, 0.014, 0.000]])

我创建了邻接矩阵和度矩阵以及拉普拉斯矩阵,然后计算了特征值和特征向量,并使用第二小的特征值来确定应该将哪个节点放在哪个类别中。:

e, v = np.linalg.eig(L)
fig = plt.figure(figsize=[30, 6])
ax1 = plt.subplot(221)
plt.plot(e)
ax1.title.set_text('eigenvalues')
i = np.where(e < 300)[0]
ax2 = plt.subplot(222)
plt.plot(v[:, i[0]])
ax3 = plt.subplot(223)
plt.plot(v[:, i[1]])
ax3.title.set_text('second eigenvector with eigenvalue close to 0')

enter image description here

但是当我想按如下方式运行 kmeans 来分隔点时,我遇到了错误:

U = np.array(v[:, i[1]])
km = KMeans(init='k-means++', n_clusters=3)
km.fit(U)
km.labels_

错误:

> ValueError: 不支持复杂数据 [[-0.04866435+0.j] [-0.04909432+0.j] [-0.04840705+0.j] [-0.04859193+0.j] [-0.0514795 +0.j],...]

你能帮我知道为什么会出现这个错误吗?我搜索了很多,但没有结果。

【问题讨论】:

    标签: python cluster-analysis valueerror complex-data-types


    【解决方案1】:

    有一个简单的解决办法,插入两行代码如下:

    e, v = np.linalg.eig(L)
    e = e.real
    v = v.real
    

    这将允许将数据用于 KMeans。

    【讨论】:

      【解决方案2】:

      阅读与np.linalg.eig 返回的内容相关的文档:

      特征值,每个都根据其多重性重复。特征值不一定是有序的。结果数组将是复数类型,除非虚部为零,在这种情况下它将被强制转换为实数类型。当 a 为实数时,得到的特征值将是实数(虚部为 0)或以共轭对形式出现

      您计算的特征值是复数,您不能将复数与 KMeans 一起使用。

      【讨论】:

      • 感谢您的回答。但是我该怎么办?这是否意味着,我不能通过谱聚类对数据进行聚类?
      • 回答您的问题并不容易,因为我不知道您要解决的问题。你能假设实部和虚部是两个不同的维度吗?或者,您可以将复数 x+jy 转换为由模数和相位组成的二维值。也许最好的解决方案是在文献中找到可以帮助你的东西。
      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 2013-03-07
      • 2021-05-22
      • 2013-03-19
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多