一维数组kmeans聚类c语言,一维数组的 K-Means 聚类算法理解

刚看了这个算法,理解如下,放在这里,备忘,如有错误的地方,请指出,谢谢

需要做聚类的数组我们称之为【源数组】

需要一个分组个数K变量来标记需要分多少个组,这个数组我们称之为【聚类中心数组】及

一个缓存临时聚类中心的数组,我们称之为【缓存聚类中心数组】

然后初始化一个K长度的数组,值随机(尽量分布在原数组的更大的区间以便计算),用于和源数组进行比对计算。

下面是计算的部分:

死循环遍历对源数据进行分组。

分组内遍历原数组的每个元素与聚类中心的每个元素的距离(差值的绝对值),将最小距离的聚类中心数组下标缓存的临时变量临时变量数组A中(长度=原数组),

创建二维数组,我们称之为【分组数组】 [聚类中心数组长度][源数组中分类的值],

遍历临时变量数组A,使用A的小标拿到原数组对应的值,赋值给分组数组。

具体公式如:

分组数组[A[i]].add(原数组[i]);

返回分组数组

对分组后的数组计算中间值存入缓存聚类中心数组,比较缓存剧烈数组和聚类数组,是否位置一样,值一样,如果一样跳出死循环,分类结束,

否则将临时剧烈中心数组赋值给聚类中心数组进行下次循环

别笑!语文从来没及格过,表达能力就这样了。。。。。。。。不明白我说的啥,那么就看代码吧。

下面是c#代码,如果需要java代码,请看http://www.oschina.net/code/snippet_42411_2527

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceK_MeansTest

{classProgram

{static void Main(string[] args)

{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};int k = 5;double[][] g;

g=cluster(p, k);for (int i = 0; i < g.Length; i++)

{for (int j = 0; j < g[i].Length; j++)

{

Console.WriteLine(g[i][j]);

}

Console.WriteLine("----------------------");

}

Console.ReadKey();

}/** 聚类函数主体。

* 针对一维 double 数组。指定聚类数目 k。

* 将数据聚成 k 类。*/

public static double[][] cluster(double[] p, intk)

{//存放聚类旧的聚类中心

double[] c = new double[k];//存放新计算的聚类中心

double[] nc = new double[k];//存放放回结果

double[][] g;//初始化聚类中心//经典方法是随机选取 k 个//本例中采用前 k 个作为聚类中心//聚类中心的选取不影响最终结果

for (int i = 0; i < k; i++)

c[i]=p[i];//循环聚类,更新聚类中心//到聚类中心不变为止

while (true)

{//根据聚类中心将元素分类

g =group(p, c);//计算分类后的聚类中心

for (int i = 0; i < g.Length; i++)

{

nc[i]=center(g[i]);

}//如果聚类中心不同

if (!equal(nc, c))

{//为下一次聚类准备

c =nc;

nc= new double[k];

}else //聚类结束

break;

}//返回聚类结果

returng;

}/** 聚类中心函数

* 简单的一维聚类返回其算数平均值

* 可扩展*/

public static double center(double[] p)

{return sum(p) /p.Length;

}/** 给定 double 型数组 p 和聚类中心 c。

* 根据 c 将 p 中元素聚类。返回二维数组。

* 存放各组元素。*/

public static double[][] group(double[] p, double[] c)

{//中间变量,用来分组标记

int[] gi = new int[p.Length];//考察每一个元素 pi 同聚类中心 cj 的距离//pi 与 cj 的距离最小则归为 j 类

for (int i = 0; i < p.Length; i++)

{//存放距离

double[] d = new double[c.Length];//计算到每个聚类中心的距离

for (int j = 0; j < c.Length; j++)

{

d[j]=distance(p[i], c[j]);

}//找出最小距离

int ci =min(d);//标记属于哪一组

gi[i] =ci;

}//存放分组结果

double[][] g = new double[c.Length][];//遍历每个聚类中心,分组

for (int i = 0; i < c.Length; i++)

{//中间变量,记录聚类后每一组的大小

int s = 0;//计算每一组的长度

for (int j = 0; j < gi.Length; j++)if (gi[j] ==i)

s++;//存储每一组的成员

g[i] = new double[s];

s= 0;//根据分组标记将各元素归位

for (int j = 0; j < gi.Length; j++)if (gi[j] ==i)

{

g[i][s]=p[j];

s++;

}

}//返回分组结果

returng;

}/** 计算两个点之间的距离, 这里采用最简单得一维欧氏距离, 可扩展。*/

public static double distance(double x, doubley)

{return Math.Abs(x -y);

}/** 返回给定 double 数组各元素之和。*/

public static double sum(double[] p)

{double sum = 0.0;for (int i = 0; i < p.Length; i++)

sum+=p[i];returnsum;

}/** 给定 double 类型数组,返回最小值得下标。*/

public static int min(double[] p)

{int i = 0;double m = p[0];for (int j = 1; j < p.Length; j++)

{if (p[j]

{

i=j;

m=p[j];

}

}returni;

}/** 判断两个 double 数组是否相等。 长度一样且对应位置值相同返回真。*/

public static bool equal(double[] a, double[] b)

{if (a.Length !=b.Length)return false;else{for (int i = 0; i < a.Length; i++)

{if (a[i] !=b[i])return false;

}

}return true;

}

}

}

