k-means 聚类算法

本文深入探讨了K-means聚类算法的原理,包括其迭代过程和终止条件。通过Python代码展示了如何从头实现K-means算法,并使用sklearn库进行聚类分析。此外,还讨论了确定K值的方法如手肘法,以及K-means算法的优缺点,包括对初始中心点敏感、噪声和异常值的处理等。
摘要由CSDN通过智能技术生成

参考:

数据挖掘十大算法(二):K-means聚类算法原理与实现

K-means聚类分析算法原理、改进及实现



k-means 聚类算法

一、原理

K-means聚类算法是一种无监督分类算法,将划分出来的类簇中点的均值当作该类簇的中心点,其可以在不确定划分规则的前提下,通过对数据集合不断迭代的方法对数据集进行划分,自动计算并更新每个类簇的中心点。

K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

引用:K-means聚类算法

算法实现步骤:

  1. 选定要聚类的类别数k,选择k个中心点。
  2. 针对样本点,找到距离最近的中心点,将他们归为中心点代表的簇。
  3. 计算每个簇的新的中心点。
  4. 判断新的中心点和旧的中心点是否相同/接近。
  5. 若相同/接近,则算法终止。否则更新中心点,循环2,3,4,直到算法终止。

下面使用python和现有库sklearn,分别实现一下k-means聚类算法。


二、python实现聚类分析

import numpy as np
import matplotlib.pyplot as plt
import random

# 返回两点之间的距离
def get_distance(p1,p2):
    return np.sqrt(sum(map(lambda x,y:(x-y)**2,p1,p2)))

# 计算样本的中心
def calc_center_point(cluster):
    return np.matrix(cluster).mean(axis=0).tolist()[0]

# 检验两个中心点是否有差异
def check_center_diff(center, new_center):
    return center == new_center


# k_means聚类算法实现
def K_means(points, center_points):
    k = len(center_points) # k值

    tot = 0
    while True:
        temp_center_points = [] # 记录中心点
        
        clusters = [[] for _ in range(k)]  # 记录数据值
        # clusters = [[]]*k  
        # 注意:不能使用以上代码,因为*k,是复制的列表,是引用的同一个对象,修改其中一个就会改变所有的值

        # 计算最近中心点,并添加到对应的分组
        for data in points:
            distance = []
            for center in center_points:
                distance.append(get_distance(data,center))
            index = np.argmin(distance)
            clusters[index].append(data)
		
        # 格式化输出迭代日志
        tot += 1
        res_str = ''''''
        res_str += f"第{
     </
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力生活的黄先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值