【深度学习】一维数组的 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,一经查实,立即删除!

相关文章

mysql中count(*)、count(1)、count(主键)、count(字段)的区别

文章目录 count函数的语义count(主键)count(1)count(*)count(字段)替代方案explain或者show table status中间表或者其他数据库计数 以下分析都是基于 select count(?) from table 这个语句来分析&#xff0c;不带过滤条件。 count函数的语义 count() 是一个聚合函数&#x…

BFC(Block Formatting Contexts)块级格式化上下文

块格式化上下文&#xff08;block formatting context&#xff09; 是页面上的一个独立的渲染区域&#xff0c;容器里面的子元素不会在布局上影响到外面的元素。它是决定块盒子的布局及浮动元素相互影响的一个因素。 下列情况将创建一个块格式化上下文&#xff1a; 使用float…

阿里云轻量应用服务器与云服务器ECS对比

与云服务器ECS相比&#xff0c;轻量应用服务器使用门槛较低&#xff0c;配置简便&#xff0c;能让您快速上手并部署简单的应用或网站&#xff0c;更适合个人开发者、学生等用户。本文介绍轻量应用服务器与云服务器ECS的特点和区别。 产品对比 轻量应用服务器与云服务器ECS的产…

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;机…

算法训练营Day10(栈和队列)

理论知识 java语言的栈和队列。这篇文章总结的不错 http://t.csdnimg.cn/cOC8q 232.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; public class MyQueue {// 3 4// in// out 4 3Stack<Integer> in;Stack<Integer> out;public My…

C# 计算两个日期的相差天数

string str1 "2017-2-13 23:59:59"; string str2 "2017-2-14 0:00:01"; DateTime d1 Convert.ToDateTime(str1); DateTime d2 Convert.ToDateTime(str2); Console.WriteLine(d1.Date); Console.WriteLine(DateTime.Now);//当前时间 Console.WriteLine(…

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

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

kubernetes的服务发现(二)

如前面的文章我们说了&#xff0c;kubernetes的服务发现是服务端发现模式。它有一个服务注册中心&#xff0c;使用DNS作为服务的注册表。每个集群都会运行一个DNS服务&#xff0c;默认是CoreDNS服务。每个服务都会在这个DNS中注册。注册的大致过程&#xff1a; 1、向kube-apise…

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, …

ros2/ros安装ros-dep||rosdep init错误

第一个错误的做法&#xff1a; sudo apt-get install python3-pip sudo pip3 install 6-rosdep sudo 6-rosdep 如果使用上述代码将会摧毁整个系统&#xff0c;不重装系统反正我是搞不定啊&#xff0c;因为我不知道那个写软件的人到底做了什么。因为这个我安装的版本是humble&…

AlexNet 阅读笔记

“ImageNet Classification with Deep Convolutional Neural Networks” (Krizhevsky 等, 2012, p. 1) 使用深度卷积神经网络进行 ImageNet 分类 3公式&#xff0c;26个引用&#xff0c;4张图片&#xff0c;2个简单表格 Abstract 我们训练了一个大型深度卷积神经网络&#…

Leetcode刷题详解——环绕字符串中唯一的子字符串

1. 题目链接&#xff1a;467. 环绕字符串中唯一的子字符串 2. 题目描述&#xff1a; 定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串&#xff0c;所以 base 看起来是这样的&#xff1a; "...zabcdefghijklmnopqrstuvwxyzabcdefghijklm…

卷积之后通道数为什么变了

通道数增多与卷积之后得到的图像特征数量有关 卷积层的作用本来就是把输入中的特征分离出来变成新的 feature map&#xff0c;每一个输出通道就是一个卷积操作提取出来的一种特征。在此过程中ReLU激活起到过滤的作用&#xff0c;把负相关的特征点去掉&#xff0c;把正相关的留…

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; 三、路由独享守卫…

Shell - 学习笔记 - 1.14 - 如何编写自己的Shell配置文件(配置脚本)?

第1章 Shell基础(开胃菜) 14 - 如何编写自己的Shell配置文件(配置脚本)? 学习了《Shell配置文件的加载》一节,读者应该知道 Shell 在登录和非登录时都会加载哪些配置文件了。对于普通用户来说,也许 ~/.bashrc 才是最重要的文件,因为不管是否登录都会加载该文件。 我们…

【数据处理】NumPy数组的合并操作,如何将numpy数组进行合并?

&#xff0c;NumPy中的合并操作是指将两个或多个数组合并成一个数组的操作。这种操作可以通过不同的函数来实现。 一、横向合并&#xff08;水平合并&#xff09; 横向合并是指将两个具有相同行数的数组按列方向合并成一个数组的操作。在NumPy中&#xff0c;可以使用hstack()…