Python手撕kmeans源码

参考了两篇文章

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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

redis-学习笔记(Jedis)

自定义的 Redis 客户端 咱们可以实现编写出一个自定义的 Redis 客户端 因为 Redis 公开了自己使用的自定义协议 ---- RESP 协议清楚了, 那么通信数据格式就清除了, 就能完成各层次之间的数据传输, 就能开发服务器和客户端 RESP — Redis 的 序列化 协议 特点: 简单好实现快读进…

ETLCloud的应用策略——实时数据处理是关键

一、ETLCloud是什么&#xff1f; ETLCloud又称数据集成&#xff08;DataOps&#xff09;&#xff0c;是RestCloud旗下的一款数据仓库管理工具&#xff0c;通过自动化数据转换和集成来实现企业内部和外部数据的无缝对接&#xff0c;从而帮助企业快速获取准确的数据信息&#xff…

活动预告 | 微盟技术沙龙 - Elasticsearch 在微盟的实践 12/21/2023

微盟技术沙龙 「微盟技术沙龙」是由微盟研发中心发起并联合各方小伙伴为开发者举办的系列技术沙龙&#xff0c;从用户&#xff0c;产品&#xff0c;技术等方面与开发者进行交流。 微盟技术沙龙关注开发者在实际应用中遇到的问题。提供最真实的干货&#xff0c;以技术会友&…

【SpringBoot】从入门到精通的快速开发指南

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《SpringBoot》。&#x1f3af;&#x1f3af; &…

[MySQL]SQL优化之sql语句优化

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、索引优化 回顾&#xff1a; &#x1f4d5;索引分类&#xff1a; &#x1f4d5;索引失效&#xff1a; &#x1f4d5;设计原则&#xff1a; &#x1f4d5;SQL性能分析 二、SQL优化 语句优化 &#x1f4d…

Gorm 的关联查询

背景介绍 gorm 与 mybatis-plus 、hibernate 等 ORM 框架一样&#xff0c;为了应对查询场景居多的现象&#xff0c;支持原生 sql 和 api 两种方式读数据库。 gorm 原生 sql 参见&#xff1a;https://gorm.io/docs/sql_builder.html。 gorm 提供的 api 支持关联插入、关联查询…

Jmeter入门

一、下载jmeter 官网下载 下载之后解压&#xff0c;在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图&#xff0c;选择语言为中文&#xff0c;可以修改测试计划的名称。如下右图&#xff0c;添加线程组 添加线程组 添加http请求 路径传参方式 …

Linux——MySQL数据库系统

一、 MySQL的编译安装 1、准备工作 &#xff08;1&#xff09;为了避免发生端口冲突&#xff0c;程序冲突等现象&#xff0c;建议先查询MySQL软件的安装情况&#xff0c;确认没有使用以Rpm方式安装的mysql-server、mysql软件包&#xff0c;否则建议将其卸载 [rootlocalhost ~]…

mars3d加载arcgis发布的服务,⽀持4523坐标

问题 1.从这个服务地址加载&#xff0c;具体在哪⾥去转坐标呢&#xff1f; 加个 usePreCachedTilesIfAvailable&#xff1a;false 参数即可 坐标系为4490的arcgis影像服务图层&#xff0c;配置后瓦片加载不出来&#xff0c;没报错 甚至可以跳转 没有看出问题&#xff0c;或者测…

RK3568驱动指南|第八篇 设备树插件-第75章ConfigFS的核心数据结构

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

神由之星加入元宇宙产业委员会共谋数字发展新篇章

近年来,元宇宙产业呈现出飞速发展的趋势,成为全球范围内备受瞩目的新兴行业。在这个充满机遇与挑战的时代,常州神由之星数字信息产业发展有限公司凭借敏锐的洞察力和卓越的数字产品,迅速抓住元宇宙的发展势头,大力发展元宇宙业务,成为该领域内一颗冉冉升起的新星。 神由之星荣膺…

数据分享 I 全国市级商品房屋销售数据,shp/excel格式,2005-2020年数据

基本信息. 数据名称: 全国市级商品房屋销售数据 数据格式: Shp、excel 数据时间: 2005-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1spxse商品房销售额&#xff08;亿元&#xf…

优思学院|如何建立公司运营指标体系?如何推行六西格玛改进运营指标?

关键绩效指标 (KPI) 是测量您团队或组织朝重要商业目标进展表现如何的量化指标&#xff0c;组织会在多个层面使用 KPI&#xff0c;这视乎您想要追踪何指标而定&#xff0c;您可以设定全组织的、特定团队的、或甚至是个人 KPI。 良好的KPI能让公司管理者掌握组织的营运是否进度…

在设计和考虑建造室外雨水收集池时需要注意的因素

在设计和建造室外雨水收集池时&#xff0c;需要考虑以下因素&#xff1a; 地质条件&#xff1a;建造雨水收集池需要考虑到地质条件&#xff0c;例如土壤类型、地基承载能力等。这些因素可能对水池的建造和结构产生影响。 气候条件&#xff1a;不同地区的降雨量、湿度、气温等…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

node.js express mongoose用户建模、权限校验

目录 userModel.js 依赖引入 数据建模 中间件 模型方法 创建user model并导出 catchAsync.js authController.js 依赖引入 token生成 注册 登录 密码修改 userRoutes.js 路由设计 protect中间件 角色中间件 app.js userModel.js 依赖引入 const mongoose …

解决canvas清晰度问题devicePixelRatio

视频教程 解决canvas清晰度的问题【渡一教育】_哔哩哔哩_bilibili 检测网页本身是否缩放 ,即缩放倍率 window.devicePixelRatio 为了获得清晰图像,需要遵循以下公式 原始尺寸样式尺寸*缩放倍率 在项目中,canvas里的原始尺寸一般与css中的样式尺寸一样,所以在写js代码时,涉…

纯电超跑SUV获得2024中国年度性能车大奖 路特斯ELETRE实力几何?

2023年12月5日&#xff0c;“中国年度车”颁奖盛典在北京圆满落幕。路特斯首款纯电超跑SUV ELETRE ( 参数询价 ) 斩获“2024中国年度性能车”大奖&#xff0c;成为首次获此殊荣的纯电SUV车型。一台纯电SUV能获得年度性能车奖项&#xff0c;注定是件非常有看点的事&#xff0c;那…

17.(vue3.x+vite)组件间通信方式之作用域插槽

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 作用域插槽 父组件中的插槽内容是无法访问到子组件中的数据的,而作用域插槽就是解决获取子组件数据。 父组件代码 <template><div><div>父组件--Hello World!</div><Child>