iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何使用Golang基本数据结构与算法k-means聚类算法
  • 954
分享到

如何使用Golang基本数据结构与算法k-means聚类算法

2024-04-02 19:04:59 954人浏览 独家记忆
摘要

本篇内容介绍了“如何使用golang基本数据结构与算法k-means聚类算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读

本篇内容介绍了“如何使用golang基本数据结构与算法k-means聚类算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

k-means聚类算法

聚类就是在输入为多个数据时, 将“相似”的数据分为一组的操作。 k-means算法是聚类算法中的一种。 首先随机选择k个点作为簇的中心点, 然后重复执行“将数据分到相应的簇中”和 “将中心点移到重心的位置”这两个操作, 直到中心点不再发生变化为止。 k-means算法中,随着操作的不断重复, 中心点的位置必定会在某处收敛, 这一点已经在数学层面上得到证明。 摘自 <<我的第一本算法书>> 【日】石田保辉;宫崎修一

场景

  • 某地突然爆发新冠疫情, 现防疫急需根据病例分布, 查找可能的病源地

  • 首先将病例分布的坐标, 录入系统

  • 然后根据k-means算法, 按k从1到3, 分别进行聚类

  • 聚类的中心点, 可能就是病源地

如何使用Golang基本数据结构与算法k-means聚类算法

流程

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 给定若干样本, 和样本距离计算器, 需要求解k个样本中心点

  3. 首先从样本中随机抽取k个点, 作为中心点

  4. 循环每个样本

    1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

    2. 分别计算样本点到k个中心点的距离

    3. 判断距离样本点最小的中心点

    4. 将样本划分到该最小中心点的簇

  5. 计算每个簇的中心点, 作为新的中心点

    1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

    2. 循环簇中的每个样本

    3. 计算该样本, 到本簇其他样本的距离之和

    4. 与其他样本的距离和最小的点, 就是新的中心点

  6. 重复3-4, 直到中心点不再变化, 计算完毕

设计

  • IPoint: 样本点接口, 其实是一个空接口

  • IDistanceCalculator: 距离计算器接口

  • IClassifier: 分类器接口, 将samples聚类成k个, 并返回k个中心点

  • tPerson: 病例样本点, 实现IPoint接口, 含x,y坐标

  • tPersonDistanceCalculator: 病例距离计算器, 计算两点间x,y坐标的直线距离

  • tKMeansClassifier: k-means聚类器, 实现IClassifier接口.

单元测试

k_means_test.Go

