k-means聚类算法: python实现

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

code

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



def kMeans(daSet, K):
    centerPoint = random.sample(daSet, K)

    center_dis = 9999
    iterNum = 0
    while np.mean(center_dis) > 1e-6:
        ind = assignment(daSet, centerPoint)
        newCenterPoint = update(daSet, ind, K)
        center_dis = [calDis(centerPoint[i],newCenterPoint[i]) for i in range(K)]
        centerPoint = newCenterPoint #new iteration
        iterNum += 1
        print("cent Dis: ", center_dis, np.mean(center_dis))
    return newCenterPoint, ind, iterNum


def assignment(daSet, centerPoint):
    dis_all = [[calDis(point, center) for center in centerPoint] for point in daSet]
    ind = np.array(dis_all).argmin(axis=1) #注意不是min或nanmin求极值,而是求极值对应的序号,以后续选择cluster归属

    print(dis_all,"\n ind= ", ind)
    return ind

def update(daSet, ind, K):
    newCenterPoint = []#np.array([[]])
    for i in range(0,K):
        clu_i_ind = np.argwhere(np.array(ind)==i)
        #print(clu_i_ind, clu_i_ind.__class__)
        clu = np.array(daSet)[clu_i_ind]
        newCenterPoint.append((np.mean(clu, axis=0)))
        #newCenterPoint = np.append(newCenterPoint, np.mean(clu, axis=0), axis = 0)
    print("clu", clu, np.array(newCenterPoint).squeeze())
    return np.array(newCenterPoint).squeeze()

def calDis(p1,p2):
    #这里采用欧式距
    return np.sqrt(np.sum(np.power(np.array(p1)-np.array(p2),2)))

def createDataSet():
    return [[1,1], [2,1], [3,1], [2,3], [10,9], [9,9],[7,8],[6,5],[10,11], [3,3],[13,12], [13,10],[-5,-2],[-10,-9],[-8,-7]]


if __name__ == "__main__":
    daSet = createDataSet()
    newCenterPoint, ind, iterNum = kMeans(daSet, 3)
    cl = ['bs','k<','c*','yo']
    print("Final", newCenterPoint, ind, "\n iterative rounds:\n",iterNum)
    plt.figure()
    plt.plot(np.array(newCenterPoint)[:,0], np.array(newCenterPoint)[:,1], 'xr')

    for ii, ele in enumerate(daSet):

        plt.plot(ele[0], ele[1], cl[ ind[ii]]) #ind[ii]指明所属,利用cl[]区分不同属的个体;想要输出clu,可以argwhere查找ind==i
    plt.show()
  • 主要函数为:创建数据(也可以用正态分布随机生成,效果更好)、控制流程的k-means、主要的分配assigment和更新update两个迭代步骤;分别负责按照距离最小分类、和计算新的类中心;根据中心点不变来判决收敛了; 最后mian函数里图形输出

results

在这里插入图片描述

来源

https://en.wikipedia.org/wiki/K-means_clustering

问题

  • 数据存储结构设计为list还是array,有问题;array方便处理,list更方便创建和刷新
  • 如何根据索引分类:采用ind = np.argmin, cl_ind = np.argwhere(ind), dataSet(cl_ind)输出每一类

改进生数

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

cl = ['bs', 'k<', 'c*', 'yo']

def kMeans(daSet, K):
    centerPoint = random.sample(daSet, K)

    center_dis = 9999
    iterNum = 0
    while np.mean(center_dis) > 1e-6:
        ind = assignment(daSet, centerPoint)
        newCenterPoint = update(daSet, ind, K)
        center_dis = [calDis(centerPoint[i],newCenterPoint[i]) for i in range(K)]
        centerPoint = newCenterPoint #new iteration
        iterNum += 1
        print("cent Dis: ", center_dis, np.mean(center_dis))
    return newCenterPoint, ind, iterNum


def assignment(daSet, centerPoint):
    dis_all = [[calDis(point, center) for center in centerPoint] for point in daSet]
    ind = np.array(dis_all).argmin(axis=1) #注意不是min或nanmin求极值,而是求极值对应的序号,以后续选择cluster归属

    print(dis_all,"\n ind= ", ind)
    return ind

