Day 23 K-平均演算法 K-Means

介绍:

k-平均演算法(英文:k-means clustering,以下简称为 k-means )是一种非监督式的学习方法,其主要的目标是对未标记的资料进行分群。什麽意思呢?

k-means 的判断逻辑其实跟 KNN 一样,都是物以类聚。我们在介绍 KNN 的时候曾经举例:假设你的邻居都是有钱人,那麽你有十之八九也是有钱人。
那麽 k-means 在做的事情就是:我们不知道谁是有钱人,但是有钱人肯定会聚在一起,穷人也是。

但是资料并不会自己长脚然後凑成一堆,这个时候我们该怎麽将他们分群呢?
答案是找出群集中心。这就像是一群人刚刚凑在一起大家都不熟,但过了一阵子之後便会有一些小团体出现,而在每个团体中总会有人成为领头羊,而这几只领头羊就是我们要找的群集中心了。
(当然,随着时间推进,各个团体内的领头羊也可能会换人,直到最适合的领导者出现为止。)

步骤如下:

  1. 首先决定要分成 k 组,然後在特徵空间中随机选 k 个点当作群集中心。
    (资料的维度是几维,特徵空间就有几维)
  2. 将每一笔资料分别对每一个群集中心计算距离。
  3. 将每一笔资料分类到离自己最近的群集中心。
  4. 每个群内都获得了新的资料,用这些资料更新各组的群集中心。
  5. 直到每一组的群集中心不再有变动为止。

数学式:

  1. 我们将资料分为 k 群,自然就会有 k 个群集中心。而我们会希望每一群的资料都能跟群集中心距离愈短愈好,因此:

    已知观测集https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20(x_%7B1%7D%2Cx_%7B2%7D%2C...%2Cx_%7Bn%7D)%7D%24,其中每个观测都是一个 d 维的实向量,而我们在做的就是要想办法求出各个群组内部最小的均方误差总和。
    https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20%7B%5Cunderset%20%7B%5Cmathbf%20%7BS%7D%20%7D%7B%5Coperatorname%20%7Barg%5C%2Cmin%7D%20%7D%7D%5Csum%20_%7Bi%3D1%7D%5E%7Bk%7D%5Csum%20_%7B%5Cmathbf%20%7Bx%7D%20%5Cin%20S_%7Bi%7D%7D%5Cleft%5C%7C%5Cmathbf%20%7Bx%7D%20-%7B%5Cmu%20%7D_%7Bi%7D%5Cright%5C%7C%5E%7B2%7D%7D%24

    https://chart.googleapis.com/chart?cht=tx&chl=%20%24%7B%5Cmu%20%7D_%7Bi%7D%24 代表群集中心,‖https://chart.googleapis.com/chart?cht=tx&chl=%24%7Bx%7D-%7B%5Cmu%20%7D_%7Bi%7D%24‖就是算欧式距离,而S为分割的群组集合。

  2. 计算每个群集内的资料,其中每个https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x_%7Bp%7D%7D%24都只被分配到一个确定的聚类https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20S%5E%7Bt%7D%7D%24
    https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20S_%7Bi%7D%5E%7B(t)%7D%3D%5Cleft%5C%7Bx_%7Bp%7D%3A%5Cleft%5C%7Cx_%7Bp%7D-m_%7Bi%7D%5E%7B(t)%7D%5Cright%5C%7C%5E%7B2%7D%5Cleq%20%5Cleft%5C%7Cx_%7Bp%7D-m_%7Bj%7D%5E%7B(t)%7D%5Cright%5C%7C%5E%7B2%7D%5Cforall%20j%2C1%5Cleq%20j%5Cleq%20k%5Cright%5C%7D%7D%24

  3. 更新群集中心。
    https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20m_%7Bi%7D%5E%7B(t%2B1)%7D%3D%7B%5Cfrac%20%7B1%7D%7B%5Cleft%7CS_%7Bi%7D%5E%7B(t)%7D%5Cright%7C%7D%7D%5Csum%20_%7Bx_%7Bj%7D%5Cin%20S_%7Bi%7D%5E%7B(t)%7D%7Dx_%7Bj%7D%7D%24

实作

我们随机生成 200 个点,然後用 k-means 将他们分成 5 群:

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

x = np.random.rand(200,2)  # 将200个值随机分布在2维上
clf = KMeans(n_clusters=5)  # 分成5类
clf.fit(x)

# 将点逐一染色
for i in range(0,100):
    if clf.labels_[i] == 0:
        plt.scatter(x[i][0], x[i][1], color='red')
    elif clf.labels_[i] == 1:
        plt.scatter(x[i][0], x[i][1], color='blue')
    elif clf.labels_[i] == 2:
        plt.scatter(x[i][0], x[i][1], color='green')
    elif clf.labels_[i] == 3:
        plt.scatter(x[i][0], x[i][1], color='pink')
    elif clf.labels_[i] == 4:
        plt.scatter(x[i][0], x[i][1], color='orange')

plt.autoscale()
plt.grid()  # grid()用来显示网格
plt.show()

reference

https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E9%9B%86%E7%BE%A4%E5%88%86%E6%9E%90-k-means-clustering-e608a7fe1b43
https://zh.wikipedia.org/wiki/K-%E5%B9%B3%E5%9D%87%E7%AE%97%E6%B3%95

其实机器学习还有很多可以讲的内容,但是碍於篇幅的关系,机器学习的部份将先告一段落。明天将开始进入深度学习的环节!


<<:  IT铁人DAY 23-Command 命令模式

>>:  IT 铁人赛 k8s 入门30天 -- day24 k8s Expose Pod Information to Containers by Environment Variables

建立前端开发准则,让团队能够有效率的开发好维护的程序码(by 均一前端工程师宜陞)

【前言】均一的程序码基础 junyiacademy 从 2013 年 fork Khan Acad...

[DAY-03] 有顶尖的同事 才有一流的工作环境

团队如果有一两个人能力仅免强胜任 会拉低团队所有人的表现. IF 你团队有五名优秀的下属 那这两个...

[Day-22] R语言 - 分群应用(三) 相异点侦测 ( detect dissimilar point by clustering in R.Studio )

您的订阅是我制作影片的动力 订阅点这里~ 影片程序码 ## 应用三: 相异点侦测 #### libr...

Day 05:是说,这个选项可以接什麽东西?autocomplete 与 auto-pair

更新 我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面有...

Day 21 ASP.NET Core Identity

今天来实作身分验证的部分,笔者此前是用 ASP.NET Core Web API 搭配 Blazor...