Python从零实现 K-mean 和K-中心点聚类算法

数据挖掘十大算法(二):K-means聚类算法原理与实现 参考:1.机器学习-KMeans聚类 K值以及初始类簇中心点的选取2.K-Means算法的研究分析及改进一、K-means算法原理K-means算法是最常用的一种聚类算法。算法的输入为一个样本集(或者称为点集),通过该算法可以将样本进行聚类,具有相似特征的样本聚为一类。针对每个点,计算这个点距离所有中心点最近的那个中心点,然后将这个点归为这个中心点代表的簇。一次迭代结束之后,针对每个簇类,重新计算... 阅读详情

样本数据下载

先上代码:

"""
@Author :Jintu Zheng
@Date: 2020-12-23
@Version: 1.0.00
@Desciption: K-means and K-medoids using numpy
"""
import numpy as np
import random
import math

class dataset(object):
    def __init__(self, path):
        self.raw_data = np.loadtxt(path, delimiter=',')

class Cluster(object):
    def __init__(self, k, data, epoches = 10, distance_func = "euclidean"):
        self.k = k
        self.data = data
        self.rows, self.data_dims = data.shape[0], data.shape[1]
        self.epoches = epoches
        self.result = []
        self.distance_func_name = distance_func
    
    def distance_func(self, vector1, vector2):
        """距离公式
        欧氏距离(euclidean)
        曼哈顿距离(manhattan)
        切比雪夫距离(chebyshev)
        夹角余弦(cosine)
        """
        _func = self.distance_func_name
        if _func == 'euclidean':
            return np.linalg.norm(vector1-vector2)
        elif _func == 'manhattan':
            return np.linalg.norm(vector1-vector2,ord=1)
        elif _func == 'chebyshev':
            return np.linalg.norm(vector1-vector2,ord=np.inf)
        elif _func == 'cosine':
            return np.dot(vector1,vector2)/(np.linalg.norm(vector1)*(np.linalg.norm(vector2)))
        
    def kmeans_forward(self):
        centers = []
        for ki in range(self.k):
            centers.append(np.array([random.uniform(0,1) for di in range(self.data_dims)]))
        centers = np.array(centers)
        for epoch in range(self.epoches):
            self.result.clear()
            print('Running for epoch {}/{} -->'.format(epoch, self.epoches))
            for row in range(self.rows):
                dis_lst = [self.distance_func(self.data[row],centers[i]) for i in range(self.k)]
                min_dis = min(dis_lst)
                self.result.append(dis_lst.index(min_dis))
            # update
            for ik in range(self.k):
                sum_elems = self.result.count(ik)
                if sum_elems > 0:
                    found_elems = []
                    for row in range(self.rows):
                        if self.result[row] == ik:
                            found_elems.append(self.data[row]) # found the same class
                    found_elems = np.array(found_elems)
                    centers[ik] = np.array([np.mean(found_elems[:,i]) for i in range(self.data_dims)]) # update centers         
        return self.result

    def _get_min_dis_center_in_class(self, data):
        loss_list = []
        for idx in range(data.shape[0]):
            loss = 0
            for idx_j in range(data.shape[0]):
                loss+=self.distance_func(data[idx], data[idx_j])
            loss_list.append(loss)
        return data[loss_list.index(min(loss_list))]

    def kmedoids_forward(self):
        centers = []
        for ki in range(self.k):
            centers.append(self.data[random.randint(0,self.rows)]) # Kmedoids must be the vector of the data
        centers = np.array(centers)
        for epoch in range(self.epoches):
            self.result.clear()
            print('Running for epoch {}/{} -->'.format(epoch, self.epoches))
            for row in range(self.rows):
                dis_lst = [self.distance_func(self.data[row],centers[i]) for i in range(self.k)]
                min_dis = min(dis_lst)
                self.result.append(dis_lst.index(min_dis))

            # update
            for ik in range(self.k):
                sum_elems = self.result.count(ik)
                if sum_elems > 0:
                    found_elems = []
                    for row in range(self.rows):
                        if self.result[row] == ik:
                            found_elems.append(self.data[row]) # found the same class
                    found_elems = np.array(found_elems)
                    centers[ik] = self._get_min_dis_center_in_class(found_elems) # update centers
        return self.result


