前言
聚类分析将数据划分成有意义或有用的簇。如果目标是划分成有意义的簇,则簇应当捕获数据的自然结构。
聚类是一种无监督学习方法,因为只是根据样本的相似度或距离将其进行归类,而类或簇事先并不知道。
常用的聚类算法包括:层次聚类、K均值聚类、DBSCAN。在这篇文章中我们简单介绍一下基本KMeans算法的实现。
因为基本KMeans算法的原理比较简单,这里就不详细解释了,感兴趣的朋友可以查阅李航老师的《统计学习方法(第2版)》。
基本KMeans
基本KMeans算法可以用下面的伪代码表示:
选择K个点作为初始质心。
repeat
将每个点指派到最近的质心,形成K个簇。
重新计算每个簇的质心。
util 质心不发生变化。
下面我们给出Python的代码实现,代码中使用的数据集为鸢尾花数据集,距离采用欧氏距离,算法评价标准为误差平方和(Sum of squared error)。
首先,鸢尾花数据集的格式如下:
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
然后,具体的基本KMeans代码实现如下:
import numpy as np
import pandas as pd
def load_dataset(path):
"""
加载聚类训练集,此处以鸢尾花数据集为例
Args:
path: 训练集路径,默认格式为csv
"""
csv_data = pd.read_csv(path, header=None)
dataset = csv_data.loc[:, 0:3]
labels = csv_data.loc[:, 4]
return dataset, labels
def euclidean_distances(vec_x, vec_y):
"""
计算两个向量的欧氏距离
Args:
vec_x: 样本向量x
vec_y: 样本向量y
"""
return np.sqrt(np.sum(np.power(np.asarray(vec_x) - np.asarray(vec_y), 2)))