【机器学习】【K-Means】python实现算法

话不多说,直接上代码,每行代码都是人肉产出。

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-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值