def update(daSet, ind, K):
    newCenterPoint = []#np.array([[]])
    for i in range(0,K):
        clu_i_ind = np.argwhere(np.array(ind)==i)
        #print(clu_i_ind, clu_i_ind.__class__)
        clu = np.array(daSet)[clu_i_ind]
        newCenterPoint.append((np.mean(clu, axis=0)))
        #newCenterPoint = np.append(newCenterPoint, np.mean(clu, axis=0), axis = 0)
    print("clu", clu, np.array(newCenterPoint).squeeze())
    return np.array(newCenterPoint).squeeze()

def calDis(p1,p2):
    #这里采用欧式距
    return np.sqrt(np.sum(np.power(np.array(p1)-np.array(p2),2)))

def createDataSet(flag = "simple"):
    if flag == "norm":
        num = 100
        norm1 = (5 * np.random.randn(num,2) - np.array([10, 0])).tolist()
        norm2 = (10 * np.random.randn(num,2) - np.array([0, 0])).tolist()
        norm3 = (5 * np.random.randn(num,2) - np.array([-10, 0])).tolist()
        norm4 = (20 * np.random.randn(num,2) - np.array([-5, 5])).tolist()
        norm1.extend(norm2)
        norm1.extend(norm3)
        norm1.extend(norm4)
        plt.figure()
        for i in range(4):
            plt.plot(np.array(norm1[100*i:100*(i+1)])[:,0],np.array(norm1[100*i:100*(i+1)])[:,1], cl[i])
        return random.sample(norm1, num*4)
    else:
        return [[1,1], [2,1], [3,1], [2,3], [10,9], [9,9],[7,8],[6,5],[10,11], [3,3],[13,12], [13,10],[-5,-2],[-10,-9],[-8,-7]]


if __name__ == "__main__":
    daSet = createDataSet("norm")
    newCenterPoint, ind, iterNum = kMeans(daSet, 4)
    print("Final: *****", newCenterPoint, ind, "\n\n iterative rounds:",iterNum)
    plt.figure()
    for ii, ele in enumerate(daSet):
        plt.plot(ele[0], ele[1], cl[ ind[ii]]) #ind[ii]指明所属,利用cl[]区分不同属的个体;想要输出clu,可以argwhere查找ind==i

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

相关推荐

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

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

FutureBook 6万+

基于Python的机器学习系列(19):K均值聚类(K-Means Clustering)

K均值聚类(K-Means Clustering)是一种常用的无监督学习算法,用于将数据样本划分为若干个“簇”,使得同一簇内的数据点彼此相似,而不同簇的数据点之间差异较大。由于K均值不依赖于标签,因此它是一种无监督学习方法。常见的应用包括客户细分、图像分割和数据可视化等。K均值聚类与之前介绍的监督学习模型(如决策树、Bagging和随机森林)有显著不同。监督学习模型依赖于标签来训练模型并进行预测,而K均值聚类则通过无监督的方式探索数据的内在结构,无需标签信息。

不想宅的冷同学 716

K-means聚类算法及Python代码实现

K-means算法是集简单和经典于一身的基于距离的聚类算法 采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。 该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

m0_72557783的博客 5424

Python+OpenCV:理解K-Means聚类(K-Means Clustering)

Python+OpenCV:理解K-Means聚类(K-Means Clustering) 理论 We will deal this with an example which is commonly used. T-shirt size problem Consider a company, which is going to release a new model of T-shirt to market. Obviously they will have to manufacture mode

《好好先生》专栏 784

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

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

PeterHeinz的博客 4462

Python实现k均值聚类算法_K-Means聚类算法

Python实现k均值聚类算法_K-Means聚类算法 若想快速了解k均值聚类算法_K-Means聚类算法,可参考这位大佬的文章,通俗易懂:k均值聚类算法考试例题_K-Means聚类算法,作者:weixin_39789792 感谢这位博主。 本篇博客仅作为自用笔记,如有侵权联系删除。 代码详细 注意: 质心k的坐标取值不能取的太离谱,比如三个质心中有一个质心的坐标离样本数据中所有坐标都很远,就会导致列表sse_k1(或k2、k3)中无数据,便使len(sse_kx(x为1、2、3))=0,报错:Zero

weixin_44097539的博客 3090

Python实现K-means聚类分析

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

weixin_52398581的博客 4187

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

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

小拳头的博客 9476

Clustering (1): k-means(Python实现)

1、什么是聚类 Clustering 中文翻译作“聚类”,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行“学习”,从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做 supervised

aihali的专栏 2403

K-means聚类算法(Python)

