Skip to content

Files

Latest commit

c4ff434 · Jan 29, 2018

History

History

Kmeans

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Feb 23, 2016
Feb 23, 2016
Mar 29, 2017
Jan 29, 2018
Feb 23, 2016
Feb 23, 2016

Kmeans聚类(Python实现)

目录说明:

  • data:存放数据集
  • result:对数据集进行聚类的结果,分别是k为3,4,5的结果
  • kmeans.py:K均值聚类的实现,包含两个,一个是Kmeans,一个是二分K-means
  • run.py:一个测试文件,用于测试./data/test.txt文件

参考博文:机器学习算法-K-means聚类

使用工具:python + numpy + matplotlib + pandas

scikit-learn链接:#k-means

K-means原理

  1. 创建k个点作为k个簇的起始质心(经常随机选择)。
  • 分别计算剩下的元素到k个簇中心的相异度(距离),将这些元素分别划归到相异度最低的簇。
  • 根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均值。
  • 将D中全部元素按照新的中心重新聚类。
  • 重复第4步,直到聚类结果不再变化。
  • 最后,输出聚类结果。

二分K-means原理

  1. 从输入的数据点集合中随机选择一个点作为一个聚类中心
  • 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
  • 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
  • 重复2和3直到k个聚类中心被选出来
  • 利用这k个初始的聚类中心来运行标准的k-means算法

测试用例

import pandas as pd
import numpy as np
from kmeans import KMeansClassifier
import matplotlib.pyplot as plt

#加载数据集,DataFrame格式,最后将返回为一个matrix格式
def loadDataset(infile):
    df = pd.read_csv(infile, sep='\t', header=0, dtype=str, na_filter=False)
    return np.array(df).astype(np.float)

if __name__=="__main__":
    data_X = loadDataset(r"data/testSet.txt")
    k = 3
    clf = KMeansClassifier(k)
    clf.fit(data_X)
    cents = clf._centroids
    labels = clf._labels
    sse = clf._sse
    colors = ['b','g','r','k','c','m','y','#e24fff','#524C90','#845868']
    for i in range(k):
        index = np.nonzero(labels==i)[0]
        x0 = data_X[index, 0]
        x1 = data_X[index, 1]
        y_i = i
        for j in range(len(x0)):
            plt.text(x0[j], x1[j], str(y_i), color=colors[i], \
                        fontdict={'weight': 'bold', 'size': 6})
        plt.scatter(cents[i,0],cents[i,1],marker='x',color=colors[i],\
                    linewidths=7)
    
    plt.title("SSE={:.2f}".format(sse))
    plt.axis([-7,7,-7,7])
    outname = "./result/k_clusters" + str(k) + ".png"
    plt.savefig(outname)
    plt.show()

结果展示

K-means算法结果如下图所示:

  • 当k=3时的结果

  • 当k=4时的结果

  • 当k=5时的结果