无监督学习算法Kmeans

1. 有监督学习和无监督学习

在机器学习算法中,常把算法分为有监督学习和无监督学习两种。他们之间的区别主要在于输入数据集类型学习目标

(1)有监督学习:训练输入的数据需要带有标签,以便算法能够学习输入和输出之间的映射关系;有监督学习的目标是通过对训练数据的学习,实现对未知数据的预测和分类。

(2)无监督学习:训练数据不需要标签,算法只能使用输入数据进行学习,目标是找到输入数据之间的相似性和区别。

这里我们要介绍的Kmeans聚类算法,就是一种无监督学习算法,输入的训练数据不需要类别标签,而是通过计算数据点之间的相似性来对数据进行分类。

2. Kmeans算法原理

这个算法的目标是最小化每个聚类内的距离和,即使得每个点与其所在聚类中心的距离之和最小。它尝试使得每个聚类尽可能小,并且不同聚类之间的距离尽可能大。

  • K-means聚类算法的原理是:

(1) 首先随机选择K个点作为初始的聚类中心;

(2)然后计算每个点到聚类中心的距离,将每个点分配到离它最近的聚类中心所在的簇中;

(3)对于每个簇,计算每个簇所有点的平均值,并将其作为新的聚类中心点;

(4)重复这个过程,直到聚类中心不再发生变化,或者达到预设的迭代次数。

  • K值如何确定

K值是一个重要的超参数,表示簇的个数,即要把数据分为几个类别。

K值的确定可以通过以下几种方法:

肘部法:肘部法所使用的聚类评价指标为数据集中所有样本点到其簇中心的距离之和的平方。

轮廓系数法:轮廓系数是一种非常常用的聚类效果评价指标。

可视化数据:最常用最简单的方法是可视化数据,然后观察出聚类聚成几类比较合适。

交叉验证:计算不同k值下KMeans算法的BIC和AIC值,BIC或AIC值越小,选择该k值。

3. 运行代码

import matplotlib.pyplot as plt
import sklearn
import numpy as np

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

def main():
    # 用sklearn包生成训练集数据(这里的簇心为4)
    blobs = make_blobs(n_samples=200, random_state=1, centers=4)
    X_blobs = blobs[0]      # 提取特征数据
    # Y_blobs = blobs[1]      # 类别标签

    plt.figure(1)
    plt.title('Input points')
    plt.scatter(X_blobs[:, 0], X_blobs[:, 1])

    kmeans = KMeans(n_clusters=2, init='k-means++', n_init=10, max_iter=300, random_state=None, )
    kmeans.fit(X_blobs)
    output = kmeans.predict(X_blobs)
    print('output: ', output)
    
    plt.figure(2)
    plt.title('K = 2')
    plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=output)
    
    # 用红色的x表示簇中心
    centroids = kmeans.cluster_centers_
    plt.scatter(centroids[:, 0], centroids[:, 1], marker="x", s=150, linewidths=3, color='r', zorder=10)
    plt.xticks()
    plt.yticks()
    plt.show()

if __name__ == '__main__':
    main()

结果如下图所示:

第一张图为输入的二维数据,第二张图为K=2时的聚类效果,第三张图为K=4时的聚类效果。可以看到Kmeans算法能达到较好的聚类效果

无监督学习算法Kmeans_第1张图片

无监督学习算法Kmeans_第2张图片

无监督学习算法Kmeans_第3张图片

你可能感兴趣的:(kmeans,机器学习,人工智能)