【问题标题】:Gap Statistic Method差距统计法
【发布时间】: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


【解决方案1】:

模拟的几个问题:

1- sd = (sum([(r-m)**2 for r,m in zip(refDisp,[mean_log_refdisp]*nrefs)])/nrefs)**0.5

你为什么将 zip 的第二个分量乘以根据原始论文不需要的 nrefs。

2-

 if diff>0:
        opt_k = i+10
        break

if diff>0 你想要 diff>=0 因为相等可能发生 关于为什么你每次得到不同数量的集群,正如人们所说的那样,这是蒙特卡罗模拟,所以可能存在随机性,这也取决于你的集群和你的数据集。我建议您针对 Silhouette 和 Elbow 测试您的算法,以更好地了解集群的数量。

【讨论】:

    【解决方案2】:

    一种选择是多次运行您的函数,然后平均间隙统计数据和 s 值,并找到平均值 s(k+1)-Gap(k+1)+Gap(k) 为的最小 k大于

    这将花费更长的时间,但会提供更可靠的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-07
      • 2016-07-24
      • 2020-02-19
      • 1970-01-01
      • 2013-06-10
      • 2019-05-13
      • 2015-06-17
      • 2017-09-07
      相关资源
      最近更新 更多