if __name__ == "__main__":
    dt = dataset('data.csv')
    funcs = ['euclidean','manhattan','chebyshev','cosine']
    model = Cluster(k=10, epoches=1000, data=dt.raw_data, distance_func='manhattan')
    #result = model.kmeans_forward()
    result = model.kmedoids_forward()
    print(result)


K-means


1、随机选取K个质心的值

2、计算各个点到质心的距离

3、将点的类划分为离他最近的质心,形成K个cluster

4、根据分类好的cluster,在每个cluster内重新计算质心(平均每个点的值)

5、重复迭代2-4步直到满足迭代次数或误差小于指定的值


K-medoids


1、随机选取K个质心的值 (质心必须是某些样本点的值,而不是任意值)

2、计算各个点到质心的距离

3、将点的类划分为离他最近的质心,形成K个cluster

4、根据分类好的cluster,在每个cluster内重新计算质心:

  • 4.1 计算cluster内所有样本点到其中一个样本点的曼哈顿距离和(绝对误差)

  • 4.2 选出使cluster绝对误差最小的样本点作为质心

5、重复迭代2-4步直到满足迭代次数或误差小于指定的值

Python实现聚类K-means算法 本文内容、数据参考周志华《机器学习》,代码部分为个人实现,如有错误还请指出。 阅读详情

相关推荐

k-means 聚类算法

文章目录k-means 聚类算法一、原理二、python实现聚类分析三、sklearn实现聚类分析四、 K-means算法优缺点 参考: 数据挖掘十大算法(二):K-means聚类算法原理与实现 K-means聚类分析算法原理、改进及实现 k-means 聚类算法 一、原理 K-means聚类算法是一种无监督分类算法,将划分出来的类簇中点的均值当作该类簇的中心点,其可以在不确定划分规则的前提下,通过对数据集合不断迭代的方法对数据集进行划分,自动计算并更新每个类簇的中心点。 K-means聚类算法是一种迭

Java_KW的博客 6538

k-medoid(k中心点)聚类算法Python实现

k-means算法有个很大的缺点,就是对孤立点敏感性太高,孤立点即是脱离群众的点,与众不同的点,即在显示中与其他点不是抱在一团的点。 为了体现两者的不同,我特意温习了一下知识,在构造初始点的时候,自己定义加入了几个孤立点,使用k-means算法跑的效果如下: 一开始的所有点:(可以看出其他点是混在一起有许多分类的) 使用k-means算法运行,定义3个中心点: 可以看到...

weixin_39220714的博客 3万+

k-means 聚类算法(Python实现)

k-means 聚类算法思想 先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心重新聚类,迭代n次得到最终结果 分步实现 一、初始化聚类中心 首先随机选择集合里的一个元素作为第一个聚类中心放入容器,选择距离第一个聚类中心最远的一个元素作为第二个聚类中心放入容器,第三、四、、、N个同理,为了优化可以选择距离开方做为评判标准 二、迭...

FutureBook 6万+

python使用k-means算法代码案例-K-means聚类算法及python代码实现

K-means聚类算法(事先数据并没有类别之分!所有的数据都是一样的)1、概述K-means算法是集简单和经典于一身的基于距离的聚类算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。2、核心思想通过迭代寻找k个类簇的一种划分方案,使得用这k个类簇的均值来代表相应各类样本时所得的总体误差最小。k个...

weixin_37988176的博客 6528

k-modes聚类算法

