【深度学习】一维数组的 K-Means 聚类算法理解

news2024/11/23 4:38:57

刚看了这个算法,理解如下,放在这里,备忘,如有错误的地方,请指出,谢谢

需要做聚类的数组我们称之为【源数组】

需要一个分组个数K变量来标记需要分多少个组,这个数组我们称之为【聚类中心数组】及

一个缓存临时聚类中心的数组,我们称之为【缓存聚类中心数组】

然后初始化一个K长度的数组,值随机(尽量分布在原数组的更大的区间以便计算),用于和源数组进行比对计算。

下面是计算的部分:

死循环遍历对源数据进行分组。

分组内遍历原数组的每个元素与聚类中心的每个元素的距离(差值的绝对值),将最小距离的聚类中心数组下标缓存的临时变量临时变量数组A中(长度=原数组),

创建二维数组,我们称之为【分组数组】 [聚类中心数组长度][源数组中分类的值],

遍历临时变量数组A,使用A的小标拿到原数组对应的值,赋值给分组数组。

具体公式如:

分组数组[A[i]].add(原数组[i]);

返回分组数组

对分组后的数组计算中间值存入缓存聚类中心数组,比较缓存剧烈数组和聚类数组,是否位置一样,值一样,如果一样跳出死循环,分类结束,

否则将临时剧烈中心数组赋值给聚类中心数组进行下次循环

  
  
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace K_MeansTest
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. double[] p = { 1, 2, 3, 5, 6, 7, 9, 10, 11,20,21,22,23,27,40,41,42,43,61,62,63, 100, 150, 200, 1000 };
  13. int k = 5;
  14. double[][] g;
  15. g = cluster(p, k);
  16. for (int i = 0; i < g.Length; i++)
  17. {
  18. for (int j = 0; j < g[i].Length; j++)
  19. {
  20. Console.WriteLine(g[i][j]);
  21. }
  22. Console.WriteLine(“----------------------”);
  23. }
  24. Console.ReadKey();
  25. }
  26.  
  27. /*
  28. * 聚类函数主体。
  29. * 针对一维 double 数组。指定聚类数目 k。
  30. * 将数据聚成 k 类。
  31. /
  32. public static double[][] cluster(double[] p, int k)
  33. {
  34. // 存放聚类旧的聚类中心
  35. double[] c = new double[k];
  36. // 存放新计算的聚类中心
  37. double[] nc = new double[k];
  38. // 存放放回结果
  39. double[][] g;
  40. // 初始化聚类中心
  41. // 经典方法是随机选取 k 个
  42. // 本例中采用前 k 个作为聚类中心
  43. // 聚类中心的选取不影响最终结果
  44. for (int i = 0; i < k; i++)
  45. c[i] = p[i];
  46. // 循环聚类,更新聚类中心
  47. // 到聚类中心不变为止
  48. while (true)
  49. {
  50. // 根据聚类中心将元素分类
  51. g = group(p, c);
  52. // 计算分类后的聚类中心
  53. for (int i = 0; i < g.Length; i++)
  54. {
  55. nc[i] = center(g[i]);
  56. }
  57. // 如果聚类中心不同
  58. if (!equal(nc, c))
  59. {
  60. // 为下一次聚类准备
  61. c = nc;
  62. nc = new double[k];
  63. }
  64. else // 聚类结束
  65. break;
  66. }
  67. // 返回聚类结果
  68. return g;
  69. }
  70. /
  71. * 聚类中心函数
  72. * 简单的一维聚类返回其算数平均值
  73. * 可扩展
  74. /
  75. public static double center(double[] p)
  76. {
  77. return sum(p) / p.Length;
  78. }
  79. /
  80. * 给定 double 型数组 p 和聚类中心 c。
  81. * 根据 c 将 p 中元素聚类。返回二维数组。
  82. * 存放各组元素。
  83. /
  84. public static double[][] group(double[] p, double[] c)
  85. {
  86. // 中间变量,用来分组标记
  87. int[] gi = new int[p.Length];
  88. // 考察每一个元素 pi 同聚类中心 cj 的距离
  89. // pi 与 cj 的距离最小则归为 j 类
  90. for (int i = 0; i < p.Length; i++)
  91. {
  92. // 存放距离
  93. double[] d = new double[c.Length];
  94. // 计算到每个聚类中心的距离
  95. for (int j = 0; j < c.Length; j++)
  96. {
  97. d[j] = distance(p[i], c[j]);
  98. }
  99. // 找出最小距离
  100. int ci = min(d);
  101. // 标记属于哪一组
  102. gi[i] = ci;
  103. }
  104. // 存放分组结果
  105. double[][] g = new double[c.Length][];
  106. // 遍历每个聚类中心,分组
  107. for (int i = 0; i < c.Length; i++)
  108. {
  109. // 中间变量,记录聚类后每一组的大小
  110. int s = 0;
  111. // 计算每一组的长度
  112. for (int j = 0; j < gi.Length; j++)
  113. if (gi[j] i)
  114. s++;
  115. // 存储每一组的成员
  116. g[i] = new double
    展开 收缩
    ;
  117. s = 0;
  118. // 根据分组标记将各元素归位
  119. for (int j = 0; j < gi.Length; j++)
  120. if (gi[j] i)
  121. {
  122. g[i]
    展开 收缩
    = p[j];
  123. s++;
  124. }
  125. }
  126. // 返回分组结果
  127. return g;
  128. }
  129.  
  130. /
  131. * 计算两个点之间的距离, 这里采用最简单得一维欧氏距离, 可扩展。
  132. /
  133. public static double distance(double x, double y)
  134. {
  135. return Math.Abs(x - y);
  136. }
  137.  
  138. /
  139. * 返回给定 double 数组各元素之和。
  140. /
  141. public static double sum(double[] p)
  142. {
  143. double sum = 0.0;
  144. for (int i = 0; i < p.Length; i++)
  145. sum += p[i];
  146. return sum;
  147. }
  148.  
  149. /
  150. * 给定 double 类型数组,返回最小值得下标。
  151. /
  152. public static int min(double[] p)
  153. {
  154. int i = 0;
  155. double m = p[0];
  156. for (int j = 1; j < p.Length; j++)
  157. {
  158. if (p[j] < m)
  159. {
  160. i = j;
  161. m = p[j];
  162. }
  163. }
  164. return i;
  165. }
  166.  
  167. /
  168. * 判断两个 double 数组是否相等。 长度一样且对应位置值相同返回真。
  169. */
  170. public static bool equal(double[] a, double[] b)
  171. {
  172. if (a.Length != b.Length)
  173. return false;
  174. else
  175. {
  176. for (int i = 0; i < a.Length; i++)
  177. {
  178. if (a[i] != b[i])
  179. return false;
  180. }
  181. }
  182. return true;
  183. }
  184. }
  185. }

