话不多说,直接上代码,每行代码都是人肉产出。
1.简介
1.1k-means的停止条件
代码中提供了停止k-means继续聚类的条件,在__init__()函数入参指定:
def __init__(self, samples, k, loopLimit, maxDistance)
1)最大Loop次数,就是loopLimit
2)前后计算的两次质心集体的最大距离maxDist大于maxDistance
注:maxDist的详细含义详见代码中的CKM类的对象接口max_distance()
代码中k-means停止的条件:loop次数 > loopLimit 或者 maxDist <= maxDistance
1.2初始质心的初始化
初始质心的初始化在此处就简单随机选取了样本集中的k个
但是初始质心的初始化很重要,初始值不同会影响聚类的结果,后面会用一篇文章详解:初始质心的最佳初始化方法
2.k-means代码
# -*- coding: utf-8 -*-
"""
Author:蔚蓝的天空Tom
Talk is cheap, show me the code
Aim:实现k-means算法, 此处用python class机制来实现
"""
import numpy as np
import matplotlib.pyplot as plt
class CKM(object):
''' this CKM class only '''
def __init__(self, samples, k, loopLimit, maxDistance):
self.samples = samples
self.k = k
self.loopLimit = loopLimit
self.maxDist = maxDistance
self.cents = []
self.clusters = {}
self.work()
return None
def distance(p1, p2):
'''计算p1和p2的欧式距离(欧几里得距离)
:param p1 = [x1,y1]
:param p2 = [x2,y2]
:return euclidean distances
'''
dist = np.sqrt(sum(np.power(p1-