python实现K均值聚类算法

news/2024/5/20 8:46:38 标签: 聚类, python

之前做大作业的时候本来想用聚类法给点集分类的,但是太复杂了,于是最后没有采用这个方案。现在把之前做的一些工作整理出来写个小博客。

K-means聚类法原理:

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

如何计算?

如果用数据表达式表示,假设簇划分为 ( C 1 , C 2 , . . . C k ) ({C_1},{C_2},...{C_k}) (C1,C2,...Ck),则我们的目标是最小化平方误差E:
E = ∑ i = 1 k ∑ x ∈ C i ∥ x − μ i ∥ 2 2 E = \sum\limits_{i = 1}^k {\sum\limits_{x \in {C_i}} {\left\| {x - {\mu _i}} \right\|_2^2} } E=i=1kxCixμi22
其中 μ i μ_i μi是簇 C i C_i Ci的均值向量,有时也称为质心,表达式为:
μ i = 1 ∣ C i ∣ ∑ x ∈ C i x {\mu _i} = \frac{1}{{\left| {{C_i}} \right|}}\sum\limits_{x \in {C_i}} x μi=Ci1xCix
如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。
下图是K均值聚类法的一个示意图:
在这里插入图片描述
上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。

当然在实际K-Mean算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别。

我的解决方案是在代码中使用的是循环10次(可调),选择总距离最小的那个方案。

代码部分:

python">class KMeansClusterer:  # k均值聚类
    def __init__(self, ndarray, cluster_num):
        self.ndarray = ndarray
        self.cluster_num = cluster_num
        self.points = self.__pick_start_point(ndarray, cluster_num)

    def cluster(self):
        result = []
        for i in range(self.cluster_num):
            result.append([])
        for item in self.ndarray:
            distance_min = sys.maxsize
            index = -1
            for i in range(len(self.points)):
                distance = self.__distance(item, self.points[i])
                if distance < distance_min:
                    distance_min = distance
                    index = i
            result[index] = result[index] + [item.tolist()]
        new_center = []
        for item in result:
            new_center.append(self.__center(item).tolist())
        # 中心点未改变,说明达到稳态,结束递归
        if (self.points == new_center).all():
            sum=self.__sumdis(result)
            return result,self.points,sum
        self.points = np.array(new_center)
        return self.cluster()

    def __sumdis(self,result):
        #计算总距离和
        sum=0
        for i in range(len(self.points)):
            for j in range(len(result[i])):
                sum+=self.__distance(result[i][j],self.points[i])
        return sum

    def __center(self, list):
        # 计算每一列的平均值
        return np.array(list).mean(axis=0)

    def __distance(self, p1, p2):
        #计算两点间距
        tmp = 0
        for i in range(len(p1)):
            tmp += pow(p1[i] - p2[i], 2)
        return pow(tmp, 0.5)

    def __pick_start_point(self, ndarray, cluster_num):
        if cluster_num < 0 or cluster_num > ndarray.shape[0]:
            raise Exception("簇数设置有误")
        # 取点的下标
        indexes = random.sample(np.arange(0, ndarray.shape[0], step=1).tolist(), cluster_num)
        points = []
        for index in indexes:
            points.append(ndarray[index].tolist())
        return np.array(points)

运行结果如下:
运行结果
结果如上图所示,这是之前大作业得到的点集,不同颜色的点分属于不同类型的点集,五角星为每个点集的中心点。

调用函数后得到的是点集以及总距离。代码使用示例我放在资源包里,有需要自取。


http://www.niftyadmin.cn/n/1212723.html

相关文章

12月第2周安全回顾:IE再爆严重漏洞 火狐却成漏洞王

本文同时发布在&#xff1a;[url]http://netsecurity.51cto.com/art/200812/102098.htm[/url]本周(081207-081214)安全业界热点众多&#xff0c;微软上周按时推出了12月份的例行补丁包&#xff0c;但微软产品上接踵而来的严重漏洞&#xff0c;却让这次的补丁升级可能难以成为微…

复合型自适应步长的Gauss型求积(附代码)

复合型自适应步长的Gauss型求积 先前在做数值分析实验时&#xff0c;把高斯型求积公式和复合型、自适应步长的求积融合到了一起&#xff0c;但是后来发现题目没有这个要求。。现在就把这个思路分享一下。 上题目&#xff1a; 实验目的&#xff1a;学会Gauss型求积公式,并应用…

pid摄像头循迹(opencv和openmv)

pid摄像头循迹&#xff08;opencv和openmv&#xff09;用摄像头进行循迹的方法参考硬件选型方面软件思路一.图像预处理&#xff1a;代码部分二.线性拟合opencv线性拟合&#xff1a;实际在树莓派上运行时&#xff0c;帧率也比较高&#xff0c;拟合效果也比较好。三.PID控制关于控…

树莓派的基础配置教程(系统安装、电脑远程控制、软件源更换)

树莓派的基础配置 1.硬件准备 1.树莓派3B&#xff08;型号4B也同样适用&#xff09; 2.一张64G的闪迪存储卡&#xff08;最好是在16g及以上&#xff09; 3.一个读卡器 4.普通电脑显示器&#xff08;有最好&#xff09;&#xff0c;键盘&#xff0c;鼠标 5.一台可以正常工作的…

html5文件夹上传下载组件

我们平时经常做的是上传文件&#xff0c;上传文件夹与上传文件类似&#xff0c;但也有一些不同之处&#xff0c;这次做了上传文件夹就记录下以备后用。 这次项目的需求&#xff1a; 支持大文件的上传和续传&#xff0c;要求续传支持所有浏览器&#xff0c;包括ie6,ie7,ie8,ie…

[大话IOC系列]--5.Castle揭密(2)

ddd转载于:https://www.cnblogs.com/chenjunbiao/archive/2008/12/26/1760151.html

通过云端自动生成openmv的神经网络模型,进行目标检测

通过云端自动生成openmv的神经网络模型&#xff0c;进行目标检测OpenMV训练神经网络模型&#xff08;目标识别&#xff09;一、准备材料&#xff1a;二、软件下载三、准备数据集&#xff1a;四、数据集的上传与训练OpenMV训练神经网络模型&#xff08;目标识别&#xff09; 一…

平衡车+速度/位置pid+野火上位机移植+Freertos+cubemx(一)

平衡小车野火pid上位机移植程序源码已经上传&#xff0c;需要的可以下载。**一.首先下载STM32CUBEMX****二.配置相关单片机和相关功能**1.配置时钟和debug引脚2.开启freertos3.相关功能以及引脚的配置这里使用的相关功能有&#xff1a;TIM1 编码器模式 用于记录左轮的编码器TIM…