Python手撕kmeans源码

news2024/12/23 17:38:01

参考了两篇文章

K-Means及K-Means++算法Python源码实现-CSDN博客

使用K-means算法进行聚类分析_kmeans聚类分析结果怎么看-CSDN博客

# 定义kmeans类
from copy import deepcopy
from sklearn.datasets import make_blobs
import numpy as np
import matplotlib.pyplot as plt

class kMeans():
    def __init__(self, input_data, k=3, max_epnoch=100):
        """
        :param input_data: 一个numpy数组 为样本特征数值型数据集
        :param k: 分成几组,整数
        :max_epnoch: 最大迭代次数
        """
        self.data = input_data
        self.k = k
        self.max_epnoch = max_epnoch
        self.capacity = len(input_data)
        self.centers = []  # 用于保存族的质心
        self.clusters = np.zeros(self.capacity)  # 用于保存数据所属的族

    def get_init_clustcen(self):
        # 随机初始化聚类中心
        #     k值合理性检验
        if self.k < 1 or self.k > self.capacity:
            raise Exception('k值输入错误')
        # 打乱样本 取前k个
        indexs = np.arange(self.capacity)
        np.random.shuffle(indexs)
        # indexs[:self.k] 取前k个index
        # 这样就随机取k个样本作为组质心
        self.centers = self.data[indexs[:self.k],:]     # data[nums,:]注意这种切片方式必须要data是np数组才可以
        return

    def get_distance(self, data1, data2):
        # 计算同列的数据的欧式距离   diff相减时用到了广播机制
        diff = data1 - data2
        return np.sum(np.power(diff, 2), axis= 1)**0.5   # 按列进行求和

        # np.argmax得到np数组中最小值的索引
    def cluster_pross(self):
        # 用来保存聚类中心的旧值,一开始初始化为0
        old_center = np.zeros(self.centers.shape)
        # 迭代标识符,记录新旧聚类中心的距离
        distance_flag = self.get_distance(old_center, self.centers)

        # 若聚类中心不再变化或者达到迭代次数 则退出 否则才执行循环
        while np.sum(distance_flag) != 0 and self.max_epnoch:
            # 1. 计算每个样本点所属的族
            for i in range(self.capacity):
                # 样本与各族的距离(样本与各族的列是相同的 因此可调用前面准备的函数)
                distance_i = self.get_distance(self.data[i], self.centers)
                # 获得当前样本点与族最近的那个族的索引
                cluster_i = np.argmin(distance_i)
                # 记录当前样本点所属的聚类中心
                self.clusters[i] = cluster_i

            # 2. 更新聚类中心
            # 记录之前的聚类中心
            old_center = deepcopy(self.centers)
            # 按照族来计算,将属于同一组的样本堆叠在一起 计算均值作为聚类中心
            for i in range(self.k):
                tmp = [self.data[j] for j in range(self.capacity) if self.clusters[j] == i]
                # 按列计算均值,并将其存储在新的聚类中心中
                self.centers[i] = np.mean(tmp, axis= 0)

            # 3. 更新迭代条件的值
            self.max_epnoch -= 1
            distance_flag = self.get_distance(old_center, self.centers)
            
        return self.centers, self.clusters
# 实例化并作图前后对比
# 获取数据集 并用图像呈现
X, _ = make_blobs(n_samples=150, n_features=2, centers=3, cluster_std=0.5, random_state=0)
plt.scatter(X[:,0], X[:,1], c='r', marker='o') # 将white改为其他的颜色
plt.grid()
plt.show()

# 实例化一个聚类对象
kmeans_X = kMeans(X)
# 随机初始化聚类中心
kmeans_X.get_init_clustcen()
# 进行聚类 并接结果 为了作图 返回的是聚类中心数据 和 对应样本i的所属聚类
centers, clusters = kmeans_X.cluster_pross()        # 其中 centers(k,n_features)   cluters(n_samples, 1)


