机器学习知识总结——18.实现一个简单的K-Means聚类

news2024/9/28 16:54:14

文章目录

  • 引用库
  • 生成样本数据
  • 训练K-Means
  • 实验

在上一章节里简要的介绍了无监督学习中聚类的知识点,看的太多理论概念,难免会有点莫名其妙,现在就让我们来实现一个简单的 K-Means 算法,从而从原理上彻底弄明白聚类是怎么工作的。

引用库

我们还是像其他示例一样,尽量用最少的第三方库来阐述清楚问题,所以这里我们也只引用Numpy和绘图工具matplotlib

import numpy as np
import matplotlib as plt

生成样本数据

我们需要生成一些样本,于是继续用到 np.random.normal 用来生成正态分布数据。

# 生成样本数据
np.random.seed(0)
cluster1 = np.random.normal(3, 1, (100, 2))
cluster2 = np.random.normal(7, 1, (100, 2))
cluster3 = np.random.normal(11, 1, (100, 2))
X = np.concatenate((cluster1, cluster2, cluster3), axis=0)

训练K-Means

基本上我们需要实现的函数主要有三个,一个是样本到质心的距离计算函数,可以使用简单的欧式距离进行判断

# 计算每个样本到质心的距离
def distance(X, centers):
    dist = np.sqrt(np.sum((X[:, np.newaxis] - centers) ** 2, axis=-1))
    return dist

然后要随时更新质心

# 重新计算质心
def update_centers(X, labels, k):
    centers = np.array([X[labels == i].mean(axis=0) for i in range(k)])
    return centers

然后就是主要的 k-means 主函数了

# k-means 主函数
def kmeans(X, k, max_iter=100):
    centers = initial_centers
    for i in range(max_iter):
        dist = distance(X, centers)
        labels = np.argmin(dist, axis=-1)
        centers = update_centers(X, labels, k)
    return labels, centers

然后我们告诉程序,请帮我们把训练数据生成3类

# 实验
labels, centers = kmeans(X, 3)

得到的结果如下:

在这里插入图片描述

实验

为了验证我们的模型是否有能力对新的数据进行分类,我们使用随机数生成一个测试数据集,并实现了一个简单的预测函数

# 现在我们来开始做预测
def predict(X, centers):
    dist = np.sqrt(np.sum((X[:, np.newaxis] - centers) ** 2, axis=-1))
    return np.argmin(dist, axis=-1)

然后看看我们的结果是怎样
在这里插入图片描述

看来成功了,一个简单的聚类实现大致上就是上面这些代码所示范的过程,希望对你有所帮助。

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

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

相关文章

YOLO v2主要看这些重点

来源:投稿 作者:ΔU 编辑:学姐 往期内容: YOLOv1学习笔记 论文 《YOLO9000:Better, Faster, Stronger》 Joseph Redmon∗†, Ali Farhadi∗† University of Washington∗ , Allen Institute for AI† http://pjreddie.com/…

计算机视觉OpenCv学习系列:第五部分、颜色操作

第五部分、颜色操作第一节、颜色表操作1.查找表LUT(look up table)2.颜色查找表(1)Gamma校正(2)OpenCV默认的查找表3.代码练习与测试(1)多种颜色查找表(2)滚动条颜色查找表第二节、随…

23种设计模式(十四)——中介者模式【接口隔离】

文章目录 意图什么时候使用中介者真实世界类比中介者模式的实现中介者模式的优缺点亦称:调解人、控制器、Intermediary、Controller、Mediator 意图 用一个中介者对象来封装一系列的对象交互。使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间…

新书预告:人机环境系统智能

东方算计:象者,像也西方计算:逻辑 or 实证人工智能是数学物理的产物,而数学是不完备的,物理仍是在探索中,所以人工智能存在着先天不足,有着大量的脆弱和缺点,具体而言,包…

7、矩阵的创建

目录 一、希尔伯特(Hilbert)矩阵 二、托普利兹(Toeplitz)矩阵 三、0~1间均匀分布的随机矩阵 四、标准正态分布随机矩阵 五、魔方矩阵 六、帕斯卡矩阵 七、范德蒙(Vandermonde)矩阵 MATLA…

机器学习——基本概念

小谈:一直想整理机器学习的相关笔记,但是一直在推脱,今天发现知识快忘却了(虽然学的也不是那么深),但还是浅浅整理一下吧,便于以后重新学习。最近换到新版编辑器写文章了,有的操作挺…

跨平台freebasic集锦(1)-安装与概述