package others  import (     km "learning/gooop/others/k_means"     "strings"     "testing" )  func Test_KMeans(t *testing.T) {     // 创建样本点     samples := []km.IPoint {         km.NewPerson(2, 11),         km.NewPerson(2, 8),         km.NewPerson(2, 6),          km.NewPerson(3, 12),         km.NewPerson(3, 10),          km.NewPerson(4, 7),         km.NewPerson(4, 3),          km.NewPerson(5, 11),         km.NewPerson(5, 9),         km.NewPerson(5, 2),          km.NewPerson(7, 9),         km.NewPerson(7, 6),         km.NewPerson(7, 3),          km.NewPerson(8, 12),          km.NewPerson(9, 3),         km.NewPerson(9, 5),         km.NewPerson(9, 10),          km.NewPerson(10, 3),         km.NewPerson(10, 6),         km.NewPerson(10, 12),          km.NewPerson(11, 9),     }      fnPoints2String := func(points []km.IPoint) string {         items := make([]string, len(points))         for i,it := range points {             items[i] = it.String()         }         return strings.Join(items, " ")     }      for k:=1;k<=3;k++ {         centers := km.KMeansClassifier.Classify(samples, km.PersonDistanceCalculator, k)         t.Log(fnPoints2String(centers))     } }

测试输出

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

IPoint.go

样本点接口, 其实是一个空接口

package km  import "fmt"  type IPoint interface {     fmt.Stringer }

IDistanceCalculator.go

距离计算器接口

package km  type IDistanceCalculator interface {     Calc(a, b IPoint) int }

IClassifier.go

分类器接口, 将samples聚类成k个, 并返回k个中心点

package km  type IClassifier interface {     // 将samples聚类成k个, 并返回k个中心点     Classify(samples []IPoint, calc IDistanceCalculator, k int) []IPoint }

tPerson.go

病例样本点, 实现IPoint接口, 含x,y坐标

package km  import "fmt"  type tPerson struct {     x int     y int }  func NewPerson(x, y int) IPoint {     return &tPerson{x, y, } }  func (me *tPerson) String() string {     return fmt.Sprintf("p(%v,%v)", me.x, me.y) }

tPersonDistanceCalculator.go

病例距离计算器, 计算两点间x,y坐标的直线距离

package km   type tPersonDistanceCalculator struct { }  var gMaxInt = 0x7fffffff_ffffffff  func newPersonDistanceCalculator() IDistanceCalculator {     return &tPersonDistanceCalculator{} }  func (me *tPersonDistanceCalculator) Calc(a, b IPoint) int {     if a == b {         return 0     }      p1, ok := a.(*tPerson)     if !ok {         return gMaxInt     }      p2, ok := b.(*tPerson)     if !ok {         return gMaxInt     }      dx := p1.x - p2.x     dy := p1.y - p2.y      d := dx*dx + dy*dy     if d < 0 {         panic(d)     }     return d }  var PersonDistanceCalculator = newPersonDistanceCalculator()

tKMeansClassifier.go

k-means聚类器, 实现IClassifier接口.

package km  import (     "math/rand"     "time" )  type tKMeansClassifier struct { }  type tPointEntry struct {     point IPoint     distance int     index int }  func newPointEntry(p IPoint, d int, i int) *tPointEntry {     return &tPointEntry{         p, d, i,     } }  func newKMeansClassifier() IClassifier {     return &tKMeansClassifier{} }  // 将samples聚类成k个, 并返回k个中心点 func (me *tKMeansClassifier) Classify(samples []IPoint, calc IDistanceCalculator, k int) []IPoint {     sampleCount := len(samples)     if sampleCount <= k {         return samples     }      // 初始化, 随机选择k个中心点     rnd := rand.New(rand.NewSource(time.Now().UnixNano()))     centers := make([]IPoint, k)     for selected, i:= make(map[int]bool, 0), 0;i < k; {         n := rnd.Intn(sampleCount)         _,ok := selected[n]          if !ok {             selected[n] = true             centers[i] = samples[n]             i++         }     }       // 根据到中心点的距离, 划分samples     for {         groups := me.split(samples, centers, calc)          newCenters := make([]IPoint, k)         for i,g := range groups {             newCenters[i] = me.centerOf(g, calc)         }          if me.groupEquals(centers, newCenters) {             return centers         }         centers = newCenters     } }  // 将样本点距离中心点的距离进行分簇 func (me *tKMeansClassifier) split(samples []IPoint, centers []IPoint, calc IDistanceCalculator) [][]IPoint {     k := len(centers)     result := make([][]IPoint, k)     for i := 0;i<k;i++ {         result[i] = make([]IPoint, 0)     }      entries := make([]*tPointEntry, k)     for i,c := range centers {         entries[i] = newPointEntry(c, 0, i)     }      for _,p := range samples {         for _,e := range entries {             e.distance = calc.Calc(p, e.point)         }          center := me.min(entries)         result[center.index] = append(result[center.index], p)     }      return result }  // 计算一簇样本的重心. 重心就是距离各点的总和最小的点 func (me *tKMeansClassifier) centerOf(samples []IPoint, calc IDistanceCalculator) IPoint {     entries := make([]*tPointEntry, len(samples))     for i,src := range samples {         distance := 0         for _,it := range samples {             distance += calc.Calc(src, it)         }         entries[i] = newPointEntry(src, distance, i)     }      return me.min(entries).point }  // 判断两组点是否相同 func (me *tKMeansClassifier) groupEquals(g1, g2 []IPoint) bool {     if len(g1) != len(g2) {         return false     }      for i,v := range g1 {         if g2[i] != v {             return false         }     }      return true }  // 查找距离最小的点 func (me *tKMeansClassifier) min(entries []*tPointEntry) *tPointEntry {     minI := 0     minD := gMaxInt     for i,it := range entries {         if it.distance < minD {             minI = i             minD = it.distance         }     }      return entries[minI] }   var KMeansClassifier = newKMeansClassifier()

“如何使用Golang基本数据结构与算法k-means聚类算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用Golang基本数据结构与算法k-means聚类算法

本文链接: https://www.lsjlt.com/news/83468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Golang基本数据结构与算法k-means聚类算法
    本篇内容介绍了“如何使用Golang基本数据结构与算法k-means聚类算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • Python如何实现聚类K-means算法
    今天小编给大家分享一下Python如何实现聚类K-means算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。K-means...
    99+
    2023-07-02
  • 利用Python如何实现K-means聚类算法
    目录前言算法原理 目标函数 算法流程  Python实现 总结 前言 K-Means 是一种非常简单的聚类算法(聚类算法都属于无监督学习)。给定固定数量的聚类和输入数据集,...
    99+
    2024-04-02
  • 如何使用Python语言实现K-Means聚类算法
    这篇文章给大家分享的是有关如何使用Python语言实现K-Means聚类算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 概述1.1 无监督学习      在一个典型的监督学习中...
    99+
    2023-06-26
  • 如何用K-means算法的Java实现聚类分析681个三国武将
    如何用K-means算法的Java实现聚类分析681个三国武将,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一,k-means算法介绍:k-means算法接受输入量 k ;然后...
    99+
    2023-06-17
  • 数据结构与算法之了解基本概念
    本篇内容主要讲解“数据结构与算法之了解基本概念”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据结构与算法之了解基本概念”吧!前言数据结构与算法是程序员内功体现...
    99+
    2024-04-02
  • 如何理解Java数据结构与算法
    本篇内容介绍了“如何理解Java数据结构与算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本介绍鸿蒙官方战略合作共建——HarmonyO...
    99+
    2023-06-15
  • java 数据结构基本算法希尔排序
    C语言数据结构基本算法希尔排序前言:基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序, 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进...
    99+
    2023-05-31
    数据结构 希尔排序 ava
  • 数据结构与算法的基数排序是什么
    本篇内容主要讲解“数据结构与算法的基数排序是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据结构与算法的基数排序是什么”吧! 基数排序鸿蒙官方战略合作共建——HarmonyOS技...
    99+
    2023-06-15
  • C++数据结构与算法的基础知识和经典算法汇总
    目录算法分析的本质时间复杂度概念计算方法空间复杂度概念认识递归方法概念递归的本质基本的数据结构线性表顺序表链表栈与队列栈队列重要算法概念贪心法分治法搜索法宽度优先搜索分支限界法总结算...
    99+
    2024-04-02
  • Ignite中如何使用k-最近邻分类算法
    Ignite中如何使用k-最近邻分类算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先,要获取原始数据并将其拆分成训练数据(60%)和测试数据(40%)。然后再次使用S...
    99+
    2023-06-19
  • 利用Golang实现高效的数据结构和算法
    利用Golang实现高效的数据结构和算法 随着信息时代的快速发展,数据结构和算法成为计算机科学领域中至关重要的部分。在实际应用中,高效的数据结构和算法能够极大地提升程序的执行效率和性能...
    99+
    2024-02-28
    算法 golang 数据结构 go语言
  • 如何分析Python数据结构与算法中的顺序表
    这篇文章的内容主要围绕如何分析Python数据结构与算法中的顺序表进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!0. 学习目标线性表在计算机中的表示...
    99+
    2023-06-26
  • 如何优化Python中的算法和数据结构
    如何优化Python中的算法和数据结构在编程中,算法和数据结构是非常重要的。一个高效的算法和合适的数据结构可以大大提高程序的性能。而Python作为一种高级编程语言,提供了丰富的库和语法糖,使得编写算法和数据结构变得更加简洁和易读。本篇文章...
    99+
    2023-10-22
    算法 Python 优化
  • 如何进行C语言数据结构与算法中的排序总结
    这篇文章将为大家详细讲解有关如何进行C语言数据结构与算法中的排序总结,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、前言学习目标:排序和查找密不可分,将待处理的数据按关键值大小有序排列后,...
    99+
    2023-06-22
  • 算法与数据结构之如何理解时间与空间复杂度
    本篇内容介绍了“算法与数据结构之如何理解时间与空间复杂度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在...
    99+
    2024-04-02
  • 怎么用Java数据结构与算法实现递归与回溯
    这篇文章主要介绍“怎么用Java数据结构与算法实现递归与回溯”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Java数据结构与算法实现递归与回溯”文章能帮助大家解决问题。1.什么是递归?简单的说...
    99+
    2023-06-29
  • Java编程算法:如何实现复杂数据结构?
    Java是一种高级编程语言,它有着强大的编程能力和广泛的应用范围。在Java中,数据结构是编程中最重要的概念之一,因为它能够帮助我们处理和组织数据,从而实现更高效的算法和程序。而对于复杂数据结构的实现,更是Java编程中的重要话题。本文将...
    99+
    2023-07-29
    编程算法 异步编程 path
  • Python编程算法:如何应对复杂数据结构?
    Python是一种非常流行的编程语言,它被广泛用于数据科学、人工智能、Web开发等领域。在这些领域中,我们经常需要处理各种复杂的数据结构,例如图、树、堆、哈希表等。如何使用Python编程算法来应对这些复杂数据结构呢?本文将介绍几种常见的...
    99+
    2023-06-27
    编程算法 开发技术 git
  • LeetCode算法题中,如何运用Python的高级数据结构?
    LeetCode算法题是许多程序员都必须面对的挑战。这些问题需要运用各种数据结构和算法来解决,以及熟练掌握Python的高级数据结构。在本文中,我们将探讨如何在LeetCode算法题中运用Python的高级数据结构。 Python的高级数据...
    99+
    2023-11-06
    leetcode 大数据 关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作