# 可视化聚类结果
plt.scatter(X[clusters == 0, 0], X[clusters == 0, 1], s=50, c='lightgreen', marker='s', label='cluster 1')
plt.scatter(X[clusters == 1, 0], X[clusters == 1, 1], s=50, c='orange', marker='o', label='cluster 2')
plt.scatter(X[clusters == 2, 0], X[clusters == 2, 1], s=50, c='lightblue', marker='v', label='cluster 3')
plt.scatter(centers[:,0], centers[:,1], s=250, c='red', marker='*', label='centroids')
plt.legend()
plt.grid()
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何充分准备面试,迅速融入团队并在工作中取得卓越成就

首先&#xff0c;关于如何筹备面试&#xff0c;首先需要对所申请公司与职位进行深入的调查了解&#xff0c;并依据可能提出的面试问题预先准备相应的答案&#xff0c;并提前调试面试所需的仪器设备。同时&#xff0c;也要注重自身形象的塑造。更为关键的是 1. 在计算机领域的面…

搭建你的知识付费小程序平台:源码解析与技术实现

知识付费小程序平台在当今数字化时代扮演着越来越重要的角色&#xff0c;为教育者和学习者提供了一个灵活、便捷的学习环境。本文将以关键词“知识付费小程序源码”为基础&#xff0c;探讨如何搭建一个功能强大的知识付费小程序平台&#xff0c;并提供一些基础的技术代码示例。…

串口通信(1)-硬件知识

本文讲解串口通信的硬件知识。让读者快速了解硬件知识&#xff0c;为下一步编写代码做基础。 目录 一、概述 二、串口通信分类 2.1信息的传送方向进行分类 2.2同步通信和异步通信 三、串口协议 3.1 RS232 3.1.1 电气特性 3.1.2 连接器的机械特性 3.1.3 连接类型 3.1…

08.仿简道云公式函数实战-逻辑函数-IF

1. IF函数 IF 函数可用于判断一个条件能否满足&#xff1b;如果满足返回一个值&#xff0c;如果不满足则返回另外一个值。 2. 函数用法 IF(logical_test&#xff0c;value_if_true, value_if_false) 其中各参数的含义如下&#xff1a; logical_test&#xff1a;必需&#…

JVM虚拟机系统性学习-对象存活判断算法、对象引用类型和垃圾清除算法

垃圾回收 在 JVM 中需要对没有被引用的对象&#xff0c;也就是垃圾对象进行垃圾回收 对象存活判断算法 判断对象存活有两种方式&#xff1a;引用计数法、可达性分析算法 引用计数法 引用计数法通过记录每个对象被引用的次数&#xff0c;例如对象 A 被引用 1 次&#xff0c…

被迫搬家,宽带迁移怎么办?

广州一栋违建烂尾楼&#xff0c;13年里从未停止出租&#xff0c;年年住满人。这栋楼没有贴外墙&#xff0c;裸露的水泥表面都被雨水腐蚀&#xff0c;很多阳台没有建好&#xff0c;只是简单加装了护栏&#xff0c;存在巨大安全隐患。 为什么烂尾楼年年满人呢&#xff1f; 因为它…

STL--关联式容器底层实现

关联式容器从底层实现分为两类&#xff1a;①红黑树&#xff1a;set、map、multiset和multimap ②哈希&#xff1a;unordered_set、unordered_map、unordered_multiset和unordered_multimap。 一、红黑树 它是⼀种特殊的⼆叉查找树。红⿊树的每个节点上都有存储位表示节点的颜…

Java入门项目--蚂蚁爱购

简介 这是一个靠谱的Java入门项目实战&#xff0c;名字叫蚂蚁爱购。 从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目&#xff0c;教程路线是&#xff1a;搭建环境> 安装软件> 创建项目> 添加依赖和配置> 通过表生成代码> 编写Ja…

vue3项目中使用vue-cropper实现截图效果

