C#,K-均值(K-Means)聚类算法的核心源代码

一、詹姆斯·麦昆(James MacQueen)

IMS研究员詹姆斯·B·麦昆于2014年7月15日病逝,享年85岁。他的妻子安和他们的三个孩子唐纳德、凯特和玛丽以及五个孙子孙女幸存下来。

从1962年到去世,麦昆教授一直在加州大学洛杉矶分校管理研究生院工作。1952年,他在俄勒冈州里德学院获得心理学学士学位,1954年和1958年分别在俄勒冈州大学获得理学硕士和心理学博士学位。在加入加州大学洛杉矶分校(UCLA)之前,麦昆教授有着杰出的职业生涯,包括在俄勒冈州大学(University of Oregon)和加州大学伯克利分校(University of California,Berkeley)以及加州大学洛杉矶分校(UCLA)西部管理科学研究所(Western Management Science Institute)与雅各布·马沙克教授(Jacob Marshak)担任学术。

吉姆的研究兴趣在于提供人类过程的数学公式。在1960年与鲁伯特·米勒(Rupert Miller)合著的第一篇重要论文[1]中,他研究了一大类最优停止问题。作为一个特例,本文首次提到了找房子的问题。在经济学中,这被称为求职问题或出售资产的问题,并引发了大量研究。

吉姆是另一个领域的先驱,他称之为k-means[2]的开发。这是一种通过将样本空间划分为k个类内方差较小的集合来检测多元数据中的聚类的方法。k的值也可由数据选择。

他的另一个有趣发明是吉姆所说的“线性鞅”[3],朋友和同事们称之为“麦金格尔”。这是一个随机变量序列,根据过去的观察,下一次观察的预期是最近过去的固定线性组合。主要结果是Doob鞅收敛定理的一个显著推广。

在马尔可夫过程领域,吉姆特别喜欢建模马尔可夫链。在描述这样的链时,可以给出转移概率,也可以给出弧上的一组平衡权重。使用平衡权重的优点是,平稳分布(以及转移概率)可以很容易地推导出来。诀窍是以平衡、有意义的方式设置权重。在《电路过程》一文[4]中,Jim通过为链状态上的一组电路分配权重来实现这一点。这些想法在他的论文《马尔科夫雕塑》中以一种优美的方式展开[5]。

吉姆性格开朗,容易交到朋友,总是开朗幽默。他没有自尊心,总是乐于为他人争光。对于需要解决的问题,他善于提出新的想法,有时令人震惊。他喜欢户外活动,喜欢在怀俄明州的大角山徒步旅行。

他是洛杉矶、伯克利和学术会议上克里格斯皮尔的狂热球员。在克里格斯皮尔,他以敢于尝试新策略而闻名。劳埃德·夏普利曾经说过,他总是从扮演吉姆中学到一些东西。所有认识他的人都会怀念他聪明迷人的个性。

作者:托马斯·S·弗格森教授

加州大学洛杉矶分校数学与统计系

二、K均值聚类算法

K均值聚类算法(K-Means Clustering Algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

k均值聚类是使用最大期望算法(Expectation-Maximization algorithm)求解的高斯混合模型(Gaussian Mixture Model, GMM)在正态分布的协方差为单位矩阵,且隐变量的后验分布为一组狄拉克δ函数时所得到的特例。
 

using System; 
using System.Data; 
using System.Drawing;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// K-Means算法/// </summary>public class K_Means_Algorithm{private static int K { get; set; } = 0;private List<PointF> points { get; set; } = new List<PointF>();public K_Means_Algorithm(List<PointF> p, int k){K = k;points.AddRange(p);}/// <summary>/// 计算新的聚类中心 /// </summary>/// <param name="m"></param>/// <param name="type"></param>/// <returns></returns>public PointF Center_Point(int m, int[] type){int count = 0;PointF sum = new PointF(0.0F, 0.0F);for (int i = 0; i < points.Count; i++){if (type[i] == m){sum.X = points[i].X + sum.X;sum.Y = points[i].Y + sum.Y;count++;}}if (count > 0){sum.X = sum.X / count;sum.Y = sum.Y / count;}return sum;}/// <summary>/// 比较两个聚类中心的是否相等/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>private bool Compare(PointF a, PointF b){if (((int)(a.X * 10) == (int)(b.X * 10)) && ((int)(a.Y * 10) == (int)(b.Y * 10))){return true;}else{return false;}}/// <summary>/// 进行迭代,对total个样本根据聚类中心进行分类/// </summary>/// <param name="type"></param>/// <param name="z"></param>private void Order(ref int[] type, PointF[] z){//记录unknown[i]暂时在哪个类中 int temp = 0;for (int i = 0; i < points.Count; i++){for (int j = 0; j < K; j++){if (Distance(points[i], z[temp]) > Distance(points[i], z[j])){temp = j;}}type[i] = temp;}}/// <summary>/// 计算两个点的欧式距离/// </summary>/// <param name="p1"></param>/// <param name="p2"></param>/// <returns></returns>private float Distance(PointF p1, PointF p2){return ((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y));}/// <summary>/// 进行聚类/// </summary>/// <returns></returns>public List<List<PointF>> Execute(){int[] type = new int[points.Count];PointF[] z = new PointF[K];PointF[] z0 = new PointF[K];for (int i = 0; i < K; i++){z[i] = points[i];}List<List<PointF>> result = new List<List<PointF>>();int test = 0;int loop = 0;while (test != K){Order(ref type, z);for (int i = 0; i < K; i++){z[i] = Center_Point(i, type);if (Compare(z[i], z0[i])){test = test + 1;}else{z0[i] = z[i];}}loop = loop + 1;List<PointF> p = new List<PointF>();for (int j = 0; j < K; j++){for (int i = 0; i < points.Count; i++){if (type[i] == j){p.Add(points[i]);}}}if (p.Count > 0){result.Add(p);}}return result;}}
}

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

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