结果如下

一维数组的 K-Means 聚类算法理解

 

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

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

相关文章

网络基础---网络层详解(图文清晰易懂!!!)

目录 一、网络层的功能 二、IP数据包的格式 三、ICMP协议 1.ICMP协议的概念和作用 2.ping命令 2.1 ping 的格式 2.2 ping选项 2.3 当我们ping不通时&#xff0c;及服务器出现问题&#xff0c;如何排错 2.4 信息传递时出现的问题类型和具体情况 四、冲突域和广播域 1.…

STM32--GPIO点亮LED灯(手把手,超详细)

写在前面&#xff1a;在前面的学习中&#xff0c;我们学习了STM32的编译环境&#xff08;MDK&#xff09;、时钟树以及GPIO的8种工作模式&#xff1b;这节我们学习正式入门STM32---点亮第一个LED灯&#xff1b;即利用GPIO进行电灯&#xff0c;尽管是一个十分简单的实现&#xf…

2020年第九届数学建模国际赛小美赛A题自由泳解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 A题 自由泳 原题再现&#xff1a; 在所有常见的游泳泳姿中&#xff0c;哪一种最快&#xff1f;哪个冲程推力最大&#xff1f;在自由泳项目中&#xff0c;游泳者可以选择他们的泳姿&#xff0c;他们通常选择前面的爬行。然而&#xff0c;游泳…

知识付费商城7.0.3开心学习版,新增供货商功能

彩虹知识付费商城7.0.3小森升级版新增供货商开心学习版。仅供开发参考&#xff0c;切勿正式商用。 1.新增邮件提醒功能&#xff0c;支持给用户发订单、结算等邮件通知 2.支持给管理员发送提现、域名审核等邮件通知 3.支持设置手续费最低扣除金额 4.修复了其他一些已知问题 …

激光雷达标定板提高扫地机器人感知环境能力和清洁效率

智能扫地机器人的激光雷达标定板是一种用于校准激光雷达的设备&#xff0c;它通常由不同反射率的涂料涂覆在板面上&#xff0c;用于接收激光雷达发出的激光束并将其反射回来&#xff0c;从而帮助校准激光雷达的测量参数。在自动驾驶和机器人领域&#xff0c;激光雷达和相机的联…

