机器学习15-k-means-python

16 篇文章 0 订阅
15 篇文章 0 订阅

1. 原理

参考博客

1. 标准k-means

基本思想:不断更新质心,直到质心变化不大

2. 二分k-means

基本思想:选取分簇之后的sse(到质心的距离平方和)是否最小分簇

3. 小批量k-means

基本思想:随机选取小批量样本,分配到最近的质心,更新质心,重复操作即可

2. python实现

1. 标准k-means

def standard_kmeans(data_mat, k):
    """
    1. 初始化k个中心点
    2. 计算每个样本到中心点的距离,最近的就划分为哪个族
    3. 更新中心点
    4. 判断中心点是否有变化
    5. 没有变化,结束
    6. 有变化,回到步骤2
    :param data_mat:
    :param k:
    :return:
    """
    m, n = data_mat.shape
    center_pt = rand_init_center(data_mat, k)
    # 存储每个点到属于哪个族以及距离
    cluster_assment = np.mat(np.zeros((m,2)))
    change = True
    while change:
        change = False
        # 遍历所有样本
        for i in range(m):
            min_dis_index = -1
            min_dis = np.inf
            # 遍历所有的中心点
            for j in range(k):
                dis = computer_distance(center_pt[j, :], data_mat[i, :])
                if dis < min_dis:
                    min_dis = dis
                    min_dis_index = j
            if cluster_assment[i,0] != min_dis_index:
                change = True
            # 更新最近的中心点以及距离
            cluster_assment[i,0] = min_dis_index
            cluster_assment[i,1] = min_dis
        # 如果中心没有变化,那么就可以退出了
        if not change:
            break
        # 更新中心
        for i in range(k):
            # 提取i族的点
            index = cluster_assment[:, 0].A == i
            # nonzero返回一个元组,[0] 是行号,[1]是列号
            index = np.nonzero(index)
            pts = data_mat[index[0], :]
            if pts.shape[0] != 0:
                center_pt[i] = np.mean(pts, axis=0)
    
    return center_pt, cluster_assment

3. sklearn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值