前言&#xff1a; 自用&#xff01;&#xff01;&#xff01; 插件文档链接&#xff1a; https://www.npmjs.com/package/vue-cropper 使用步骤&#xff1a; 1、安装 npm install vue-cropper 2、项目中引入&#xff08;全局引入&#xff09;&#xff1b;文档中有介绍如何局…

深度学习——第3章 Python程序设计语言(3.7 matplotlib库)

3.7 matplotlib库 目录 1 matplotlib库简介 2 pyplot的plot函数 3 matplotlib基础绘图函数示例 数据可视化有助于深度理解数据。 本节介绍绘制图形的基本方法。 1. matplotlib库简介 matplotlib官网 1.1 matplotlib库概述 matplotlib是Python优秀的数据可视化第三方库&a…

ChatGPT/GPT4+AI绘图+论文高效写作结合到底有多强大?你可以躺赢了

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

LLM之RAG实战(三):LlamaIndex解锁自定义LLM关键步骤分块、索引、查询介绍

一、LLamaIndex介绍 LLamaIndex是一个由Jerry Liu创建的Python库&#xff0c;它可以使用语言模型对大型文档集进行高效的文本搜索和摘要。开发人员可以使用LLamaIndex快速添加私有/自定义数据&#xff0c;以增强现有的LLM。它不需要对大模型进行再训练&#xff0c;即可提供个性…

Todesk、向日葵等访问“无显示器”主机黑屏问题解决

我的环境是 ubuntu 22.04 安装 要安装 video dummy&#xff0c;请在终端中运行以下命令&#xff1a; sudo apt install xserver-xorg-video-dummy配置 video dummy 的配置文件请自行搜索 使用任何文本编辑器打开此文件。 我的是 /etc/X11/xorg.conf 默认配置文件包含以下内…

每日一练【长度最小的子数组】

一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 二、题目解析 经…

在我们日常生活有哪些东西是激光切割机做的

激光加工技术是当前最先进的切割技术&#xff0c;在工业生产中&#xff0c;能解决许多常规方法无法解决的难题&#xff0c;而且应用非常广。让人意想不到的是&#xff0c;很多生活中常见的物品&#xff0c;都是靠激光切割完成的。 它具备精密制造、柔性切割、异形加工、一次成型…

数据取证工具MemProcFS

MemProcFS 是一种将物理内存视为虚拟文件系统中的文件的简便方法。简单的点击内存分析&#xff0c;无需复杂的命令行参数&#xff01;通过安装的虚拟文件系统中的文件或通过功能丰富的应用程序库访问内存内容和工件以包含在您自己的项目中。 链接GitHub - ufrisk/MemProcFS: M…

nodejs+vue+微信小程序+python+PHP的外卖数据分析-计算机毕业设计推荐django

构建一种完全可实现、可操作的开放源代码信息收集系统&#xff0c;帮助记者完成工作任务。采编人员仅需输入所收集到的网址及题目即可迅速启动收集工作并进行信息归类。 2.根据新的数据收集要求&#xff0c;采用云计算技术实现新的收集器的迅速部署。对于资料采集点的改版&…

深度学习 Day11——T11优化器对比实验

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

WordPress插件你好多莉( Hello Dolly )可否卸載

什么是你好多莉Hello Dolly WordPress插件 你好多莉是 WordPress插件 简单的预装在 WordPress 上。 如果您激活后者&#xff0c;它将显示出名曲的歌词“ 你好&#xff0c;多莉 “要 路易斯阿姆斯特朗. 您可能已经注意到&#xff0c;在阅读插件说明时&#xff0c;还不够清楚。 …

系列十五、搭建redis集群

一、概述 上篇文章介绍了redis集群的相关知识&#xff0c;本章实战演示redis的集群环境的详细搭建步骤。如果帮助到了你&#xff0c;请点赞 收藏 关注&#xff01;有疑问的话也可以评论区交流。 二、搭建步骤 2.1、预备知识 判断一个集群中的节点是否可用&#xff0c;是集群…