在 Kmeans 中估计 K 的指标
Metrics to estimate K in Kmeans
我正在尝试使用 Elbow 和 BIC 估计 Kmeans 中的 K 数 methods.X 是数据点的多维数组(100000 个数据点 X 100 个特征)
这是我用于 Elbow 的代码:
Ks = [40,50,60,70,80,90,100,110,120]
ds = []
for K in Ks:
cls = MiniBatchKMeans(K, batch_size =1000, random_state = 101)
for i in xrange(0, len(X), 1000):
chunk = newvec[i:i + 1000]
cls.partial_fit(chunk)
ds.append(cls.inertia_)
plt.plot(Ks, ds)
plt.xlabel('Value of K')
plt.ylabel('Distortion')
plt.show()
我用于 BIC 的代码来自这里by Prabhath Nanisetty
以下是我使用这些方法中的每一种方法得到的图:
正确的K值是多少?根据这些结果,这些指标是否适合用于我的数据集?
谢谢。
我认为您的数据集的维度太多,并且存在遭受 the curse of dimensionality 影响的风险。
但是要回答你的问题,至少从肘法来看,K = 90 似乎是按肘法计算的。要使用 BIC 方法,您需要查看最高值(根据该特定实现;某些实现反转符号)。这让它变得有点模糊,但似乎在 K = 60 之后,它们的表现几乎一样好。
你也可以看看this article on the same topic。它介绍了另一种估计 K 的方法,即 Gap 方法。我会说 运行 另一个指标来打破平局,然后 select 3 个指标中的 2 个或更多指标返回的最佳 K。
我正在尝试使用 Elbow 和 BIC 估计 Kmeans 中的 K 数 methods.X 是数据点的多维数组(100000 个数据点 X 100 个特征)
这是我用于 Elbow 的代码:
Ks = [40,50,60,70,80,90,100,110,120]
ds = []
for K in Ks:
cls = MiniBatchKMeans(K, batch_size =1000, random_state = 101)
for i in xrange(0, len(X), 1000):
chunk = newvec[i:i + 1000]
cls.partial_fit(chunk)
ds.append(cls.inertia_)
plt.plot(Ks, ds)
plt.xlabel('Value of K')
plt.ylabel('Distortion')
plt.show()
我用于 BIC 的代码来自这里by Prabhath Nanisetty
以下是我使用这些方法中的每一种方法得到的图:
正确的K值是多少?根据这些结果,这些指标是否适合用于我的数据集? 谢谢。
我认为您的数据集的维度太多,并且存在遭受 the curse of dimensionality 影响的风险。
但是要回答你的问题,至少从肘法来看,K = 90 似乎是按肘法计算的。要使用 BIC 方法,您需要查看最高值(根据该特定实现;某些实现反转符号)。这让它变得有点模糊,但似乎在 K = 60 之后,它们的表现几乎一样好。
你也可以看看this article on the same topic。它介绍了另一种估计 K 的方法,即 Gap 方法。我会说 运行 另一个指标来打破平局,然后 select 3 个指标中的 2 个或更多指标返回的最佳 K。