一维数组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,一经查实,立即删除!

相关文章

ktor框架用到了netty吗_Ktor-构建异步服务器和客户端的 Kotlin 框架

软件简介Ktor 是一个使用 Kotlin 以最小的成本快速创建 Web 应用程序的框架。Ktor 是一个用于在连接系统(connected systems)中构建异步服务器和客户端的 Kotlin 框架。它由 Kotlin团队创建&#xff0c;因此&#xff0c;它充分利用了 Kotlin 的语言特性&#xff0c;为开发者提供…

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"…

多层协议解析 c语言,基于DPI的应用层协议书解析.doc

专业资料精心整理摘要随着互联网在中国的迅速发展&#xff0c;全国各大网络运营商的网络规模都在不断扩张&#xff0c;网络结构日渐复杂&#xff0c;网络业务日趋丰富&#xff0c;网络流量高速增长&#xff0c;这使得网络管理的要求和难度都大大提高。因此&#xff0c;网络运营…

r4900g3系统安装linux_H3C UniServer R4900 G3服务器NVMe硬盘配置阵列方法以及相关操作...

一.配置NVMe硬盘的前期准备1. 安装Intel NVMe VROC 秘钥模块&#xff0c;该选件全称为H3C-RS3M1NVS-Intel NVMe VROC模块是一个硬件安装到主板上的NVMe SSD VROC模块接口上。Intel NVMe VROC 秘钥模块一共有如下三个版本&#xff1a;标准版&#xff1a;支持创建RAID 0、RAID 1和…

员工任务管理系统c语言,C语言职工信息管理系统课程设计任务书.docx

C语言课程设计任务书一、题目&#xff1a;职工信息管理系统二、目的和要求目的&#xff1a;要求熟练掌握C语言的基本知识和编辑技能&#xff1b;基本掌握结构化程序设计的基本思路和方法。要求&#xff1a;设计一个职工信息管理系统&#xff0c;使之能提供以下功能&#xff1a;…

android 判断 string 是否是字母数字,Android中判断字符串中必须包含字母或者数字...

public static boolean isLetterDigit(String str){boolean isDigit false;//定义一个boolean值&#xff0c;用来表示是否包含数字boolean isLetter false;//定义一个boolean值&#xff0c;用来表示是否包含字母for(int i0 ; iif(Character.isDigit(str.charAt(i))){ //用cha…

server 群辉emby_群晖容器中搭建支持硬件编码的Emby Server教程及注意事项

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我装的ubt20&#xff0c;intel显卡已经GVT-t直通给群晖虚拟机&#xff0c;再映射给EMBY的docker了&#xff0c;权限什么都给了&#xff0c;命令测试都正常一播放就只会选择软解&#xff0c;CPU100%&#xff0c;不知道怎么回事rootd…

笛卡尔心形函数表达式_如何用几何画板画笛卡尔心形函数

七夕节是个浪漫的节日&#xff0c;利用几何画板这个强大的绘图软件也可以对心爱的人表示&#xff01;笛卡尔心形线像极了人的一颗心&#xff0c;用来表达爱意再好不过了。本文我们来介绍具体步骤如下&#xff1a;1.新建参数。右键绘图区空白处&#xff0c;“新建参数”&#xf…

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

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

plotwidget横坐标日期_plotly详解(标签)x轴日期标签、y轴百分比标签设置

在作图中&#xff0c;我们需要根据自己的业务来更改x轴y轴的标签。注意&#xff0c;坐标轴的修改已经不算做画图了&#xff0c;因为他不是图上的线条或轨迹(trace)了&#xff0c;所以用layout来设置。1>显示或者不显示坐标轴标签。fig.update_layout(xaxis dict(visible Fa…

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

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

bch纠错码 码长8_密码学BCH纠错编码算法

1日止实验目的:通过实验熟练掌握BCH纠错编码算法&#xff0c;学会BCH纠错编码算法程序设计&#xff0c;提高C程序设计能力。实验要求:开发环境要求&#xff1a;软件环境&#xff1a;windows98/windowsXP/windows2000&#xff0c;C环境硬件环境&#xff1a;计算机(C, 512MRAM&am…

android属性动画缩放和平移同时,Android 实现属性动画平移,旋转,缩放,渐变 《H》...

以下代码直接使用点击事件调用即可平移ObjectAnimator translationX new ObjectAnimator().ofFloat(myyuan,"translationX",0,600f);ObjectAnimator translationY new ObjectAnimator().ofFloat(myyuan,"translationY",0,0);AnimatorSet animatorSet ne…

pytorch默认初始化_PyTorch的初始化

背景在使用PyTorch深度学习框架的时候&#xff0c;不管是训练还是测试&#xff0c;代码中引入PyTorch的第一句总是&#xff1a;import torch在Gemfield前述专栏文章里&#xff0c;我们已经得知&#xff0c;torch/csrc/stub.cpp链接libshm.so、libtorch_python.so、libcaffe2_gp…

android与web服务器建立连接失败,Android websocket连接失败

我正在开发一个简单的应用程序&#xff0c;它只是应该连接到websocket服务器并发送简单的文本消息。我使用nv-websocket-client作为websocket的库。我似乎无法连接到服务器。我使用wireshark来确定设备没有收到数据&#xff0c;也没有数据通过我使用过的任何端口进入&#xff0…

python安装imageio失败_pip install imgaug安装失败解决办法

(tensorflow-gpu) E:\学习\深度学习\Mask_RCNN-master>pip install imgaugCollecting imgaugUsing cached https://files.pythonhosted.org/packages/17/a9/36de8c0e1ffb2d86f871cac60e5caa910cbbdb5f4741df5ef856c47f4445/imgaug-0.2.9-py2.py3-none-any.whlCollecting sci…

android点击通知栏之后消失,为什么noftifications出现在android通知栏中一段时间​​然后消失...

我正在使用BroadCastReceiver,其中接收BOOT_COMPLETED操作.收到此广播后,会设置AlarmManager,此AlarmManager会触发通知&#xff1a;广播接收器的代码&#xff1a;package pit.opensource.events;import java.util.Calendar;import android.app.AlarmManager;import android.ap…

一键装机linux_(推荐)linux用一键安装包

linux一键安装包内置了XXD、apache, php, mysql这些应用程序&#xff0c;不需要再单独安装部署。从7.3版本开始&#xff0c;linux一键安装包分为32位和64位两个包&#xff0c;请大家根据操作系统的情况下载相应的包。一、安装1、将安装包直接解压到/opt目录下特别说明&#xff…

ios重签名shell脚本_iOS逆向——shell重签名及代码注入

感谢hank老师上一章我们讲了应用签名原理和重签名原理&#xff0c;不再赘述&#xff0c;没有看过的同学可以点这里——这章概述shell脚本重签名。可能有的同学认为有很多工具都能快速的帮助我们重签名实现需求&#xff0c;但我更希望在这里与大家沟通原理性的东西&#xff0c;而…

android微信支付服务端,Android 微信支付返回-1

本地服务端测试是可以拉起微信支付的&#xff0c;但是项目移到服务器上就不行呢&#xff1f;开放平台的app签名已经改了发布版的(签名是通过微信官方给的Gen_Signature_Android.apk获取的)&#xff0c;appid没换、APP_SECRET 也没换、商户密钥key也没换&#xff0c;证书更没换哈…