【深度学习】一维数组的 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 聚类算法理解

 

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

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

相关文章

IO多路转接之select

IO多路转接之select 1. IO多路转接&#xff08;复用&#xff09;2. select2.1 函数原型2.2 细节描述 3. 并发处理3.1 处理流程3.2 通信代码 原文链接 1. IO多路转接&#xff08;复用&#xff09; IO多路转接也称为IO多路复用&#xff0c;它是一种网络通信的手段&#xff08;机…

【目标检测算法】IOU、GIOU、DIOU、CIOU

目录 参考链接 前言 IOU(Intersection over Union) 优点 缺点 代码 存在的问题 GIOU(Generalized Intersection over Union) 来源 GIOU公式 实现代码 存在的问题 DIoU(Distance-IoU) 来源 DIOU公式 优点 实现代码 总结 参考链接 IoU系列&#xff08;IoU, GIoU…

WPF使用WebBrowser报脚本错误问题处理

前言 WPF使用WebBrowser报脚本错误问题处理,我们都知道WPF自带的WebBrowser都用的IE内核,但是在特殊的条件下我们还需要用到它,比如展示纯html简单的页面。再展示主流页面的时候比如用到Jquery高级库或者VUE等当前主流站点时经常就会报JS脚本错误,在Winform里面我们一句代…

【精选】设计模式——工厂设计模式

工厂设计模式是一种创建型设计模式&#xff0c;其主要目的是通过将对象的创建过程封装在一个工厂类中来实现对象的创建。这样可以降低客户端与具体产品类之间的耦合度&#xff0c;也便于代码的扩展和维护。 工厂设计模式&#xff1a; 以下是Java中两个常见的工厂设计模式示例…

C++ 关于结构体struct的一些总结

文章目录 一、 结构体(struct)是什么&#xff1f;&#xff08;1&#xff09;概念&#xff08;2&#xff09;struct 与 calss 的区别 二、定义、声明与初始化&#xff08;1&#xff09;三种定义结构体的方法&#xff1a;&#xff08;2&#xff09;结构体变量初始化 三、结构体嵌…

C++实现进程端口网络数据接收系统设计示例程序

一、问题描述 最近做了一道简单的系统设计题&#xff0c;大概描述如下&#xff1a; 1.一个进程可以绑定多个端口&#xff0c;用于监听接收网络中的数据&#xff0c;但是一个端口只能被一个进程占用 2.1 < pid < 65535, 1 < port < 100000, 1 < topNum < 5, …

C++:vector增删查改模拟实现

C:vector增删查改模拟实现 前言一、迭代器1.1 非const迭代器&#xff1a;begin()、end()1.2 const迭代器&#xff1a;begin()、end() 二、构造函数、拷贝构造函数、赋值重载、析构函数模拟实现2.1 构造函数2.1.1 无参构造2.1.2 迭代器区间构造2.1.3 n个值构造 2.2 拷贝构造2.3 …

vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)

目录 一、什么是Vue路由导航守卫&#xff1f; 二、全局守卫 1、beforeEach 下面是一个beforeEach的示例代码&#xff1a; 2、beforeResolve 下面是一个beforeResolve的示例代码&#xff1a; 3、afterEach 下面是一个afterEach的示例代码&#xff1a; 三、路由独享守卫…

044:vue中引用json数据的方法

第044个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

多相Buck的工作原理

什么是多相Buck电源&#xff1f; 多相电源控制器是一种通过同时控制多个电源相位的设备&#xff0c;以提供稳定的电力供应。相位是指电源中的电流和电压波形。多相控制器的设计旨在最大程度地减小电力转换系统的纹波&#xff0c;并提高整体能效。它通常包含一系列的功率级联&a…

结构化布线系统

满足下列需求&#xff1a; 1.标准化&#xff1a;国际、国家标准。 2.实用性&#xff1a;针对实际应用的需要和特点来建设系统。 3.先进性&#xff1a;采用国际最新技术。5-10年内技术不落后。 4.开放性&#xff1a;整个系统的开放性。 5.结构化、层次化&#xff1a;易于管理和维…

Matplotlib数据可视化

绘图基础语法 &#xff11; 创建画布并且创建子图 首先创建一个空白的画布&#xff0c;并且可以将画布分为几个部分&#xff0c;这样就可以在同一附图上绘制多个图像。 plt.figure 创建一个空白画布&#xff0c;可以指定画布大小、像素 figure.add_subplot 创建并且选中子…

【web安全】文件读取与下载漏洞

前言 菜某整理仅供学习&#xff0c;有误请赐教。 概念 个人理解&#xff1a;就是我们下载一个文件会传入一个参数&#xff0c;但是我们可以修改参数&#xff0c;让他下载其他的文件。因为是下载文件&#xff0c;所以我们可以看到文件里面的源码&#xff0c;内容。 文件读取…

swiftUi——颜色

在SwiftUI中&#xff0c;您可以使用Color结构来表示颜色。Color可以直接使用预定义的颜色&#xff0c;例如.red、.blue、.green等&#xff0c;也可以使用自定义的RGB值、十六进制颜色代码或者系统提供的颜色。 1. 预定义颜色 Text("预定义颜色").foregroundColor(.…

Swing程序设计(9)复选框,下拉框

文章目录 前言一、复选框二、下拉框总结 前言 该篇文章简单介绍了Java中Swing组件里的复选框组件、列表框组件、下拉框组件&#xff0c;这些在系统中都是常用的组件。 一、复选框 复选框&#xff08;JCheckBox&#xff09;在Swing组件中的使用也非常广泛&#xff0c;一个方形方…

hadoop安装与配置-shell脚本一键安装配置(集群版)

文章目录 前言一、安装准备1. 搭建集群 二、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 加载用户环境变量 三、启动与停止1. 启动/停止hadoop集群(1) 复制hadoop集群启动脚本(2) 增加执行权限(3) 启动hadoop集群(4) 停止hadoop集群(5) 重启hado…

智慧社区前景无限,科技引领未来发展

社区是城镇化发展的标志&#xff0c;作为人类现代社会的生活的基本圈子&#xff0c;是人类生活离不开的地方&#xff0c;社区人口密度大、车辆多&#xff0c;管理无序&#xff0c;社区的膨胀式发展多多少少带来一定的管理上的缺失。社区作为智慧城市建设的重要一环&#xff0c;…

编译基于LIO-SAM的liorf“Large velocity, reset IMU-preintegration!“

使用LIO-SAM修改的代码liorf&#xff08;因自己使用的IMU传感器是 6-axis ouster&#xff09;&#xff1a; LIO-SAM代码连接&#xff1a; https://github.com/TixiaoShan/LIO-SAM liorf代码连接&#xff1a; https://github.com/YJZLuckyBoy/liorf 编译运行出现错误&#…

eve-ng山石网科HillStone镜像部署

HillStone 部署 author&#xff1a;leadlife data&#xff1a;2023/12/4 mains&#xff1a;EVE-ng HillStone 镜像部署 - use hillstone-sg6000 default&#xff1a;hillstone/hillstone 传输 scp hillstone-sg6000.zip root192.168.3.130:/opt/unetlab/addons/qemu/部署 cd …

echarts绘制一个环形图

其他echarts&#xff1a; echarts绘制一个柱状图&#xff0c;柱状折线图 echarts绘制一个饼图 echarts绘制一个环形图2 效果图&#xff1a; 代码&#xff1a; <template><div class"wrapper"><!-- 环形图 --><div ref"doughnutChart…