目录TIOBE Index for January 2023概述特点BASIC兼容性干净的语法多平台Unicode支持大量内置数据类型用户定义类型(UDT)默认过程参数值内联汇编Intel语法传统的预处理器支持调试支持创建OBJ、LIB、DLL和控制台或GUI EXE优化代码生成下载安装TIOBE Index …

Java设计模式-迭代器模式、迭代器模式是什么、怎么使用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 6.9 迭代器者模式 6.9.1 定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示 6.9.2 结构 抽象聚合(Aggregate)角色&a…

[创业之路-48] :动态股权机制 -3- 静态股权分配 VS 动态股权分配

静态的股权分配是基础,动态的股权分配才是灵魂:只要你给了固态股权,比如说,股东A在最开始出资100万,占了10%的股份,但是,在后面的工作种,因为能力问题,价值观问题&#x…

回收租赁商城系统功能拆解12讲-会员权益

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格,后台调整最终回收价,用户同意回收后系统即刻放款,用户微信零…

【自然语言处理】词袋模型在文本分类中的用法

词袋模型在文本分类中的用法1.加载数据 20 Newsgroups:数据被组织成 20 个不同的新闻组,每个新闻组对应一个不同的主题。一些新闻组彼此非常密切相关(例如 comp.sys.ibm.pc.hardware / comp.sys.mac.hardware),而其他…

云原生之Docker容器的存储管理

一、检查本地docker环境 1.检查宿主机系统版本 [rootdocker ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) 2.检查docker版本 [rootdocker ~]# docker -v Docker version 20.10.18, build b40c2f6二、创建一个测试httpd容器 1.创建测试目录 [rootdoc…

Python版本PathPlanning运动规划库中RotationToWorldFrame函数内部计算过程分析

本文主要对Python版本PathPlanning运动规划库中RotationToWorldFrame函数的内部计算过程分析,包括相关必备python基础和计算过程分析两部分,并给出了等效的MATLAB版本计算过程程序,方便分析对比。 (注:RotationToWorld…

【春节旅游攻略】南京周边出发,小众又好玩的景点推荐

【写在前面】 过年了,今天咱不谈技术,聊聊轻松的话题,旅游,其实博主很喜欢去外面走走看的,特汇总了一个4天3晚的旅行攻略,说走就走,带上自己的亲人多看看外面的锦世繁华。 三人行,…

使用最小二乘法和最大似然法估计非线性模型

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集本文是年前的最后一篇推文,我们来学习一下使用最小二乘法和最大似然法进行非线性模型估计。模型估计是指,在模型形式已知的情况下,求解出可以使已有数据与模型形式最大程度上相符…

【日常系列】LeetCode《28·动态规划3》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 二维数组中的路径问题 买卖股票的最佳时机 lc 62【剑指 098】【top100】&#xff1a;不同路径 https://leetcode.cn/problems/unique-paths/ 提示&#x…

分享优秀的视频地址

【2022 RISC-V中国峰会-芯来演讲合集】https://www.bilibili.com/video/BV1mV4y1W785?vd_source733efcf14020a43e7dac58e4c28ca0c8【计算机组成与设计&#xff1a;RISC-V【浙江大学】】https://www.bilibili.com/video/BV1tz411z7GN?vd_source733efcf14020a43e7dac58e4c28ca0…

【Dat图片的位异或解密】

文章目录 异或一、图片字节标识二、开始异或计算异或 异或(eor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为"⊕"&#xff0c;计算机符号为"eor"。其运算法则为: a⊕b (a ∧ b) ∨ (a ∧b) 如果a、b两个值不相同&#xff0c;则异或结果为1。…

Tkinter的Label与Button

Tkinter是Python的一个内置包&#xff0c;主要用于简单的界面设计&#xff0c;使用起来非常方便。 目录 一、创建界面 1. 具体步骤 1.1 导入tkinter包 1.2 tk.Tk()函数&#xff1a;创建一个主界面&#xff0c;并命名为root 1.3 root.title()函数&#xff1a;给root界面设置…

API 接口案例--基于 MySQL 数据库 + Express对外提供用户列表的 API 接口服务

API 接口案例1. 案例需求2. 主要的实现步骤3. 搭建项目的基本结构4. 创建基本的服务器5. 创建 db 数据库操作模块6. 创建 user_ctrl 模块7. 创建 user_router 模块8. 导入并挂载路由模块9. 使用 try…catch 捕获异常1. 案例需求 基于 MySQL 数据库 Express 对外提供用户列表的…