机器学习08:K-Means聚类算法

栏目: 编程工具 · 发布时间: 6年前

内容简介:前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值。因此,回归算法或分类算法被称之为监督学习(Supervised Learning)。本篇文章将接触有别于监督学习的另一类机器学习算法——无监督学习(Unsupervised Learning)。无监督学习是寻找缺乏标准答案的输入数据的规律。其中聚类算法是无监督学习主要的分支。今天介绍的K-Means算法就是聚类算法的其中一种比较常见的算法。K-Means算法的K指的是

前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值。因此,回归算法或分类算法被称之为监督学习(Supervised Learning)。

本篇文章将接触有别于监督学习的另一类机器学习算法——无监督学习(Unsupervised Learning)。无监督学习是寻找缺乏标准答案的输入数据的规律。其中聚类算法是无监督学习主要的分支。今天介绍的K-Means算法就是聚类算法的其中一种比较常见的算法。

K-Means算法原理

K-Means算法的K指的是输出类别的数目。该算法是一个迭代过程,每一次迭代分为两个步骤,第一步为分类成簇,第二步为移动簇中心,直到簇中心不变。

分类成簇的判定方法是将与簇中心的欧几里得距离最小的数据点归为对应的一类。而簇中心的计算方式是该类所有数据点的平均值,这就是均值‘ Mean ’一词的由来。

下图演示了K-Means算法每一次迭代数据点的分类情况: 机器学习08:K-Means聚类算法

可以从上图看到,K-Means经过4次迭代就完成了聚类过程。每次迭代,圆圈表示的数据点都被分类到离它最近的“x”表示的中心点,然后对中心点进行了更新。

K-Means算法实现

下面的代码展示了K-Means算法的原理,上面的图片也是通过这块代码生成的。依旧通过注释方式讲代码,请看:

import numpy as np  
import matplotlib.pyplot as plt

# Input data set
X = np.array([  
    [-4, -3.5], [-3.5, -5], [-2.7, -4.5],
    [-2, -4.5], [-2.9, -2.9], [-0.4, -4.5],
    [-1.4, -2.5], [-1.6, -2], [-1.5, -1.3],
    [-0.5, -2.1], [-0.6, -1], [0, -1.6],
    [-2.8, -1], [-2.4, -0.6], [-3.5, 0],
    [-0.2, 4], [0.9, 1.8], [1, 2.2],
    [1.1, 2.8], [1.1, 3.4], [1, 4.5],
    [1.8, 0.3], [2.2, 1.3], [2.9, 0],
    [2.7, 1.2], [3, 3], [3.4, 2.8],
    [3, 5], [5.4, 1.2], [6.3, 2]
])


# K-Means
def k_means(data, k=2):  
    if not isinstance(k, int) or k <= 0 or len(data) < k:
        return

    # Select first K points as centroids
    centroids = {0: data[0], 1: data[1]}

    # configurations
    limit = 0.0001
    max_loop_count = 300
    total_steps = []
    # Loop
    for i in range(max_loop_count):
        # Classification data into K groups
        groups = {}

        for j in range(k):
            groups[j] = []

        for item in data:
            dist = [np.linalg.norm(centroids[centroid] - item) for centroid in centroids]
            index = dist.index(min(dist))
            groups[index].append(item)

        # Calculate new centroids
        new_centroids = [np.average(groups[i], axis=0) for i in groups]
        # Store data for matplotlib
        total_steps.append({
            'loop': i,
            'groups': groups,
            'centroids': centroids.copy()
        })

        # Check whether they change or not
        stop_loop = True
        for c in centroids:
            if abs(np.sum((new_centroids[c] - centroids[c])/centroids[c]*100.0)) > limit:
                stop_loop = False
                break

        if stop_loop:
            break

        # Update centroids
        for c in centroids:
            centroids[c] = new_centroids[c]

    # Draw pictures
    colors = k*['g', 'r', 'b', 'c', 'm', 'y', 'k', 'w']
    fig = plt.figure()
    for step in total_steps:
        # This may cause error if len(total_steps) > 9
        ax = fig.add_subplot(1, len(total_steps), step['loop'] + 1)
        for g in step['groups']:
            for point in step['groups'][g]:
                ax.scatter(point[0], point[1], s=20, color=colors[g])
            ax.scatter(step['centroids'][g][0], step['centroids'][g][1], marker='x', s=30, color=colors[g])
    plt.show()


k_means(X)

代码链接

scikit-learn 中的KMeans

scikit-learn 中的KMeans存在cluster模块中,在官方有关KMeans的API文档中可以看到,数据处理结果存放在‘cluster centers ’、‘labels ’和‘ inertia ’中。下面用到了前两者,分别是聚类中心点和标签。

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

# Input data set
X = np.array([  
    [-4, -3.5], [-3.5, -5], [-2.7, -4.5],
    [-2, -4.5], [-2.9, -2.9], [-0.4, -4.5],
    [-1.4, -2.5], [-1.6, -2], [-1.5, -1.3],
    [-0.5, -2.1], [-0.6, -1], [0, -1.6],
    [-2.8, -1], [-2.4, -0.6], [-3.5, 0],
    [-0.2, 4], [0.9, 1.8], [1, 2.2],
    [1.1, 2.8], [1.1, 3.4], [1, 4.5],
    [1.8, 0.3], [2.2, 1.3], [2.9, 0],
    [2.7, 1.2], [3, 3], [3.4, 2.8],
    [3, 5], [5.4, 1.2], [6.3, 2]
])

clf = KMeans(n_clusters=2)  
clf.fit(X)  
centroids = clf.cluster_centers_  
labels = clf.labels_

colors = ['r', 'g']  
for i in range(len(X)):  
    plt.scatter(X[i][0], X[i][1], color=colors[labels[i]], s=20)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=30)  
plt.show()

代码链接

执行结果如下: 机器学习08:K-Means聚类算法


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精通Spring 4.x

精通Spring 4.x

陈雄华、林开雄、文建国 / 电子工业出版社 / 2017-1-1 / CNY 128.00

Spring 4.0是Spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。Spring 4.0引入了众多Java开发者翘首以盼的基于Groovy Bean的配置、HTML 5/WebSocket支持等新功能,全面支持Java 8.0,最低要求是Java 6.0。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是Java W......一起来看看 《精通Spring 4.x》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具