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

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

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

需要一个分组个数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 聚类算法理解

 

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

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

相关文章

Kafka快速实战以及基本原理详解

文章目录 一、Kafka介绍为什么要用Kafka 二、Kafka快速上手实验环境单机服务体验 三、理解Kakfa的消息传递机制四、Kafka集群服务五、理解服务端的Topic、Partition和Broker七、Kafka集群的整体结构八、Kraft集群Kraft集群简介配置Kraft集群 一、Kafka介绍 ChatGPT对于Apache …

人体关键点检测1:人体姿势估计数据集

人体关键点检测1&#xff1a;人体姿势估计数据集 目录 人体关键点检测1&#xff1a;人体姿势估计数据集 1.人体姿态估计 2.人体姿势估计数据集 &#xff08;1&#xff09;COCO数据集 &#xff08;2&#xff09;MPII数据集 &#xff08;3&#xff09;Human3.6M &#xf…

CENTOS 7 添加黑名单禁止IP访问服务器

一、通过 firewall 添加单个黑名单 只需要把ip添加到 /etc/hosts.deny 文件即可&#xff0c;格式 sshd:$IP:deny vim /etc/hosts.deny# 禁止访问sshd:*.*.*.*:deny# 允许的访问sshd:.*.*.*:allowsshd:.*.*.*:allow 二、多次失败登录即封掉IP&#xff0c;防止暴力破解的脚本…

【解决办法】Pycharm中新添加或者导入项目文件名红色!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、问题描述二、问题原因三、解决办法 一、问题描述 Pycharm的代码中添加新的文件夹&#xff0c;发现文件夹下的文件名是红色的&#xff0c;如下图&#xff1a; …

视频推拉流直播点播EasyDSS平台点播文件加密存储的实现方法

视频推拉流直播点播系统EasyDSS平台&#xff0c;可提供流畅的视频直播、点播、视频推拉流、转码、管理、分发、录像、检索、时移回看等功能&#xff0c;可兼容多操作系统&#xff0c;还能支持CDN转推&#xff0c;具备较强的可拓展性与灵活性&#xff0c;在直播点播领域具有广泛…

设计模式基础——概述(1/2)

目录 一、设计模式的定义 二、设计模式的三大类别 三、设计模式的原则 四、主要设计模式目录 4.1 创建型模式&#xff08;Creational Patterns&#xff09; 4.2 结构型模式&#xff08;Structural Patterns&#xff09; 4.3 行为型模式&#xff08;Behavioral Patterns&…

5.10 Windows驱动开发:摘除InlineHook内核钩子

在笔者上一篇文章《内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩&#xff0c;对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能&#xff0c;此类功能的实现一般可在应用层进行&#xff0c;而驱动层只需要保留一个读写字节的函数即可…

Numpy数组的重塑,转置与切片 (第6讲)

Numpy数组的重塑,转置与切片 (第6讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

如何将腾讯混元大模型AI接入自己的项目里(中国版本ChatGPT)

如何将腾讯混元大模型AI接入自己的项目里 一、腾讯混元大模型API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、腾讯混元大模型API 基于腾讯混元大模型AI的智能文本对话AI机器人…

uniapp 数组添加不重复元素

一、效果图 二、代码 //点击事件rightBtn(sub, index) {console.log(sub, index)//uniapp 数组添加不重复元素if (this.selectList.includes(sub.type)) {this.selectList this.selectList.filter((item) > {return item ! sub.type;});} else {this.selectList.push(sub.t…

长城之上的无人机:文化遗产的守护者

长城之上的无人机&#xff1a;文化遗产的守护者 在八达岭长城景区&#xff0c;两架无人机分别部署在了长城的南、北楼两点。根据当前的保护焦点和需求&#xff0c;制定了5条无人机综合巡查航线&#xff0c;以确保长城景区的所有开放区域都能得到有效监管。每天&#xff0c;无人…

【ITK库学习】使用itk库进行图像滤波ImageFilter:二阶微分

目录 1、itkRecursiveGaussianImageFliter 递归高斯滤波器2、itkLapacianRecursiveGaussianImageFiter 拉普拉斯高斯滤波器 1、itkRecursiveGaussianImageFliter 递归高斯滤波器 该类用于计算具有高斯核近似值的 IIR 卷积的基类。 该类是递归滤波器的基类&#xff0c;它与高斯…

MyBatis `saveBatch` 性能调优详解

文章目录 1. 引言2. MyBatis saveBatch 简介3. 常见性能问题3.1 SQL 语句拼接3.2 参数传递3.3 数据库连接数 4. MyBatis saveBatch 性能调优4.1 使用批量插入语句4.1.1 代码示例 4.2 使用MyBatis的foreach标签4.2.1 代码示例 4.3 使用VALUES构造器4.3.1 代码示例 4.4 调整批量大…

linux下部署frp客户端服务端-内网穿透

简介 部署在公司内部局域网虚拟机上的服务需要在外网能够访问到&#xff0c;这不就是内网穿透的需求吗&#xff0c;之前通过路由器实现过&#xff0c;现在公司这块路由器不具备这个功能了&#xff0c;目前市面上一些主流的内网穿透工具有&#xff1a;Ngrok&#xff0c;Natapp&…

【WPF.NET开发】WPF中的对话框

目录 1、消息框 2、通用对话框 3、自定义对话框 实现对话框 4、打开对话框的 UI 元素 4.1 菜单项 4.2 按钮 5、返回结果 5.1 模式对话框 5.2 处理响应 5.3 非模式对话框 Windows Presentation Foundation (WPF) 为你提供了自行设计对话框的方法。 对话框是窗口&…

HarmonyOS(鸿蒙操作系统)与Android系统 各自特点 架构对比 各自优势

综合对比 HarmonyOS&#xff08;鸿蒙操作系统&#xff09;是由华为开发的操作系统&#xff0c;旨在跨多种设备和平台使用。HarmonyOS的架构与谷歌开发的广泛使用的Android操作系统有显著不同。以下是两者之间的一些主要比较点&#xff1a; 设计理念和使用案例&#xff1a; Harm…

屏蔽百度首页推荐和热搜的实战方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C++STL的string(超详解)

文章目录 前言C语言的字符串 stringstring类的常用接口string类的常见构造string (const string& str);string (const string& str, size_t pos, size_t len npos); capacitysize和lengthreserveresizeresize可以删除数据 modify尾插插入字符插入字符串 inserterasere…

二分查找|前缀和|滑动窗口|2302:统计得分小于 K 的子数组数目

作者推荐 贪心算法LeetCode2071:你可以安排的最多任务数目 本文涉及的基础知识点 二分查找算法合集 题目 一个数组的 分数 定义为数组之和 乘以 数组的长度。 比方说&#xff0c;[1, 2, 3, 4, 5] 的分数为 (1 2 3 4 5) * 5 75 。 给你一个正整数数组 nums 和一个整数…

命令行参数(C语言)

目录 什么是命令行参数 main函数的可执行参数 不传参打印 传参打印 IDE传参 cmd传参 命令行参数的应用&#xff08;文件拷贝&#xff09; 什么是命令行参数 概念&#xff1a;命令行参数指的是在运行可执行文件时提供给程序的额外输入信息。它们通常以字符串形式出现&am…