引言 之前介绍的K-means和k-medoids算法都是针对数据为数值型的聚类算法,计算样本间的距离采用的是欧式距离,所以如果数据变量是类别型的采用这两种算法,就需要先进行one-hot编码或者dummy coding。针对类别型变量的聚类,可以采用k-modes聚类算法。 k-modes算法 当数据变量为数值型时,可以采用k-modes算法进行聚类。因为该算法中计算的是样本间的汉明距离,如果变...

学习者的旅途 1万+

python代码实现K-means聚类算法

第一部分:理论实战 概述 K-means算法是集简单和经典于一身的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。 2,基本思想 通过迭代寻找k个类簇的一种划分方案,使得用这k个类簇的均值来代表相应各类样本时所得的总体误差最小。 k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 k-means算法的基础是最小误差平方和准则 ...

weixin_44108901的博客 6189

python机器学习案例系列教程——k均值聚类、k中心点聚类

全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 上一篇我们学习了层次聚类。层次聚类只是迭代的把最相近的两个聚类匹配起来。并没有给出能给出多少的分组。今天我们来研究一个K均值聚类。就是给定分组数目的基础上再来聚类。即将所有的样本数据集分成K个组,每个组内尽可能相似,每个组间又尽可能不相似。 k均值聚类和k中心点聚类属于基于划分的聚类。也就是给定了k值(簇的个...

1万+

Python实现-Kmeans聚类算法

Python实现-Kmeans聚类算法 1.Kmeans聚类定义 2.问题描述 3.实现过程 1. Kmeans聚类算法 Kmeans聚类算法: k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给...

g1x2w3的博客 5295

k-medoid(k中心点)聚类算法-Python实现

k-medoid(k中心点)聚类算法-Python实现

weixin_44992737的博客 2783

利用 python 编写 K-Means聚类算法

利用 python 实现 K-Means聚类 k-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。..

PeterHeinz的博客 4460

文本聚类算法之K-means算法的python实现

一、算法简介 算法接受参数k,然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得的一个“中心对象”来进行计算的。        基本思想:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。        算

小拳头的博客 9475

关于聚类问题的算法python代码实现-K-均值聚类方法

关于聚类问题的算法python代码实现-K-均值聚类方法

Sun123234的博客 9188

Python从零实现 K-mean 和K-中心点聚类算法的样本数据

Python从零实现 K-mean 和K-中心点聚类算法的样本数据

【机器学习】—— K-means聚类算法原理详解 以及 二维、三维数据的K-means聚类Python实现

文章目录一、K-Means聚类算法原理过程1.1 K-means聚类的一些细节1.1.1 样本x(i)x^{(i)}x(i)与中心点μkμ_kμk​距离的衡量1.1.2 K-means聚类算法的应用场合1.1.3 K-means聚类算法的优化目标1.1.4 随机初始化的要点1.1.5 类的数量K的选取二、二维,三维数据K-means算法的Python实现 一、K-Means聚类算法原理过程 K-m...

凝望,划过星空的博客 2万+

OpenClaw 完整部署教程

版本:OpenClaw 2026.2.13更新日期:2026-02-26适用系统:Linux (Ubuntu/Debian/CentOS)

qq_39436086的博客 2317

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 320

Python实现K-Means++聚类算法

声明:代码的运行环境为Python3。Python3与Python2在一些细节上会有所不同,希望广大读者注意。本博客以代码为主,代码中会有详细的注释。相关文章将会发布在我的个人博客专栏《Python从入门到深度学习》,欢迎大家关注~ 之前我写过一篇文章叫《Python实现K-Means聚类算法》,这篇文章主要是在之前的基础上介绍K-Means算法的改进版——K-Mea...

象在舞的技术专栏 1万+

STM32H750实战:如何用CubeMX配置NAND Flash时序(附常见问题排查)

本文详细解析了STM32H750通过CubeMX配置NAND Flash时序的实战技巧,包括硬件连接、时序参数计算与优化策略,以及常见问题如RGB屏幕干扰、多片选冲突的解决方案。特别针对NAND Flash的时序配置和抗干扰设计提供了实用代码示例和优化建议,帮助开发者提升系统稳定性和性能。

weixin_29176179的博客 363

K-Means 聚类算法 Python实现

K-Means聚类算法的简单实现

weixin_39678570的博客 1万+

【关于四足机器人那些事】足端轨迹规划-八次多项式轨迹

系列文章目录 文章目录系列文章目录前言一、多项式曲线二、八次多项式曲线总结 前言 在四足机器人的研究中,有一个很关键的问题,就是如何减少足端在触地瞬间的冲击,避免把机器人把自己给蹬倒了?这时候就需要一个合理的足端轨迹规划。本篇将会介绍几种足端轨迹。 本文将对四足机器人的足端轨迹进行规划。将数学中的复合摆线和多项式曲线引入到足端轨迹的规划中,根据零冲击原则[2],规划出 3 条满足要求的足端轨迹,包括: 复合摆线轨迹 八次多项式轨迹 分段五次多项式轨迹 本篇先介绍 - 八次多项式轨迹 一、多项式曲

LiuZ的博客 2954

Windows下用Python调用科大讯飞语音唤醒SDK的避坑指南(附完整代码)

本文详细介绍了在Windows平台使用Python调用科大讯飞语音唤醒SDK的全流程,包括环境配置、核心代码实现、典型问题解决方案及进阶开发技巧。通过完整的代码示例和避坑指南,帮助开发者快速集成语音唤醒功能,提升开发效率。

u0v1w2x3的博客 405

数据挖掘——PAM(K-Medoids)聚类算法学习

文章目录一、前言二、算法描述三、实例描述算法四、python代码五、总结参考资料 一、前言   k-means算法对离群点敏感,因为这种对象远离大多数数据,隐藏分配到一个簇时,它们可能严重地扭曲簇的均值。这不经意间影响了其他对象到簇的分配。   于是一种基于K-means的改进算法k-mediod应运而生。围绕中心点划分(Partitioning Around Medoids, PAM)算法是k-...

潘多拉星系的专栏 3万+

OCR技术解析:用Tesseract和PaddleOCR识别文本

OCR技术解析:用Tesseract和PaddleOCR识别文本 ,人工智能,计算机视觉,大模型,AI,光学字符识别(Optical Character Recognition,简称 OCR)是一项将图片、扫描件等文档中的文字信息转换为可编辑文本的技术。在数字化时代,OCR 技术广泛应用于文档处理、车牌识别、身份证识别、古籍数字化等领域,极大地提高了文字信息处理的效率。Tesseract 和 PaddleOCR 是两款极具代表性的 OCR 工具。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

k中心点聚类算法python_聚类算法之——K-Means++聚类算法

轮盘法基本思想:各个个体被选中的概率与其适应度大小成正比;步骤 1.计算出群体中 每个个体的适应度 为群体大小; 2.计算出每个个体被遗传到下一代群体中的概率 3.计算出每个个体的累计概率 累计概率实例 4.在[0,1]区间内产生一个均匀分布的伪随机数r ; 5.若 ,则选择个体1,否则,选择个体k,使得: 成立 ; 6.重复(4)、(5)共m次 实例产生初始种群s1=13 ...

weixin_33068055的博客 3247

基于STM32的汽车主门电动窗开关系统设计方案

以下是基于 STM32CubeMX 和 HAL 库的示例代码,可实现基本的功能。

weixin_42300449的博客 994

数据分析案例-对某宝用户评论做情感分析

目录 原始数据 绘制词云图 情感分析 原始数据 原始数据为某宝一商品的用户评论数据 绘制词云图 # coding=utf-8 import jieba import re import wordcloud import imageio # 打开需要分析词频的文本 with open('淘宝评论3.0.txt', encoding='utf-8') as f: data = f.read() # 文本预处理 :去除一些无用的字符只提取出中文出来 new_data

m0_64336780的博客 1万+
上一篇: Python 的类对于传入的某些参数比如list类型具有修改影响
下一篇: Python 多线程和多进程的生产者消费者模型
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值