精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

手擼Golang 基本數據結構與算法 k-means聚類算法

開發 前端 算法
最近閱讀<<我的第一本算法書>>(【日】石田保輝;宮崎修一)本系列筆記擬采用golang練習之k-means聚類算法。

緣起

最近閱讀<<我的第一本算法書>>(【日】石田保輝;宮崎修一)

本系列筆記擬采用golang練習之

k-means聚類算法

聚類就是在輸入為多個數據時, 將“相似”的數據分為一組的操作。 k-means算法是聚類算法中的一種。 首先隨機選擇k個點作為簇的中心點, 然后重復執行“將數據分到相應的簇中”和 “將中心點移到重心的位置”這兩個操作, 直到中心點不再發生變化為止。 k-means算法中,隨著操作的不斷重復, 中心點的位置必定會在某處收斂, 這一點已經在數學層面上得到證明。 摘自 <<我的第一本算法書>> 【日】石田保輝;宮崎修一

場景

  • 某地突然爆發新冠疫情, 現防疫急需根據病例分布, 查找可能的病源地
  • 首先將病例分布的坐標, 錄入系統
  • 然后根據k-means算法, 按k從1到3, 分別進行聚類
  • 聚類的中心點, 可能就是病源地

流程

  1. 給定若干樣本, 和樣本距離計算器, 需要求解k個樣本中心點
  2. 首先從樣本中隨機抽取k個點, 作為中心點
  3. 循環每個樣本

    1. 分別計算樣本點到k個中心點的距離
    2. 判斷距離樣本點最小的中心點
    3. 將樣本劃分到該最小中心點的簇
  4. 計算每個簇的中心點, 作為新的中心點

    1. 循環簇中的每個樣本
    2. 計算該樣本, 到本簇其他樣本的距離之和
    3. 與其他樣本的距離和最小的點, 就是新的中心點
  5. 重復3-4, 直到中心點不再變化, 計算完畢

設計

  • IPoint: 樣本點接口, 其實是一個空接口
  • IDistanceCalculator: 距離計算器接口
  • IClassifier: 分類器接口, 將samples聚類成k個, 并返回k個中心點
  • tPerson: 病例樣本點, 實現IPoint接口, 含x,y坐標
  • tPersonDistanceCalculator: 病例距離計算器, 計算兩點間x,y坐標的直線距離
  • tKMeansClassifier: k-means聚類器, 實現IClassifier接口.

單元測試

