聚类分析(二)K-均值聚类(KMeans算法)

基本思想

这种聚类方法的思想是把每个样品聚集到其最近均值的类中,在它的最简单说明中,这个过程由下列三步所组成:

(1)把样品粗略分成K个初始类。

(2)进行修改,逐个分派样品到其最近均值的类中(通常用标准化数据或非标准化数据计算欧式距离)。重新计算接受新样品的类和失去样品的类的形心(均值)。

(3)重复第二步,直到各类无元素进出。

KMeans算法流程

KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

算法过程

(1)从N个数据文档随机选取K个数据文档作为质心。

(2)对剩余的每个数据文档测量其到每个质心的距离,并把它归到最近的质心的类。

(3)重新计算已经得到的各个类的质心。

(4)迭代二、三步直至新的质心与原质心相等或小于指定阈值,算法结束。

k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机地选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,j的值没有发生变化,则说明算法已经收敛。

b76d98c6d7c4123885fb7c4da7c73b5d20a.jpg

下面将使用Scikit-Learn的KMeans来进行聚类:

KMeans聚类首先需要确定聚类中心的数量,所以在进行聚类之前,需要对自己的数据的含义和属性有一定的了解。如果是二维的数据,可以先画一个散点图看一下样本的分布情况,如:

聚类分析(二)K-均值聚类(KMeans算法)_第1张图片

从图像中的数据分布可以看出,样本点大致分为四簇。所以设置初始聚类中心 k=4,如果对数据不是很了解,可以先设置一个k,sklearn.cluster中的KMeans,n_clusters的默认值为8,进行聚类之后,再根据结果的聚类效果来调整聚类中心的数量。

先导入需要的程序包

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

然后进行数据的处理,将数据处理成符合模型要求的数组

def file2matrix(file_name, separator):
    # 数据的预处理
    data_list = []
    with open(file_name) as file:
        for i in file.readlines():
            c = i.strip().split(separator)
            for j in range(len(c)):
                c[j] = eval(c[j])
            data_list.append(c)
    return np.array(data_list)

画出散点图和聚类中心

def draw_pic(data_list):
    # 画出散点图
    for x in range(len(data_list)):
        plt.scatter(data_list[x][0], data_list[x][1], s=30, c='b', marker='.')


def draw_cluster_centers(centers_mat):
    # 画出聚类中心
    for k in range(len(centers_mat)):
        plt.scatter(centers_mat[k][0], centers_mat[k][1], s=60, c='r', marker='D')

执行程序,调用相应的函数,进行KMeans聚类,kmeans.cluster_centers_方法返回的是聚类中心的数据点

if __name__ == '__main__':
    data_Set = file2matrix('testSet.txt', '\t')
    draw_pic(data_Set)
    k = 4  # 确定聚类中心的数目
    # 执行KMeans算法
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(np.mat(data_Set))
    draw_cluster_centers(kmeans.cluster_centers_)
    plt.show()

最终得到结果

聚类分析(二)K-均值聚类(KMeans算法)_第2张图片

优点:(1)KMeans算法擅长处理球状分布的数据

            (2)简单,容易掌握

缺点:(1)k的取值需要根据经验,没有可借鉴性

            (2)对异常偏离的数据非常敏感

参考:

1.机器学习算法原理与编程实践/郑捷著. 北京:电子工业出版社,2015.11

2.多元统计分析/何晓群编著.  -4版. --北京:中国人民大学出版社,2015.3

如果有需要测试数据集的,可以在下方评论处留下邮箱,欢迎关注。

聚类分析(二)K-均值聚类(KMeans算法)_第3张图片

转载于:https://my.oschina.net/u/3888421/blog/2205979

你可能感兴趣的:(数据结构与算法,人工智能,python)