对地理坐标进行聚类
说明:
将 places.txt
和 Portland.png
放在当前目录下。
from numpy import *
K-均值聚类支持函数
"""
1.选择聚类的个数,k。例如k=3
2.生成k个聚类中心点
3.计算所有样本点到聚类中心点的距离,根据远近聚类。
4.更新质心,迭代聚类。
5.重复第4步骤直到满足收敛要求。(通常就是确定的质心点不再改变)
创建 k 个点作为起始质心(随机选择)
当任意一个点的簇分配结果发生改变时(不改变时算法结束)
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇, 计算簇中所有点的均值并将均值作为质心
直到簇不再发生变化或者达到最大迭代次数
"""
#函数功能:计算两个数据集之间的欧式距离
#输入:两个数据集。
#返回:两个数据集之间的欧式距离(此处用距离平方和代替距离)
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB)
#创建簇中心矩阵,初始化为k个在数据集的边界内随机分布的簇中心
def randCent(dataSet, k):
n = shape(dataSet)[1]
centroids = mat(zeros((k,n)))#create centroid mat
for j in range(n):#create random cluster centers, within bounds of each dimension
#求出数据集中第j列的最小值(即第j个特征)
minJ = min(dataSet[:,j])
#用第j个特征最大值减去最小值得出特征值范围
rangeJ = float(max(dataSet[:,j]) - minJ)
#创建簇矩阵的第J列,random.rand(k,1)表示产生(10,1)维的矩阵,其中每行值都为0-1中的随机值
#可以这样理解,每个centroid矩阵每列的值都在数据集对应特征的范围内,那么k个簇中心自然也都在数据集范围内
centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))
return centroids
K-均值聚类算法
#distMeas为距离计算函数
#createCent为初始化随机簇心函数
"""
函数功能:k均值聚类算法
参数说明:
dataset:数据集
k:簇的个数
distMeas:距离计算函数
createCent:随机质心生成函数
返回:
centroids:质心
clusterAssment:所有数据划分结果
"""
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
m = shape(dataSet)[0]
#创建一个(m,2)维矩阵,第一列存储每个样本对应的簇心,第二列存储样本到簇心的距离
clusterAssment = mat(zeros((m,2)))
#用createCent()函数初始化簇心矩阵
centroids = createCent(dataSet, k)
#保存迭代中clusterAssment是否更新的状态,如果未更新,那么退出迭代,表示收敛
#如果更新,那么继续迭代,直到收敛
clusterChanged = True
while clusterChanged:
clusterChanged = False
#程序中可以创建一个标志变量clusterChanged,如果该值为True,则继续迭代。
#上述迭代使用while循环来实现。接下来遍历所有数据找到距离每个点最近的质心,
#这可以通过对每个点遍历所有质心并计算点到每个质心的距离来完成
#对每个样本找出离样本最近的簇心
for i in range(m):
#minDist保存最小距离
#minIndex保存最小距离对应的簇心
minDist = inf
minIndex = -1
#遍历簇心,找出离i样本最近的簇心
for j in range(k):
distJI = distMeas(centroids[j