相关文章

软考 系统分析师系列知识点之需求获取(7)

所属章节&#xff1a; 第11章. 软件需求工程 第2节. 需求获取 需求获取是一个确定和理解不同的项目干系人的需求和约束的过程。需求获取是一件看上去很简单、做起来却很难的事情。需求获取是否科学、准备是否充分&#xff0c;对获取出来的结果影响很大&#xff0c;这是因为大部…

图书推荐||Word文稿之美

让你的文档从平凡到出众&#xff01; 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧&#xff0c;再到快速修正错误和保护文件&#xff0c;全面系统地讲解数字排版的技术和能力&…

[剪藏] - 瑞萨收购Altium!

2024年2月15日消息&#xff0c;瑞萨电子公司近日表示计划以每股68.50澳元&#xff0c;总额 91 亿澳元&#xff08;约合 59 亿美元&#xff09;收购 PCB 设计软件公司 Altium的所有流通股&#xff08;企业价值为88亿澳元&#xff09;&#xff0c;此举不禁让人联想到西门子 2017 …

鼠标失灵怎么办?电脑出现鼠标失灵的详细处理方法介绍

无论是笔记本电脑还是台式机电脑&#xff0c;鼠标是必不可少的外设之一&#xff0c;而我们在使用电脑的过程中&#xff0c;经常回遇到鼠标突然失灵了&#xff0c;不听使唤&#xff0c;控制不了&#xff0c;接下小编来与大家一起分享&#xff0c;遇到这种情况我们该怎么办 有时…

YOLO v9训练自己数据集

原以为RT-DETR可以真的干翻YOLO家族&#xff0c;结果&#xff0c;&#xff01;&#xff01;&#xff01;&#xff01; 究竟能否让卷积神经网络重获新生&#xff1f; 1.数据准备 代码地址&#xff1a;https://github.com/WongKinYiu/yolov9 不能科学上网的评论区留言 数据集…

社交APP开发能给用户带来什么

现在的社交软件也非常的多&#xff0c;每款社交软件都有自己的特色&#xff0c;社交软件是日常中必备的软件&#xff0c;不管是生活交流还是感情工作交流都是比较方便的&#xff0c;因为社交软件满足了日常的远程交流问题&#xff0c;所以开发社交软件也会逐渐的流行起来的。 …

Cloud整合Zookeeper代替Eureka

微服务间通信重构与服务治理笔记-CSDN博客 Zookeeper是一个分布式协调工具,可以实现注册中心功能 安装Zookeeper 随便 就用最新版本吧 进入Zookeeper 包目录 cd /usr/local/develop/ 解压 tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz -C /usr/local/develop 进入配置文件…

USB4之ASM2464PD与ASM2464PDX兼容与运用

首先在NVMe上运用: 一&#xff1a;ASM2464PD&#xff08;现在可以做带PD的方案&#xff09; 二&#xff1a;ASM2464PDX 1&#xff1a; Application Guide- CFX card reader NVMe SSD 2&#xff1a;ASM2464PDX Application Guide- NVMe SSD x4 with data clone 三&#xff…

摄像头工程师说 Camera - 颜色空间 YUV 与 YCbCr 的区别与联系(4)

摄像头工程师说 Camera - 数据格式 YUV 与 YCbCr 的区别与联系&#xff08;4&#xff09; 概述 上回书咱们说到 摄像头工程师说 Camera - 数据格式 YUV 格式的存储&#xff08;3&#xff09; 本节咱们说说YUV 与 YCbCr 两种色彩空间定义的联系与区别。 相同点&#xff1a; Y…

嵌入式驱动学习第一周——linux的休眠与唤醒

前言 本文介绍进程的休眠与唤醒。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 行文目录 前言1. 阻塞和非阻…

PCL中的3D特征

PCL中的3D特征 PCL中的3D特征理论入门如何传递输入法线估计例子 PCL中的3D特征 理论入门 来自[RusuDissertation]&#xff1a; 在他们原生表示中&#xff0c; 点 如 3D 映射系统概念中定义的那样&#xff0c;使用它们的笛卡尔坐标 x、y、z 相对于给定原点简单地表示。假设坐标…

pyqt教程

一、组件安装配置 1.安装组件 在Anaconda Prompt下进入自己的python环境 pip install PyQt5 pip install PyQt5-tools 2.vscode安装插件 3.配置路径 配置Pyuic:Cmd与Qtdesigner:Path路径 1.Pyuic:Cmd路径 一般是在你安装的python环境下的 \Scripts\pyuic5.exe 2.Qtdesigner:P…