聚类分析(K-means) python代码实现
今天在课程上再一次系统接触到了聚类分析,当然,以前在使用spss时也解决过此类问题(这还要追溯到18年),但不得不说,软件的便利化使得我对于原理又疏忽了很多。所以,空想不如实干,今天抽出一些时间用python对聚类分析的最基础的一种(K-means)进行了实现,下面,我将就原理、案例及代码进行分析。
首先,提到聚类分析,我们会想到:群体划分、客户分类、基因聚类等应用,它的原理简单来说归纳为一句话“物以类聚,人以群分”,确实,我们在运用此方法时,所需做到的最终结果就是将具有相同特征的归为一类,不同则分组。
那么,作为一种无监督学习方法(无标签、数据驱动),它不需要类别标柱,我们可以直接从数据中探索数据间的结构联系。在解决此类问题时,我们会有基于分割和基于层次的两类方法,再细化来说,可以有KMeans、Sequential Leader、Density Based Methods等方法。对于K-means方法来说,可以说是聚类分析中最经典的算法,同时运用也最为普遍。
其中,我们在利用K-means解决聚类问题时,需要明确最重要的两点:
-
相似性度量(可分为数值型、二值属性和包含分类属性和数值属性的混合属性三种情况来进行分析),
- 对于数值型,可使用距离度量(欧氏距离、曼哈顿距离);
- 对于二值属性,可利用冗余矩阵来进行不变相似性的测量**(对于不对称的二值变量,如果取值1比0重要,那么这样的二值变量就只有一种状态。)**
- 对于混合属性,若属性f为二元属性或标称属性,二者相同距离为0,不同距离为1;若属性f为序数型属性,那么d(p,q)=|p-q|/(n-1);若属性f为数值型属性,那么d(p,q)=distance(p,q)(注意距离和相似性的倒数关系);
-
对于中心点的选取,我们领域专家知识,这也是此类方法的缺点之一。
整个算法的详细步骤呢,我从课程ppt中截取了一张图,供大家参考:
(所有权归老师)
以上就是我对于原理的简要阐述,那么回到案例:
对表中二维数据使用k-means算法进行聚类,划分为2个簇,假设初始簇中心选择P7(4,5)和P10(5,5)。
P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P10 | |
---|---|---|---|---|---|---|---|---|---|---|
x | 3 | 3 | 7 | 4 | 3 | 8 | 4 | 4 | 7 | 5 |
y | 4 | 6 | 3 | 7 | 8 | 5 | 5 | 1 | 4 | 5 |
针对上述这个题目呢,我的编程思路如下所述:
- 初始化数据,并进行初始图像的绘制(未分类的散点图);
- 进行K-means步骤的编程(其中距离度量采用欧氏距离)
- 更新图像,进行两次聚类后结果已趋于不变
下面就是整体的代码实现过程(由于时间紧迫,没有采用线程进行动态模拟,知识利用循环进行了迭代):
import numpy as np
import matplotlib.pyplot as plt
import math
# 数据初始化
train = np.array([[3, 4], [3, 6], [7, 3], [4, 7], [3, 8], [8, 5], [4, 5], [4, 1], [7, 4], [5, 5]])
# 初始簇中心选择(4,5),(5,5)
center = np.array([[4, 5], [5, 5]], dtype=