结果如下

dd5cb7d52b8b2c8ce9926894d034a3bd.png

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

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

相关文章

c语言根据图片轮廓图,c语言通过opencv实现轮廓处理与切割

c语言通过opencv实现轮廓处理与切割发布时间&#xff1a;2020-10-14 11:00:33来源&#xff1a;脚本之家阅读&#xff1a;89作者&#xff1a;Farmwang注意在寻找轮廓时要选择中寻找外层轮廓RETR_EXTERNAL#include "opencv/cv.h"#include "opencv/highgui.h"…

android 指定语言的资源,Android国际化多语言切换

最近工作中突然要求要项目进行国际化&#xff0c;之前没遇到过。但是也很简单呀&#xff0c;只需要把添加一个相应语言的的strings.xml的资源文件就好了&#xff0c;不是吗&#xff1f;这样只要切换系统语言就能切换app的文字语言了。但是由此引发了一个稍微深入一点的问题&…

Android 抖音爱心动画,Android实现抖音心形函数

刷抖音的时候,无意间刷到 心形函数的动画,觉得很有意思, 就简单的用Android的方式实现了一下.心形函数公式公式 :心形公式X的取值范围&#xff1a;[-1.81,1.81]&#xff0c;该取值范围是保证正弦函数有效取值范围。我们可以通过参数 a 的取值, 来形成不同的心形轮廓, 进而形成动…

android手机解除root,手机显示被root什么意思(手机root怎么解除)

手机root后有什么坏处&#xff1f;如何一键获取手机ROOT权限&#xff1f;在信息时代的大环境下&#xff0c;“黑科技”夺走了大部分的眼球&#xff0c;获取手机root属于所有安卓手机的最大黑科技&#xff0c;也是最基础的搞机技能&#xff0c;本篇就给大家讲解下手机root权限获…

Android11MIUI12,安卓11版MIUI12来了,3款已适配

原标题&#xff1a;安卓11版MIUI12来了&#xff0c;3款已适配现在安卓11系统第二个测试版升级更新都已经推送了&#xff0c;不知道各位有没有升级更新到安卓11系统体验一下新系统。不知道你的手机能不能升级安卓11系统&#xff0c;厂商有没有为你的手机适配安卓11系统&#xff…

html修改details范围,HTML details 标签

HTML 标签标签用于创建一个可展开折叠的元件&#xff0c;用户可以从中检索其他附加的信息。实例使用 元素&#xff1a;Copyright 1999-2011.- by Refsnes Data. All Rights Reserved.All content and graphics on this web site are the property of the company Refsnes Data.…

html中如何设计对话框,用纯css3和html制作泡沫对话框实现代码

现在&#xff0c;泡沫对话框是一种比较流行的趋势&#xff0c;一般都是用html和javascript&#xff0c;和或者图片来实现&#xff0c;今天用纯css3和html来实现一些基本的简单的泡沫对话框html代码如下&#xff1a;复制代码代码如下:The basic bubble variantsThis only needs …

html获取此次点击的id,github项目解析(八)--Activity启动过程中获取组件宽高的三种方式...

转载请标明出处&#xff1a;1片枫叶的专栏上1个github小项目中我们介绍了避免按钮重复点击的小框架&#xff0c;其实现的核心逻辑是重写OnClickListener的onClick方法&#xff0c;添加避免重复点击的逻辑&#xff0c;即为第2次点击与第1次点击的时间间隔添加阙值&#xff0c;若…

minitab怎么算西格玛水平_16:三因子二水平全因子实验设计和MINITAB应用训练

16&#xff1a;思慧慧咨询官网――精益生产、六西格玛黑带、绿带、TRIZ创新发明、实验设计DOE、价值工程、全面设备管理&#xff08;TPM&#xff09;培训和项目咨询​www.sihuide.com分享地址&#xff1a;千聊入口1 https://m.qlchat.com/topic/details?topicId20000087131743…

