光谱聚类中不支持错误复杂数据



我在一个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')

在此处输入图像描述

但当我想运行下面的kmean来分离点时,我有一个错误:

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],…]

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

有一个简单的解决方案,只需插入以下两行代码:

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

这将允许KMean使用数据。

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

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

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

最新更新