K均值聚类(C++)

  1 #include<math.h>
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<iostream>
  5 using namespace std;
  6 void kmeans(int n, float* xy, int k, float* cxy)
  7 {
  8     int i,j;
  9     for(i=0;i<k;i++)
 10     {
 11         cxy[2*i]=xy[2*i];
 12         cxy[2*i+1]=xy[2*i+1];
 13     }
 14
 15     int* mindis=(int*)malloc(n*sizeof(int));
 16     int* premindis=(int*)malloc(n*sizeof(int));
 17     for(i=0;i<n;i++)
 18     {
 19         mindis[i]=-1;
 20     }
 21     int change=1;
 22
 23     while(change)
 24     {
 25         for(i=0;i<n;i++)
 26         {
 27             premindis[i]=mindis[i];
 28         }
 29         for(i=0;i<n;i++)
 30         {
 31             float min=9999;
 32             for(j=0;j<k;j++)
 33             {
 34                 double s=sqrt((xy[2*i]-cxy[2*j])*(xy[2*i]-cxy[2*j])+(xy[2*i+1]-cxy[2*j+1])*(xy[2*i+1]-cxy[2*j+1]));
 35                 if(s<min)
 36                 {
 37                     min=s;
 38                     mindis[i]=j;
 39                 }
 40             }
 41         }
 42
 43         /*
 44         for(i=0;i<2;i++)
 45         {
 46             printf("%.3f ",cxy[2*i]);
 47             printf("%.3f\n",cxy[2*i+1]);
 48         }
 49         */
 50
 51         for(i=0;i<k;i++)
 52         {
 53             int num=0;
 54             float s0=0.0;
 55             float s1=0.0;
 56             //cout<<i<<":";
 57             for(j=0;j<n;j++)
 58             {
 59                 if(mindis[j]==i)
 60                 {
 61                     num++;
 62                     //cout<<j<<" ";
 63                     s0+=xy[2*j];
 64                     s1+=xy[2*j+1];
 65                 }
 66             }
 67             if(num)
 68             {
 69                 cxy[2*i]=s0/num;
 70                 cxy[2*i+1]=s1/num;
 71             }
 72             //cout<<endl;
 73         }
 74         int flag=0;
 75         for(i=0;i<n;i++)
 76         {
 77             if(mindis[i]!=premindis[i])
 78             {
 79                 flag=1;
 80                 break;
 81             }
 82         }
 83         if(flag==0)
 84             change=0;
 85     }
 86
 87
 88 }
 89 int main()
 90 {
 91     float xy[12]={1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 4.0, 5.0, 5.0, 4.0, 4.0, 4.0};
 92     float cxy[4]={0.0, 0.0, 0.0, 0.0};
 93     kmeans(6,xy,2,cxy);
 94     int i;
 95     for(i=0;i<2;i++)
 96     {
 97         printf("%.3f ",cxy[2*i]);
 98         printf("%.3f\n",cxy[2*i+1]);
 99     }
100     return 0;
101 }

时间: 2024-10-04 07:25:22

K均值聚类(C++)的相关文章

第十篇:K均值聚类(KMeans)

前言 本文讲解如何使用R语言进行 KMeans 均值聚类分析,并以一个关于人口出生率死亡率的实例演示具体分析步骤. 聚类分析总体流程 1. 载入并了解数据集:2. 调用聚类函数进行聚类:3. 查看聚类结果描述:4. 将聚类结果图形化展示:5. 选择最优center并最终确定聚类方案:6. 图形化展示不同方案效果并提交分析报表. 人口出生/死亡率聚类分析 - K均值聚类 1. 载入并了解数据集 1.1 从网上下载一份txt格式的关于人口出生率统计的数据(countries.txt).其内容大致如下

机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定,可视化数据分布,直观确定即可): 2 遍历数据集的每个实例,计算其到每个质心的相似度,这里也就是欧氏距离:把每个实例都分配到距离最近的质心的那一类,用一个二维数组数据结构保存,第一列是最近质心序号,第二列是距离: 3 根据二维数组保存的数据,重新计算每个聚簇新的质心: 4 迭代2 和 3,直到收敛

k-均值聚类算法;二分k均值聚类算法

根据<机器学习实战>一书第十章学习k均值聚类算法和二分k均值聚类算法,自己把代码边敲边理解了一下,修正了一些原书中代码的细微差错.目前代码有时会出现如下4种报错信息,这有待继续探究和完善. 报错信息: Warning (from warnings module): File "F:\Python2.7.6\lib\site-packages\numpy\core\_methods.py", line 55 warnings.warn("Mean of empty

机器学习--k均值聚类(k-means)算法

一.基本原理 分类是指分类器根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类.分类被称为监督学习.如果训练集的样本没有标注类别,那么就需要用到聚类.聚类是把相似的样本聚成一类,这种相似性通常以距离来度量.聚类被称为无监督学习. 聚类是指根据"物以类聚"的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程.它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似.与分类规则不同,进行聚类前并不知道

机器学习实战笔记-利用K均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好 簇识别给出聚类结果的含义.假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么.聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样.因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification ). 聚类分析试图将相似对象归人同一簇,将不相似对象归到不

Win8 Metro(C#)数字图像处理--2.52图像K均值聚类

原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类 ?? [函数名称] ??图像KMeans聚类??????KMeansCluster(WriteableBitmap?src,int?k) /// <summary> /// KMeans Cluster process. /// </summary> /// <param name="src">The source image.</param> /// <pa

机器学习之路:python k均值聚类 KMeans 手写数字

python3 学习使用api 使用了网上的数据集,我把他下载到了本地 可以到我的git中下载数据集: https://github.com/linyi0604/MachineLearning 代码: 1 import numpy as np 2 import pandas as pd 3 from sklearn.cluster import KMeans 4 from sklearn import metrics 5 6 ''' 7 k均值算法: 8 1 随机选择k个样本作为k个类别的中心

k均值聚类

目录 一.k均值简介 二.应用简介 三.算法 四.选择合适的K 五.具体实例 一.k均值简介 K均值聚类是一种无监督学习,对未标记的数据(即没有定义类别或组的数据)进行分类. 该算法的目标是在数据中找到由变量K标记的组.该算法迭代地工作基于所提供的特征,将每个数据点分配给K个组中的一个. 基于特征相似性对数据点进行聚类. K均值聚类算法的结果是: 1.K簇的质心,可用于标记新数据 2.训练数据的标签(每个数据点分配给一个集群) 二.应用简介 K均值聚类算法用于查找未在数据中明确标记的组.这可用于

[机器学习][K-Means] 无监督学习之K均值聚类

有监督学习虽然高效.应用范围广,但最大的问题就是需要大量的有标签的数据集,但现实生活中我们遇到的大量数据都是没有明确标签的,而且对于庞大的数据集进行标注工作本身也是一项费时费力的工作模式,所以我们希望找到一种方法能自动的挖掘数据集中各变量的关系,然后"总结"出一些规律和特征进行分类,这样的方法我们成为无监督学习(Unsupervised learning). 在无标签的数据集中进行分类的方法成为聚类.顾名思义,聚类就是依照某种算法将相似的样本聚在一起形成一类,而不管它的标签是什么.在聚

聚类之K均值聚类和EM算法

这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means)是一种基于中心的聚类算法,通过迭代,将样本分到K个类中,使得每个样本与其所属类的中心或均值的距离之和最小. 1.定义损失函数 假设我们有一个数据集{x1, x2,..., xN},每个样本的特征维度是m维,我们的目标是将数据集划分为K个类别.假定K的值已经给定,那么第k个类别的中心定义为μk,k=1