昨晚在脑内推导了一晚上的概率公式,没推导出来,今早师姐三言两语说用K-Means解决,太桑心了,昨晚一晚上没睡好。
小笨鸟要努力啊,K-Means,最简单的聚类算法,好好实现一下。
思路:
共有M个样本,设定K值作为样本的聚类个数(K值的设定很讲究,我还没去研究)。
随机产生K个点作为初始的 类核心。
do{
计算M个样本与K个类核心的距离,取距离最小的类核心为该样本的 类别。
聚一次结束后,根据每个类的样本,计算 聚类的 新 类核心。
}while(所有的类核心都没有变化,即该系统已经达到稳态,在继续循环下去也是同样的结果);
疑问:
收敛条件,是否能够设定为所有样本距离其类核心的距离和不在变小?
实现代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <limits.h> typedef struct Node{
double x;
double y;
int group;
}Node;
#define NodeNum 50
#define k 10 int main(){
FILE* f = fopen("in.txt","w+");
FILE* f2 = fopen("out.txt","w+");
srand((int)time());
Node node[NodeNum];
for(int i = ; i < NodeNum ; i++){
node[i].x = +(int)(20.0*rand()/(RAND_MAX+1.0));
node[i].y = +(int)(20.0*rand()/(RAND_MAX+1.0));
}
for(int i = ; i < NodeNum ; i++){
printf("x = %.1lf , y = %.1lf\n",node[i].x , node[i].y);
fprintf(f,"%.1lf\t%.1lf\n",node[i].x , node[i].y);
} Node circle[k];
for(int i = ; i < k ; i++){
circle[i].x = +(int)(20.0*rand()/(RAND_MAX+1.0));
circle[i].y = +(int)(20.0*rand()/(RAND_MAX+1.0));
}
for(int i = ; i < k ; i++){
printf("circle X= %.1lf , circle Y = %.1lf\n",circle[i].x , circle[i].y);
fprintf(f,"%.1lf\t%.1lf\n",circle[i].x , circle[i].y);
} int times = ;
bool change = false;
do{
double sumDis = ;
for(int i = ; i < NodeNum ; i++){
double minDis = INT_MAX;
for(int j = ; j < k ; j++){
double curDis = pow((double)abs(node[i].x - circle[j].x),) +
pow((double)abs(node[i].y - circle[j].y),);
if(curDis < minDis){
minDis = curDis;
node[i].group = j;
}
}
sumDis += minDis;
} int newX[k] = {},newY[k] = {};
for(int j = ; j < k ; j++){
int tempX = , tempY = ,count = ;
for(int i = ; i < NodeNum ; i++){
if(node[i].group == j){
count++;
tempX += node[i].x;
tempY += node[i].y;
}
}
newX[j] = tempX * 1.0 / count;
newY[j] = tempY * 1.0 / count;
}
change = false;
for(int i = ; i < k ; i++){
if(abs(circle[i].x - newX[i]) > 0.00001 || abs(circle[i].y - newY[i]) > 0.00001 ){
change = true;
break;
}
}
if(change){
for(int i = ; i < k ; i++){
circle[i].x = newX[i];
circle[i].y = newY[i];
}
}
printf("times = %d \t ************************* sumDis = %.5lf \n" , times++ , sumDis);
/*for(int i = 0 ; i < NodeNum ; i++){
printf("x = %.1lf , y = %.1lf , group = %d \n",node[i].x , node[i].y , node[i].group);
fprintf(f2,"%.1lf\t%.1lf\t%d\n",node[i].x , node[i].y , node[i].group);
}*/
for(int m = ; m < k ; m++){
printf("circle X = %.1f , circle Y = %.1f\n",circle[m].x , circle[m].y);
fprintf(f2,"%.1lf\t%.1lf\n",circle[m].x , circle[m].y);
}
}while(change); return ;
}
K-Means(K均值)算法的更多相关文章
-
聚类算法:K-means 算法(k均值算法)
k-means算法: 第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...
-
一句话总结K均值算法
一句话总结K均值算法 核心:把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定. k均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...
-
聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...
-
【机器学习】K均值算法(II)
k聚类算法中如何选择初始化聚类中心所在的位置. 在选择聚类中心时候,如果选择初始化位置不合适,可能不能得出我们想要的局部最优解. 而是会出现一下情况: 为了解决这个问题,我们通常的做法是: 我们选取K ...
-
【机器学习】K均值算法(I)
K均值算法是一类非监督学习类,其可以通过观察样本的离散性来对样本进行分类. 例如,在对如下图所示的样本中进行聚类,则执行如下步骤 1:随机选取3个点作为聚类中心. 2:簇分配:遍历所有样本然后依据每个 ...
-
Bisecting KMeans (二分K均值)算法讲解及实现
算法原理 由于传统的KMeans算法的聚类结果易受到初始聚类中心点选择的影响,因此在传统的KMeans算法的基础上进行算法改进,对初始中心点选取比较严格,各中心点的距离较远,这就避免了初始聚类中心会选 ...
-
KMeans (K均值)算法讲解及实现
算法原理 KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标 ...
-
聚类分析K均值算法讲解
聚类分析及K均值算法讲解 吴裕雄 当今信息大爆炸时代,公司企业.教育科学.医疗卫生.社会民生等领域每天都在产生大量的结构多样的数据.产生数据的方式更是多种多样,如各类的:摄像头.传感器.报表.海量网络 ...
-
K均值算法
为了便于可视化,样本数据为随机生成的二维样本点. from matplotlib import pyplot as plt import numpy as np import random def k ...
-
K均值算法-python实现
测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点 ...
随机推荐
-
Linux下hostname与hosts
参考:http://wp.fungo.me/linux/what-the-hell-is-hostname.html hostname 就是机器名,内核中的一个变量,可临时修改也可以永久修改 /etc ...
-
Bootstrap IIFE
在Bootstrap源码(具体请看<Bootstrap源码解析>)和其他jQuery插件经常看到如下的写法: +function ($) { }(window.jQuery); 这种写法称 ...
-
十天学会单片机Day0点亮LED (锁存器、三极管、继电器)
C51常用的数据类型 数据类型 关键字 所占位数 表示数范围 无符号字符型 unsigned char 8 0~255 有符号字符型 char 8 -128~127 无符号整型 unsigned in ...
-
.Net码农学Android---系统架构和基本概念
至此,你应该已经完成以下前期准备事情: 1.安装完JDK 2.安装完SDK(并在Manager中进行相关版本的更新) 3.相关IDE(如eclipse) 4.安装完ADT 5.安装完AVD(如果你是真 ...
-
npm更换淘宝镜像
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...
-
vim中选择匹配文本删除技巧
试举几例如下: 如何只保留匹配内容行而删除其他行? :v/pattern/d :help :v 如何对每行只保留匹配内容而删除这一行中的其它内容 :%s/^.pattern.$/\1/g 删除包含特定 ...
-
MySQL的索引
MySQL索引 索引:是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.其可以加快数据读操作,但会使数据写操作变慢:应该构建在被用作查询条 ...
-
linux vim taglist config
"vim config .vimrc "taglist map <silent> <F10> :TlistToggle let tlist_php_sett ...
-
DevOps探索
devops最近随着docker的升温而被越来越多的人所吸引!最近因项目所需投身到devops的项目当中,经过初步的实践搞出一套 paas平台的devops,这个平台现在还需要检验! 作为一个dev, ...
-
ST-2
1.第一个程序没有覆盖到下表为0的数.第二个程序找到的是x中第一个等于0的数的下标. 2.对于第一个程序:x = [2,3,5], y = 3 对于第二个程序:X = [2,0,6] 3.对于两个程序 ...