10 k k k-均值聚类(Grouping unlabeled items using k-means clustering)
聚类(clustering):一种无监督学习(unsupervised learning)算法,自动生成相似样本簇(cluster)。
k k k-均值( k k k-means):生成 k k k个簇,各簇中心为簇内样本均值。
聚类也称非监督分类(unsupervised classification),其输出与分类(classification)相同,但没有预定义类别。
聚类分析将相似(similar)样本归类到同一簇中,非相似(dissimilar)样本归类到不同簇中。相似性(similarity)取决于相似性测度(similarity measurement)。
import matplotlib.pyplot as plt
import numpy as np
random_seed = 13
np.random.seed(seed=random_seed)
10.1 k k k-均值聚类算法
k k k-均值聚类( k k k-means clustering):
优点:易于使用
缺点:收敛于局部极小值(converge at local minima);大规模数据集上运行很慢
适用范围:数值
给定数据集, k k k-均值从中寻找 k k k个簇, k k k为用户定义的超参数。各簇用簇中心(centroid)表示。
k k k-均值伪代码:
(随机)创建k个初始中心
当任意样本点的簇类别改变时:
遍历数据集:
遍历簇中心:
计算簇中心与样本点距离
将样本点分配距离最近的簇类别
遍历所有簇:
计算各簇均值,将簇均值分配给簇中心
k k k-均值聚类步骤:
- 收集数据
- 准备:数值型数据,标称值需映射为二进制数值
- 分析:
- 训练:
- 测试:应用聚类算法、检查结果,测量定量误差
- 使用:
# Listing 10.1 k-means support functions
def loadDataSet(fileName):
dataMat = []
with open(fileName, "r") as fr:
for line in fr.readlines():
curLine = line.strip().split("\t")
fltLine = list(map(float, curLine))
dataMat.append(fltLine)
return dataMat
def distEclud(vecA, vecB):
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
def randCent(dataSet, k):
n = np.shape(dataSet)[1]
centroids = np.matrix(np.zeros