html css position,[CSS]CSS Position 详解

一. CSS position 属性介绍CSS中position属性指定一个元素(静态的&#xff0c;相对的&#xff0c;绝对或固定)的定位方法的类型。有static&#xff0c;relative&#xff0c;absolute和fixed四种取值&#xff0c;默认是static。二. position: staticstatic&#xff1a;没有定位&…

win2008无法用计算机名共享,Windows Server 2008 R2中文件共享

在网上找过很多次相关资料&#xff0c;还是自己整理一下吧。实践了才是自己的&#xff0c;只看永远是别人的。服务器&#xff1a;Server 2008 R2(IP&#xff1a;192.168.1.106)&#xff1b;客户端&#xff1a;Server 2008 R2(IP&#xff1a;192.168.1.107)一、 创建用户itjong运…

线性规划图解法求最优解_高中数学:简单的线性规划问题

1. 简单线性规划问题的有关概念先来看一道高考题&#xff1a;某公司招收男职员x名&#xff0c;女职员y名&#xff0c;x和y须满足约束条件&#xff0c;则的最大值是( )A. 80 B. 85 C. 90 D. 95(1)约束条件&#xff1a;变量x、y满足的一组条件&#xff0c;如上面高考题中的二元一…

在桌面关闭计算机关机不了怎么办,为什么我电脑按关机屏幕一直显示正在关机却一直关不了机怎么办...

“开始”-->“运行”-->键入“Regedit”-->“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\control\Shutdown子项&#xff0c;在右边窗口中新建一个"字符串值"&#xff0c;命名为"FastReboot",同时将"数值数据"设为0即可。如果还不行再…

spark-sql建表语句限制_SparkSQL

SparkSQL介绍Hive是Shark的前身&#xff0c;Shark是SparkSQL的前身,SparkSQL产生的根本原因是其完全脱离了Hive的限制。SparkSQL支持查询原生的RDD。 RDD是Spark平台的核心概念&#xff0c;是Spark能够高效的处理大数据的各种场景的基础。能够在scala中写SQL语句。支持简单的SQ…

计算机大作业论文意义,大学的大作业是什么?

原标题&#xff1a;大学的大作业是什么&#xff1f;大学里面的大作业一般就是课程设计之类的&#xff0c;一些老师会让学生做些课外实践的作业&#xff0c;作为平时成绩的一部分大作业听起来很高大上&#xff0c;然而好多课程其实只是一篇论文。论文类的就是有点水的了。毕竟学…

arduino智能浇花系统_arduino+水泵+继电器+RFID

arduino继电器电机应用场合&#xff1a;加湿器、自动浇花、智能门锁、报警系统.......总之很多场合都适用。本章就介绍利用RFID卡输入&#xff0c;驱动水泵。/* * ---------------------------------------------------------------------------------------------------------…

7段均衡器最佳调节图_超高级的吉他均衡器 更细腻的控制 你值得拥有

BOSS DD-200吉他均衡器最近 BOSS推出了一款全新的吉他均衡效果器&#xff0c;为了追求更细腻的控制&#xff0c;这一次的更新&#xff0c;EQ200 可以说做出了不少的颠覆性改进。面板上很直观的看到&#xff0c;EQ的推子增加到了10段&#xff0c;外加一个总音量&#xff0c;对于…

京瓷m5021cdn如何设置扫描_京瓷产品让您轻松应对潮湿天气

随着即将到来的四月&#xff0c;中国南方大部分地区也将伴随着雨季的到来。这也意味着很多复印件、打印机将会收到潮湿天气的影响&#xff0c;更容易出现卡纸、图像模糊等一系列问题。而京瓷公司最新推出的“黑金刚”系列增加了特有的感光鼓加热功能&#xff0c;有效减少机器受…

server sql 去 反斜杠_%00截断配合反序列化的奇妙利用

文章来源&#xff1a;安全客原文链接&#xff1a;%00截断配合反序列化的奇妙利用 - 安全客&#xff0c;安全资讯平台前言前段时间做了一个CTF题目&#xff0c;发现这道题目相当的精妙&#xff0c;主要是利用了%00的截断来绕过安全校验&#xff0c;最终利用反序列化达成目的。漏…

刷卡提示57能恢复吗_硬盘格式化之后数据还能恢复吗?

硬盘格式化之后数据还能恢复吗? 移动硬盘是工作生活中常用的一种存储介质&#xff0c;如果在其中存储了重要的数据&#xff0c;但是却因为中了病毒、人为删除或者不小心误删除文件或是格式化等而导致数据丢失该怎么办&#xff1f;移动硬盘数据可以恢复吗&#xff1f;如何进行移…