HDFS Java API 基本操作实验

文章目录 一、实验环境二、实验内容&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;编程环境准备&#xff08;三&#xff09;使用Hadoop API操作HDFS文件系统&#xff08;四&#xff09;使用Hadoop API Java IO流操作HDFS文件系统 三、实验步骤&#xff08;一&…

OpenCL学习笔记(二)手动编译开发库(win10+vs2019)

前言 有时需求比较特别&#xff0c;可能需要重新编译opencl的sdk库。本文档简单记录下win10下&#xff0c;使用vs2019编译的过程&#xff0c;有需要的小伙伴可以参考下 一、获取源码 项目地址&#xff1a;GitHub - KhronosGroup/OpenCL-SDK: OpenCL SDK 可以直接使用git命令…

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、剑指offer每日一练 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️寻找文件副本(题目难度&#xff1a;简单)1.1 题目1.2 示例1.3 限制1.4 解题思路一c代…

2023年第一次系统架构师备考经历

12月7日成绩已经出来&#xff0c;果然最担心的案例分析没有过&#xff0c;才考了40分&#xff0c;还差5分&#xff0c;我就可以一次拿下证书&#xff0c;好可惜啊&#xff0c;今年的题出的有点偏&#xff0c;大数据居然成为必答题&#xff0c;平常是搞Java&#xff0c;大数据方…

做抖店代发,新手如何定类目?五大类目优缺点分析!

我是电商珠珠 类目是店铺的方向&#xff0c;只有将店铺的定位确定好&#xff0c;才能超越大部分的同行。 我经常跟我的学生讲&#xff0c;选择类目的时候不能瞎选&#xff0c;要学会去分析市场&#xff0c;由于大部分的学员前期都是新手小白&#xff0c;所以我们这边会负责给…

[Linux] 用LNMP网站框架搭建论坛

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守护进程 它是php.ini是一个php解析器 工作过程&#xff1a; 1.当客户端通过域名请求访问时&#xff0c;Nginx会找到对应的虚拟主机 2. Nginx将确定请求。 对于静态请求&#xff0c;Nginx会自行处理…

听GPT 讲Rust源代码--src/tools(9)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/apply_demorgan.rs 在Rust源代码中&#xff0c;apply_demorgan.rs文件位于rust-analyzer工具的ide-assists库中&#xff0c;其作用是实现一个辅助函数&#xff0c;用于在代码中应用De Morgan定律的变换。 …

第二十一章网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissi…

SPRD Android 13 下拉状态栏菜单添加静音快捷键简单记录

SPRD Android 13 下拉状态栏菜单添加静音快捷键简单记录 需要修改文件具体修改补丁吐槽需要修改文件 frameworks/base/packages/SystemUI/res/values/config.xml frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java frameworks/base…

Java入门 EditPlus的安装与配置讲解

写Java程序不建议使用EditPlus&#xff0c;首选idea社区版&#xff0c;其次是vscode&#xff0c; 然后是eclipse 。editplus说实话排不上号。 但既然小伙伴想了解一下怎么配置&#xff0c;这里就简单说一下。 下载 首先是jdk&#xff0c;jdk是Java开发和运行的基础&#xff…

【MySQL】:库的操作

库的操作 一.创建和删除数据库二.认识编码三.库的查改1.查找2.修改 四.库的备份和恢复1.备份2.还原 一.创建和删除数据库 说明&#xff1a; 1.大写的表示关键字 2.[] 是可选项 3.CHARACTER SET: 指定数据库采用的字符集 4.COLLATE: 指定数据库字符集的校验规则首先进入MySQL 创…

Verilog基础:时序调度中的竞争(三)(#0的使用)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 作为一个硬件描述语言&#xff0c;Verilog HDL常常需要使用语句描述并行执行的电路&#xff0c;但其实在仿真器的底层&#xff0c;这些并行执行的语句是有先后顺…

IDEA构建springBoot新项目时JDK只有17和21,无法选择JDK8解决方案

今天创建springboot新项目时&#xff0c;发现IDEA里JDK选项只有17和21&#xff0c;无法选择本机的JDK8&#xff0c;网上查资料后发现是springboot2.7于11.24号后停止维护&#xff0c;基于2.7和java8的spring Initializ官方不再维护&#xff0c;解决方案是在server URL栏&#x…

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

【项目资源下载】 本篇配套直接打开可用的项目包地址,欢迎下载: https://download.csdn.net/download/weixin_41697242/88612084 【背景】 想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。 【要求】 平台:基本常用平台…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…