算法实现思路
首先,根据指定的形心标志获取初始形心坐标,将所有形心存储为列表
其次,编写计算所有点到每个形心的距离的方法、根据所有点到每个形心的距离获取新簇的方法、得到新簇的形心的方法
计算所有点到每个形心的距离的方法:遍历形心列表,在内部遍历数据集,计算每个数据集中的每个点到形心的欧式距离平方,将形心和形心与每个点的欧氏距离平方存储为字典,形心为字典键,形心与每个点的欧氏距离为字典值。
根据所有点到每个形心的距离获取新簇的方法:根据所有点到每个形心的距离,将距离某一形心最近的点划分为一簇,存储其对应的点标号(A1、A2等)
得到新簇的形心:根据获得的新簇,计算每一簇所有点坐标的平均值,将其标记为新的形心
最后,编写主函数。首先,获取初始形心坐标,依次调用以下方法直至簇不发生变化(形心也不发生变化),计算所有点到每个形心的距离,获取新簇、获取新的形心,最终获得的簇便是最终结果。
源代码
# -*- coding: utf-8 -*-
"""
@Time : 2020/12/8
@Author : lixinci
@File : 10_2_K均值算法
@Description :
"""
import copy
import operator
dataset = {
"A1": (2, 10), "A2": (2, 5), "A3": (8, 4), "B1": (5, 8),
"B2": (7, 5), "B3": (6, 4), "C1": (1, 2), "C2": (4, 9)
}
def get_initial_centroids(dataset, centroids):
"""
得到初始形心
"""
initial_centroid = []
for centroid in centroids:
initial_centroid.append(dataset[centroid]