【发布时间】:2018-01-13 06:16:36
【问题描述】:
import sys
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.svm import SVC
filename = sys.argv[1]
datafile = sio.loadmat(filename)
data = datafile['bow']
sizedata=[len(data), len(data[0])]
gap=[]
SD=[]
for knum in xrange(10,20):
print knum
#Clustering original Data
kmeanspp = KMeans(n_clusters=knum,init = 'k-means++',max_iter = 100,n_jobs = 1)
kmeanspp.fit(data)
dispersion = kmeanspp.inertia_
#Clustering Reference Data
nrefs = 10
refDisp = np.zeros(nrefs)
for nref in xrange(nrefs):
refdata = np.random.random_sample((sizedata[0],sizedata[1]))
refkmeans = KMeans(n_clusters=knum,init='k-means++',max_iter=100,n_jobs=1)
refkmeans.fit(refdata)
refdisp = refkmeans.inertia_
refDisp[nref]=np.log(refdisp)
mean_log_refdisp = np.mean(refDisp)
gap.append(mean_log_refdisp-np.log(dispersion))
#Calculating standard deviaiton
sd = (sum([(r-m)**2 for r,m in zip(refDisp,[mean_log_refdisp]*nrefs)])/nrefs)**0.5
SD.append(sd)
SD = [sd*((1+(1/nrefs))**0.5) for sd in SD]
#determining optimal k
opt_k = None
diff = []
for i in xrange(len(gap)-1):
diff = (SD[i+1]-(gap[i+1]-gap[i]))
if diff>0:
opt_k = i+10
break
print diff
plt.plot(np.linspace(10,19,10,True),gap)
plt.show()
这里我正在尝试实施差距统计方法来确定最佳聚类数。但问题是每次我运行代码时,我都会得到不同的 k 值。 问题的解决方案是什么? 相同数据的最优 k 值如何不同?
我已将数据预先存储在 .mat 文件中,并通过终端将其作为参数传递
我正在寻找 k 的最小值,其中 Gap(k)>= Gap(k+1)-s(k+1) 其中 s(k+1) = sd(k+1)*square_root(1+(1/B)) 其中 sd 是参考分布的标准偏差,B 是蒙特卡洛样本的副本数
否则,我正在寻找 k 的值
s(k+1)-Gap(k+1)+Gap(k)>=0
【问题讨论】:
-
Gap Statistic 方法无法确定最佳聚类数。这是统计数据。号码是固定的,只是未知。这个方法是做什么的,它估计了这个数字。如果算法使用随机化,您可以预期值会有所不同。尝试在开始时设置种子 (
np.random.seed),并查看运行之间的值是否发生变化。这并不是说您应该始终播种相同的值,而是要显示随机性的来源。 -
种子是为了什么? K是什么意思?
-
np.random.random_sample -
是的,我用它来获取我的参考分布
-
你会,但你不能指望每次运行的结果都完全相同,如果每次采集的蒙特卡洛样本都不相同。为了重现结果,您需要将之前做出的随机选择再次做出。如果您为伪随机生成器提供相同的初始种子,那么它将产生的随机序列也将相同(每次运行程序)。
标签: python python-2.7 scikit-learn k-means