【深度學習】一維數組的 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.pswp.cn/news/208971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208971.shtml
英文地址,請注明出處:http://en.pswp.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()…