K-均值聚类 简单测试

背景

书上(中文版)第44页,在讲解完K-均值聚类算法后,留了个练习:

请尝试用不同对k值进行聚类,看看对结果会有怎样对影响

练习

然后写了个测试方法(也就是循环执行kcluster,然后看看执行耗时与空分组率)

import time
def test_kcluster(ks):
    blognames, words, data = readfile('blogdata.txt')

    print("Test Result:")
    print("k\tcost_time\t\tempty_rate")
    for k in ks:
        s_time = time.time()
        result = kcluster(data, k=k)
        e_time = time.time()
        costTime = e_time - s_time

        empty_count = 0
        for clust in result:
            if not clust:
                empty_count += 1
        empty_rate = empty_count / float(len(result))
        print("{}\t{}\t\t{}".format(k, costTime, empty_rate))

博客数量为 99 个,选取了多个 k 值进行测试

len(blognames)
Out[28]: 99

ks = [1, 3, 5, 8, 10, 15, 20, 25, 30, 35, 40, 50, 80, 100, 150, 200]

由于是随机获取k个中心点,所以执行了多次:

Test Result:
k       cost_time               empty_rate
1       0.21799993515           0.0
3       1.73300004005           0.0
5       2.27200007439           0.0
8       3.94899988174           0.0
10      12.1600000858           0.0
15      8.21499991417           0.0666666666667
20      11.1959998608           0.2
25      13.8929998875           0.24
30      17.1029999256           0.3
35      13.2590000629           0.171428571429
40      12.6540000439           0.25
50      24.1440000534           0.44
80      32.5599999428           0.5375
100     61.8659999371           0.61
150     40.7860000134           0.66
200     74.0439999104           0.71
Test Result:
k       cost_time               empty_rate
1       0.210000038147          0.0
3       1.38900017738           0.0
5       2.34699988365           0.0
8       5.3869998455            0.0
10      5.02800011635           0.0
15      5.42100000381           0.0
20      9.00900006294           0.2
25      8.82899999619           0.2
30      18.8480000496           0.366666666667
35      12.3329999447           0.285714285714
40      10.8040001392           0.3
50      17.4690001011           0.26
80      35.0460000038           0.55
100     33.9200000763           0.54
150     39.001999855            0.726666666667
200     52.1150000095           0.765

初步结论

  1. K越大,耗时越长
  2. K越大,聚类的分布也越分散(但达到某个阈值后,没有多少变化)
  3. K增大到某个阈值,会出现空分组

后记

  1. 可加上分布情况
  2. 将结果输出到CSV,然后通过pandas进行分析,用matplotlib画图

你可能感兴趣的:(读书笔记,-----《集体智慧编程》)