一,介绍   K-Means是一种经典的无监督的聚类算法。它比较简单,易于实现并且应用很广泛。 二,原理   K-Means算法的思想很简单,对于给定的数据集:   1)将各个聚类内的所有样本的均值作为该聚类的代表点,   2)计算每个样本到各个均值的距离,   3)取最小距离的均值所在类别作为样本类别,从而数据集划分为K个类,   4)再重新计算每个聚类的均值,继续2)3),依次迭代,直到均值不...

编程&网站入门 ❤ 寸草&春晖 2623

K均值(K-means)聚类算法(Python3实现代码)

K-means算法的简介与Python3实现

锟斤拷 7万+

【Python K均值聚类算法】

聚类(Clustering)是将一组样本根据一定的准则划分到不同 的组(也称为簇(Cluster) ) 一个比较通用的准则是组内样本的相似性要高于组间样本的相似性 从模式识别的角度来讲,聚类就是在发现数据中潜在的模式,帮助人们进行分组归类已达到更好理解数据的分布规律。 常见的聚类算法包括K-Means算法、谱聚类等...

vor234的博客 5885

python实现k-means聚类

python实现k-means聚类,利用的库有numpy sklearn,利用matplot绘图

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

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

洋葱专栏-有灵魂的程序员 1万+

K-means聚类分析与python实现

K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 本代码提供了k-means算法的python实现,并使用matlibplot可视化算法结果

基于PTB-XL数据集的深度学习心电信号分类

心电信号的分析与处理是心血管疾病诊断的重要手段。该领域的主要工作领域是分类,它越来越多地得到基于机器学习的算法的支持。在这项工作中,开发了一个深度神经网络来自动分类初级心电信号。这项研究是在PTB-XL数据库中包含的数据上进行的。提出了三种神经网络架构:第一种基于卷积网络,第二种基于SincNet,第三种基于卷积网络,

weixin_55121617的博客 7007

K-Means 聚类算法 Python实现

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

weixin_39678570的博客 1万+

未隔离电源设备使用usb转串口调试导致串口模块爆炸烧坏事故记录

这个事就发生在前两天,我们公司的wifi模块被客户用到了咖啡机上,客户寄了一台整机给我们协助调试,还送了几包咖啡豆,本想着还能打个咖啡喝一喝的,但就在咖啡机刚寄过来第一天,就出事了。而这个事故的发生,竟然仅仅是因为同事接了个串口模块到电脑调试打印导致的。谁也想不到,这个3.3V的供电的wifi模块居然还有这么大的威力。直接将usb转TTL串口模块的转换芯片给爆开了,咖啡机也给弄坏了,据同事描述当时情况就只见到一片火光和一声巨响,状况比较惨烈,所幸的是笔记本电脑没有烧坏,但是直接给崩蓝屏了。 ...

fangye945a的博客 6193

K-means聚类算法原理及python实现

文章目录一.聚类算法二.K-means聚类算法三.K-means算法步骤详解Step1.K值的选择Step2.距离度量2.1.欧式距离2.2.曼哈顿距离2.3.余弦相似度Step3.新质心的计算Step4.是否停止K-means四.K-means算法代码实现1.其伪代码如下2.python实现五.K-means算法补充六.小结 一.聚类算法     &nbs...

Flaneur-yz的博客 26万+

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1094

单片机通识之UART通信协议(如何用汇编实现)

使用汇编实现UART通信

smart_num_1的博客 997

聚类及Python下实现 K-means 算法

聚类是无监督学习中的一种重要方法,旨在将数据集中相似的数据对象划分到同一个簇中,使得不同簇之间的数据对象差异尽可能大。在大数据环境下,聚类可以帮助挖掘数据中的隐藏结构和模式,应用场景十分广泛,比如在客户细分领域,根据客户的消费行为、年龄、地域等特征进行聚类,能将客户分为不同群体,方便企业制定针对性的营销策略;在图像识别中,可以依据图像的特征(如颜色、纹理等)聚类来进行图像分类等。常见的聚类算法除了下面要详细说的 K-means 之外,还有层次聚类(如凝聚式层次聚类、分裂式层次聚类等,通过不断合并或拆分簇来构

AllenLV的博客 961

【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现

某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器

MISAYAONE的博客 1万+
上一篇: matplotliba画有意思的3D图,主3D加xyz轴方向投影
下一篇: python小试牛刀:抢手机/抢票神器
飞凡可期
博客等级 码龄11年 34粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值