徒手写代码之《机器学习实战》----K均值算法(1)(对地理坐标进行聚类)

本文介绍了如何使用K均值算法对地理坐标进行聚类,涵盖了K-均值聚类的支持函数、算法实现、二分K-均值以及球面距离的计算方法,同时提供了数据导入和聚类结果的可视化函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对地理坐标进行聚类

说明:

places.txtPortland.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值