k_means_test.go

  1. package others 
  2.  
  3. import ( 
  4.     km "learning/gooop/others/k_means" 
  5.     "strings" 
  6.     "testing" 
  7.  
  8. func Test_KMeans(t *testing.T) { 
  9.     // 創建樣本點 
  10.     samples := []km.IPoint { 
  11.         km.NewPerson(211), 
  12.         km.NewPerson(28), 
  13.         km.NewPerson(26), 
  14.  
  15.         km.NewPerson(312), 
  16.         km.NewPerson(310), 
  17.  
  18.         km.NewPerson(47), 
  19.         km.NewPerson(43), 
  20.  
  21.         km.NewPerson(511), 
  22.         km.NewPerson(59), 
  23.         km.NewPerson(52), 
  24.  
  25.         km.NewPerson(79), 
  26.         km.NewPerson(76), 
  27.         km.NewPerson(73), 
  28.  
  29.         km.NewPerson(812), 
  30.  
  31.         km.NewPerson(93), 
  32.         km.NewPerson(95), 
  33.         km.NewPerson(910), 
  34.  
  35.         km.NewPerson(103), 
  36.         km.NewPerson(106), 
  37.         km.NewPerson(1012), 
  38.  
  39.         km.NewPerson(119), 
  40.     } 
  41.  
  42.     fnPoints2String := func(points []km.IPoint) string { 
  43.         items := make([]string, len(points)) 
  44.         for i,it := range points { 
  45.             items[i] = it.String() 
  46.         } 
  47.         return strings.Join(items, " "
  48.     } 
  49.  
  50.     for k:=1;k<=3;k++ { 
  51.         centers := km.KMeansClassifier.Classify(samples, km.PersonDistanceCalculator, k) 
  52.         t.Log(fnPoints2String(centers)) 
  53.     } 

測試輸出

  1. $ go test -v k_means_test.go  
  2. === RUN   Test_KMeans 
  3.     k_means_test.go:53: p(7,6
  4.     k_means_test.go:53: p(5,9) p(7,3
  5.     k_means_test.go:53: p(9,10) p(3,10) p(7,3
  6. --- PASS: Test_KMeans (0.00s) 
  7. PASS 
  8. ok      command-line-arguments  0.002s 

IPoint.go

樣本點接口, 其實是一個空接口

  1. package km 
  2.  
  3. import "fmt" 
  4.  
  5. type IPoint interface { 
  6.     fmt.Stringer 

IDistanceCalculator.go

距離計算器接口

  1. package km 
  2.  
  3. type IDistanceCalculator interface { 
  4.     Calc(a, b IPoint) int 

IClassifier.go

分類器接口, 將samples聚類成k個, 并返回k個中心點

  1. package km 
  2.  
  3. type IClassifier interface { 
  4.     // 將samples聚類成k個, 并返回k個中心點 
  5.     Classify(samples []IPoint, calc IDistanceCalculator, k int) []IPoint 

tPerson.go

病例樣本點, 實現IPoint接口, 含x,y坐標

  1. package km 
  2.  
  3. import "fmt" 
  4.  
  5. type tPerson struct { 
  6.     x int 
  7.     y int 
  8.  
  9. func NewPerson(x, y int) IPoint { 
  10.     return &tPerson{x, y, } 
  11.  
  12. func (me *tPerson) String() string { 
  13.     return fmt.Sprintf("p(%v,%v)", me.x, me.y) 

tPersonDistanceCalculator.go

病例距離計算器, 計算兩點間x,y坐標的直線距離

  1. package km 
  2.  
  3.  
  4. type tPersonDistanceCalculator struct { 
  5.  
  6. var gMaxInt = 0x7fffffff_ffffffff 
  7.  
  8. func newPersonDistanceCalculator() IDistanceCalculator { 
  9.     return &tPersonDistanceCalculator{} 
  10.  
  11. func (me *tPersonDistanceCalculator) Calc(a, b IPoint) int { 
  12.     if a == b { 
  13.         return 0 
  14.     } 
  15.  
  16.     p1, ok := a.(*tPerson) 
  17.     if !ok { 
  18.         return gMaxInt 
  19.     } 
  20.  
  21.     p2, ok := b.(*tPerson) 
  22.     if !ok { 
  23.         return gMaxInt 
  24.     } 
  25.  
  26.     dx := p1.x - p2.x 
  27.     dy := p1.y - p2.y 
  28.  
  29.     d := dx*dx + dy*dy 
  30.     if d < 0 { 
  31.         panic(d) 
  32.     } 
  33.     return d 
  34.  
  35. var PersonDistanceCalculator = newPersonDistanceCalculator() 

tKMeansClassifier.go

k-means聚類器, 實現IClassifier接口.

  1. package km 
  2.  
  3. import ( 
  4.     "math/rand" 
  5.     "time" 
  6.  
  7. type tKMeansClassifier struct { 
  8.  
  9. type tPointEntry struct { 
  10.     point IPoint 
  11.     distance int 
  12.     index int 
  13.  
  14. func newPointEntry(p IPoint, d int, i int) *tPointEntry { 
  15.     return &tPointEntry{ 
  16.         p, d, i, 
  17.     } 
  18.  
  19. func newKMeansClassifier() IClassifier { 
  20.     return &tKMeansClassifier{} 
  21.  
  22. // 將samples聚類成k個, 并返回k個中心點 
  23. func (me *tKMeansClassifier) Classify(samples []IPoint, calc IDistanceCalculator, k int) []IPoint { 
  24.     sampleCount := len(samples) 
  25.     if sampleCount <= k { 
  26.         return samples 
  27.     } 
  28.  
  29.     // 初始化, 隨機選擇k個中心點 
  30.     rnd := rand.New(rand.NewSource(time.Now().UnixNano())) 
  31.     centers := make([]IPoint, k) 
  32.     for selected, i:= make(map[int]bool, 0), 0;i < k; { 
  33.         n := rnd.Intn(sampleCount) 
  34.         _,ok := selected[n] 
  35.  
  36.         if !ok { 
  37.             selected[n] = true 
  38.             centers[i] = samples[n] 
  39.             i++ 
  40.         } 
  41.     } 
  42.  
  43.  
  44.     // 根據到中心點的距離, 劃分samples 
  45.     for { 
  46.         groups := me.split(samples, centers, calc) 
  47.  
  48.         newCenters := make([]IPoint, k) 
  49.         for i,g := range groups { 
  50.             newCenters[i] = me.centerOf(g, calc) 
  51.         } 
  52.  
  53.         if me.groupEquals(centers, newCenters) { 
  54.             return centers 
  55.         } 
  56.         centers = newCenters 
  57.     } 
  58.  
  59. // 將樣本點距離中心點的距離進行分簇 
  60. func (me *tKMeansClassifier) split(samples []IPoint, centers []IPoint, calc IDistanceCalculator) [][]IPoint { 
  61.     k := len(centers) 
  62.     result := make([][]IPoint, k) 
  63.     for i := 0;i<k;i++ { 
  64.         result[i] = make([]IPoint, 0
  65.     } 
  66.  
  67.     entries := make([]*tPointEntry, k) 
  68.     for i,c := range centers { 
  69.         entries[i] = newPointEntry(c, 0, i) 
  70.     } 
  71.  
  72.     for _,p := range samples { 
  73.         for _,e := range entries { 
  74.             e.distance = calc.Calc(p, e.point) 
  75.         } 
  76.  
  77.         center := me.min(entries) 
  78.         result[center.index] = append(result[center.index], p) 
  79.     } 
  80.  
  81.     return result 
  82.  
  83. // 計算一簇樣本的重心. 重心就是距離各點的總和最小的點 
  84. func (me *tKMeansClassifier) centerOf(samples []IPoint, calc IDistanceCalculator) IPoint { 
  85.     entries := make([]*tPointEntry, len(samples)) 
  86.     for i,src := range samples { 
  87.         distance := 0 
  88.         for _,it := range samples { 
  89.             distance += calc.Calc(src, it) 
  90.         } 
  91.         entries[i] = newPointEntry(src, distance, i) 
  92.     } 
  93.  
  94.     return me.min(entries).point 
  95.  
  96. // 判斷兩組點是否相同 
  97. func (me *tKMeansClassifier) groupEquals(g1, g2 []IPoint) bool { 
  98.     if len(g1) != len(g2) { 
  99.         return false 
  100.     } 
  101.  
  102.     for i,v := range g1 { 
  103.         if g2[i] != v { 
  104.             return false 
  105.         } 
  106.     } 
  107.  
  108.     return true 
  109.  
  110. // 查找距離最小的點 
  111. func (me *tKMeansClassifier) min(entries []*tPointEntry) *tPointEntry { 
  112.     minI := 0 
  113.     minD := gMaxInt 
  114.     for i,it := range entries { 
  115.         if it.distance < minD { 
  116.             minI = i 
  117.             minD = it.distance 
  118.         } 
  119.     } 
  120.  
  121.     return entries[minI] 
  122.  
  123.  
  124. var KMeansClassifier = newKMeansClassifier() 

 

 

 

責任編輯:張燕妮 來源: Go語言中文網
相關推薦

2012-08-09 09:57:54

K-means

2025-05-22 10:06:49

2024-04-18 15:44:20

2023-03-08 08:03:09

數據結構算法歸并排序

2020-12-31 05:31:01

數據結構算法

2020-10-21 14:57:04

數據結構算法圖形

2017-09-12 16:57:43

機器學習K-means算法Python

2023-10-27 07:04:20

2023-04-27 09:13:20

排序算法數據結構

2018-04-25 08:10:50

算法k-means代碼

2023-03-07 08:02:07

數據結構算法數列

2023-03-02 08:15:13

2023-03-10 08:07:39

數據結構算法計數排序

2021-05-12 09:07:09

Java數據結構算法

2023-02-08 07:52:36

跳躍表數據結構

2023-10-30 08:31:42

數據結構算法

2020-10-20 08:14:08

算法與數據結構

2023-11-06 06:43:23

單鏈表查詢數據結構

2023-09-15 10:33:41

算法數據結構

2017-08-31 09:45:43

JavaArrayList數據
點贊
收藏

51CTO技術棧公眾號

中文字幕亚洲区| 中文在线不卡| 日韩欧美精品在线视频| 日本免费a视频| 天堂成人在线| 美腿丝袜亚洲一区| 欧美国产亚洲精品久久久8v| 国产精品伦子伦| 成人在线观看免费播放| 亚洲色图在线播放| av一区二区三区四区电影| 久久视频免费在线观看| 成人亚洲一区二区| 欧美电影免费观看完整版| 1024av视频| 麻豆av在线导航| 91在线观看地址| 91精品在线观| 久久99国产综合精品免费| 国产国产精品| 亚洲欧美日韩在线一区| 精品人妻一区二区乱码| 国模视频一区| 亚洲国产精品麻豆| 免费成人深夜夜行网站视频| 四虎影视精品成人| 国产一区91精品张津瑜| 国产精品69久久久久| 免费麻豆国产一区二区三区四区| 国产影视一区| 日韩av资源在线播放| 婷婷中文字幕在线观看| 少妇一区视频| 无吗不卡中文字幕| 成人在线视频一区二区三区| av在线收看| 久久久久久日产精品| 国产精品乱码| 国产富婆一级全黄大片| 免费精品视频在线| 日本伊人精品一区二区三区介绍| 欧美日韩中文视频| 午夜日韩在线| 久久国产精品久久久久久久久久 | 欧美日韩免费看片| 一区二区三区在线视频播放| 亚洲一区二区在线看| 电影av一区| 久久综合av免费| 国内精品久久久久久久果冻传媒| 国产成人免费看一级大黄| 久久av老司机精品网站导航| 国产99久久精品一区二区永久免费 | 色综合老司机第九色激情| 国产在线免费av| 精品美女久久| 在线看福利67194| 先锋影音av在线| 国产精品一区2区3区| 亚洲精品一区二区在线| 99久久免费看精品国产一区| 国产成人高清精品免费5388| 欧美精品一区二区三| 色哟哟无码精品一区二区三区| 日本在线视频一区二区三区| 日韩欧美中文一区二区| 性活交片大全免费看| av毛片精品| 亚洲精品国产精品国自产在线 | 欧美调教视频| 亚洲精品视频网上网址在线观看| 久久久久久亚洲中文字幕无码| 欧美军人男男激情gay| 中文字幕日本欧美| 免费黄色国产视频| 欧美一区亚洲| 91精品国产777在线观看| www.av麻豆| 日日摸夜夜添夜夜添国产精品| 国产精品福利无圣光在线一区| 在线免费av网| 国产精品99精品久久免费| 肥熟一91porny丨九色丨| 天堂av电影在线观看| 国产亚洲自拍一区| 六月婷婷激情网| av电影在线免费| 午夜欧美视频在线观看| 国产a级片免费观看| 欧美午夜三级| 精品精品欲导航| 亚洲一区视频在线播放| 婷婷亚洲五月| 国产91|九色| 一级特黄aa大片| 成人免费观看av| 欧美亚洲精品日韩| 在线观看男女av免费网址| 精品福利一区二区| 亚洲高清免费在线观看| 亚洲高清999| 国产小视频91| 久久久久人妻一区精品色欧美| 免费日韩av片| 91黄在线观看| 福利片在线看| 亚洲国产美女搞黄色| 午夜在线观看av| 国产96在线亚洲| 日韩中文字幕在线播放| 粉嫩aⅴ一区二区三区| 美女在线一区二区| 精品乱码一区| 手机在线免费观看av| 欧美亚洲国产bt| 国产白嫩美女无套久久| 天天影视欧美综合在线观看| 欧美在线观看网站| 亚洲精品国产精品国| 国产精品久久福利| 哪个网站能看毛片| 精品视频在线你懂得| zzijzzij亚洲日本成熟少妇| 欧美日韩综合在线观看| 国产精品一二三四五| 亚洲aⅴ天堂av在线电影软件| 国产蜜臀在线| 欧美一级艳片视频免费观看| 国产aaaaaaaaa| 欧美资源在线| 国产自产精品| 懂色av一区| 日韩欧美在线综合网| 小嫩苞一区二区三区| 三级精品在线观看| 欧美精品一区在线发布| av蜜臀在线| 精品剧情在线观看| 欧美精品xxxxx| 国产精品一区二区三区网站| 亚洲一区二区三区乱码 | 日本精品视频一区二区三区| 亚洲麻豆一区二区三区| 欧美日韩一卡| 91免费在线观看网站| 欧美激情视频在线播放| 欧美三区在线观看| 中文字幕第20页| 久久久久99| 欧美亚洲另类在线一区二区三区| 国产盗摄——sm在线视频| 亚洲国产精品999| 国产手机在线视频| 99久久精品国产导航| 妞干网在线视频观看| 日本欧美三级| 国产成人中文字幕| av女优在线| 欧美另类z0zxhd电影| 中文字幕人妻一区二| 粉嫩av一区二区三区| 国产freexxxx性播放麻豆| 国产成人精品亚洲线观看| 91精品国产网站| 欧美日韩伦理片| 91国偷自产一区二区三区观看 | 欧美又大又粗又长| 黄色毛片在线看| 在线观看不卡一区| 日韩在线一卡二卡| 国产99久久久精品| 日本韩国欧美在线观看| 国内成人自拍| 成人av色在线观看| 日本三级在线观看网站| 日韩av影视在线| 销魂美女一区二区| 国产精品亲子伦对白| 在线成人免费av| 伊人激情综合| 日韩高清国产精品| 国产免费区一区二区三视频免费| 久久久久国色av免费观看性色| 四虎在线免费看| 欧美乱妇23p| 国产精品免费av一区二区| 久久综合丝袜日本网| 视频在线观看免费高清| 国内激情久久| 日韩欧美视频第二区| 久久精品免视看国产成人| 97久久精品国产| 91大神在线网站| 日韩精品中文字幕一区二区三区| 国产伦精品一区二区三区视频网站| 中文字幕制服丝袜成人av| 精品人妻在线视频| 男女性色大片免费观看一区二区 | 久久99精品久久久久久三级| 国产成人精品一区二三区在线观看| 久久色精品视频| 视频一区二区在线播放| 欧美日韩一区中文字幕| 国产精品第一页在线观看| 久久精品人人做人人爽人人| 日韩欧美中文在线视频| 午夜一区不卡| 992tv快乐视频| 日韩欧美1区| 久久大片网站| 试看120秒一区二区三区| 日本91av在线播放| 欧美videosex性极品hd| 一区二区三欧美| 婷婷视频在线观看| 日韩欧美一区二区久久婷婷| 中文在线观看免费高清| 亚洲国产毛片aaaaa无费看| 国产精品成人69xxx免费视频| 91丨九色丨蝌蚪丨老版| 久久99热只有频精品91密拍| 成人在线爆射| 久久久久久999| 毛片免费不卡| 亚洲日本中文字幕| www.激情五月.com| 欧美精品一二三区| 午夜精品免费观看| 亚洲国产毛片aaaaa无费看| 永久av免费网站| 欧美高清在线视频| 国产黄色网址在线观看| 成人免费观看男女羞羞视频| 国产永久免费网站| 麻豆成人综合网| 成人性生生活性生交12| 久久亚洲欧美| 波多野结衣家庭教师视频| 亚洲狼人精品一区二区三区| 日韩精品综合在线| 欧美日韩91| 2021狠狠干| 91精品精品| 亚洲v国产v| 久久亚洲影视| 亚洲视频sss| 91亚洲国产成人久久精品| 视频一区不卡| 日韩欧美午夜| 亚洲日本精品| 亚洲女同中文字幕| 免费观看黄色大片| 亚洲草久电影| 亚洲色婷婷久久精品av蜜桃| 久久免费精品视频在这里| 亚洲不卡一卡2卡三卡4卡5卡精品| 免费福利视频一区| 久久精品magnetxturnbtih| 欧美男人操女人视频| 国产视频精品网| 欧美亚视频在线中文字幕免费| 国产一区二区在线网站 | 蜜桃传媒视频麻豆一区| 免费看成人人体视频| 久久久亚洲综合网站| 欧美挤奶吃奶水xxxxx| 蜜桃麻豆www久久国产精品| 色棕色天天综合网| 日韩三级在线播放| 国产精品国产三级国产在线观看| 亚洲一区精彩视频| 一个色综合网| 国产在线播放观看| 久久久久网站| 伊人影院综合在线| 国产精品77777| 免费a级黄色片| 国产精品热久久久久夜色精品三区 | 久久国产精品影片| 91九色国产在线播放| 日本91av在线播放| 亚洲老司机网| 国产一区二区三区免费不卡| 久久99性xxx老妇胖精品| 一区二区三区国产福利| 午夜激情一区| 任你操这里只有精品| 国产自产2019最新不卡| a级片在线观看视频| 国产欧美精品国产国产专区| 欧洲猛交xxxx乱大交3| 亚洲不卡一区二区三区| 久草热在线观看| 欧美videos大乳护士334| 国产在线高清| 欧美成人免费大片| 三上悠亚激情av一区二区三区 | 日本国产精品| 一区二区三区四区五区视频| 黄色亚洲免费| 天堂一区在线观看| 91社区在线播放| 乱h高h女3p含苞待放| 精品久久久久久中文字幕| 一本色道久久综合亚洲| 亚洲国产女人aaa毛片在线| 男女啪啪在线观看| 欧美伊久线香蕉线新在线| 亚洲伦理一区二区| 欧美日韩高清免费| 亚洲无吗在线| 日本不卡一区二区在线观看| 播五月开心婷婷综合| 亚洲怡红院在线观看| 91精品福利视频| 午夜福利理论片在线观看| 日韩亚洲欧美中文高清在线| 亚洲天堂电影| 都市激情久久久久久久久久久| 99久久99久久精品国产片果冰| 日本三级免费观看| 国产成人精品一区二| 337人体粉嫩噜噜噜| 欧美性猛交xxxx久久久| 亚洲国产福利视频| xvideos国产精品| 99久久er| 欧美亚洲丝袜| 99精品久久久| 美女搡bbb又爽又猛又黄www| 亚洲日本一区二区| 亚洲图片视频小说| 国产亚洲精品久久久久久| 精品捆绑调教一区二区三区| 91在线视频导航| 日韩久久精品| 不卡av免费在线| 久久久亚洲高清| 在线观看亚洲欧美| 亚洲国产欧美自拍| 国产高清中文字幕在线| 99久re热视频这里只有精品6| 999精品色在线播放| 中文av一区二区三区| 国产女主播在线一区二区| 啦啦啦免费高清视频在线观看| 亚洲黄色av女优在线观看| 国内老司机av在线| 444亚洲人体| 欧美在线二区| 在线观看亚洲免费视频| 亚洲成人高清在线| 亚洲aⅴ乱码精品成人区| 91精品国产高清久久久久久久久 | 国产日韩欧美在线观看视频| 欧美色综合网站| 亚洲搞黄视频| 亚洲精品欧美一区二区三区| 91精品一区二区三区综合| 911av视频| 玉米视频成人免费看| 国产高潮流白浆喷水视频| 欧美激情网站在线观看| jizz久久精品永久免费| 免费拍拍拍网站| 97精品国产露脸对白| 国产成人一级片| 国产一区二区三区四区福利| 精品福利在线| 91社在线播放| 波多野结衣中文一区| 日本中文在线播放| 影音先锋日韩有码| 国产亚洲高清一区| 国产精品999视频| 国产亚洲短视频| 国产尤物视频在线观看| 久久6免费高清热精品| 日韩精品一区二区三区中文在线| 国产欧美日韩小视频| 久久久久久久网| 国产精品女同一区二区| 久久久久久久999精品视频| 欧美a级网站| 日本超碰在线观看| 亚洲第一搞黄网站| 成人综合影院| 亚洲一区二区久久久久久久| 在线欧美亚洲| 美女av免费看| 亚洲第一av网站| 九色成人搞黄网站| 国产一区 在线播放| 久久色.com| 精品久久无码中文字幕| 日韩av免费网站| 欧美午夜久久| 91免费在线看片| 亚洲国产欧美一区二区丝袜黑人| 欧美大陆国产|