PS:该系列数据都可以在图灵社区(点击此链接)中随书下载中下载(如下)

聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类,聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好。K-均值(K-means) 聚类算法,之所以称之为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。
簇识别(cluster identification):簇识别给出聚类结果的含义。假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么。聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样。因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification )。
1 K-均值聚类算法
K-均值聚类
优点:容易实现。
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。
使用数据类型:数值型数据。
K-均值是发现给定数据集的k个簇的算法。簇个数k是用户给定的,每一个簇通过其质心(centroid),即簇中所有点的中心来描述。
工作流程:首先,随机确定k个初始点作为质心。然后将数据集中的每个点分配到一个簇中,具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。这一步完成之后,每个簇的质心更新为该簇所有点的平均值。
伪代码:
创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
对数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
创建kMeans.py,将数据集拷贝到该文件目录,编写如下代码并进行测试:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
def loadDataSet(fileName):
dataMat = []
with open(fileName, 'r') as fileObject:
for line in fileObject.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):
'''返回k个随机质心'''
n = np.shape(dataSet)[1]
centroids = np.mat(np.zeros((k, n)))
for j in range(n):
minJ = np.min(dataSet[:, j])
rangeJ = float(np.max(dataSet[:, j]) - minJ)
centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1) #k行1列的[0,1)的随机数
return centroids
def kMeans(dataSet, k, distMeans=distEclud, createCent=randCent):
'''K-均值聚类算法'''
m = np.shape(dataSet)[0]
#簇分配结果矩阵,第一列存储簇索引值,第二列存储误差
clusterAssment = np.mat(np.zeros((m, 2)))
centroids = createCent(dataSet, k)
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = float('inf'

本文介绍了K-均值聚类算法的工作原理、流程,包括如何初始化质心,如何分配数据点,以及如何更新质心。此外,讨论了如何通过后处理提高聚类性能,如调整SSE和考虑局部最优。还提到了二分K-均值算法,以避免陷入局部最小值。最后,展示了如何将K-均值应用到地图上的地理坐标聚类,并提供了实际操作的示例。
最低0.47元/天 解锁文章
1950

被折叠的 条评论
为什么被折叠?



