K-means算法C++实现

#include<bits/stdc++.h>
#define dimense 10
//10维数据
#define N 5005
#define MAX 0xffffff
#define clr(a) memset(a,0,sizeof(a))
using namespace std;
struct Point{
    double dir[dimense];
    int belong;
};
int num=5000;//数据量
int k=10;//k个中心
Point center[15];
Point data[N];
Point save[15][N];
int ct[15];

Point Mid(Point a[],int Num){
    Point mid;
    clr(mid.dir);
    for(int ii=0;ii<Num;ii++)
        for(int iii=0;iii<dimense;iii++){
            mid.dir[iii]+=a[ii].dir[iii];
        }
    for(int iii=0;iii<dimense;iii++)
        mid.dir[iii]/=Num;
    return mid;
}
double dis(Point a,Point b){
    double ret=0;
    for(int ii=0;ii<dimense;ii++){
        ret+=(a.dir[ii]-b.dir[ii])*(a.dir[ii]-b.dir[ii]);
    }
    return sqrt(ret);
}

int signate(Point a){
    double tmp=MAX;
    int pos;
    for(int ii=0;ii<k;ii++){
        if(dis(a,center[ii])<tmp)pos=ii,tmp=dis(a,center[ii]);
    }
    return pos;
}

double rec[N][15];
int sig[15];
int vis[N];

int main(){
    int i,j;
    clr(vis);
    clr(ct);
    freopen("In.txt","r",stdin);
    freopen("Out.txt","w",stdout);
    for(i=0;i<num;i++)
        for(j=0;j<dimense;j++)
            scanf("%lf",&data[i].dir[j]);
    srand(time(NULL));
    int tmp,cnt=0;
    while(cnt<k){
        tmp=rand()%num;
        if(vis[tmp])continue;
        else vis[tmp]=1,center[cnt++]=data[tmp];
    }
    for(i=0;i<k;i++){
        printf("第%d个中心:",i+1);
        for(j=0;j<dimense;j++){
            printf("%lf%c",center[i].dir[j],j==dimense-1?'\n':' ');
        }
    }

    for(i=0;i<num;i++){
        data[i].belong=signate(data[i]);
        save[data[i].belong][ct[data[i].belong]++]=data[i];
    }
    for(i=0;i<k;i++)
        printf("第%d个簇到底有多少个点%d\n",i+1,ct[i]);

    for(i=0;i<k;i++)
        center[i]=Mid(save[i],ct[i]);

    for(i=0;i<k;i++){
        printf("第%d个中心:",i+1);
        for(j=0;j<dimense;j++){
            printf("%lf%c",center[i].dir[j],j==dimense-1?'\n':' ');
        }
    }
    Point Last[15];
    for(i=0;i<k;i++)
        for(j=0;j<dimense;j++)
            Last[i].dir[j]=center[i].dir[j];
    int bre=1;
    int nnn=0;
    while(bre){
        nnn++;
        bre=0;
        clr(save);
        clr(ct);
        for(i=0;i<num;i++){
            data[i].belong=signate(data[i]);
            save[data[i].belong][ct[data[i].belong]++]=data[i];
        }
        for(i=0;i<k;i++)
            printf("第%d个簇到底有多少个点%d\n",i+1,ct[i]);

        for(i=0;i<k;i++)
            center[i]=Mid(save[i],ct[i]);

        for(i=0;i<k;i++){
            for(j=0;j<dimense;j++)
                if(Last[i].dir[j]!=center[i].dir[j]){
                    bre=1;
                    break;
                };
            if(bre==1)break;
        }
        for(i=0;i<k;i++)
            for(j=0;j<dimense;j++)
                Last[i].dir[j]=center[i].dir[j];

        for(i=0;i<k;i++){
            printf("第%d个中心:",i+1);
            for(j=0;j<dimense;j++){
                printf("%lf%c",center[i].dir[j],j==dimense-1?'\n':' ');
            }
        }
    }
    for(i=0;i<num;i++){
        printf("第%d个点属于第%d个簇\n",i+1,data[i].belong+1);
    }
    printf("次数%d\n",nnn);
    return 0;
}

复制去Google翻译翻译结果

时间: 2024-10-04 04:56:16

K-means算法C++实现的相关文章

K-means算法

K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧. 算法很简单,这么做就可以啦: 第一步:随机初始化每种类别的中心点,u1,u2,u3,--,uk; 第二步:重复以下过程: 然后 ,就没有然后了,就这样子. 太简单, 不解释.

DM里的K均值算法

1.Preface 因为一直在做的是聚类算法的研究,算是总结了一些心得,这里总结些知识性与思路性的东西,我想在其他地方也是很容易的找到类似的内容的.毕竟,世界就是那么小. 声明:本文比较不适合没有DM基础的人来阅读.我只是胡乱的涂鸦而已 2.聚类算法 在DM里的聚类算法里,有基于划分的算法,基于层次的算法,基于密度的算法,基于网格的算法,基于约束的算法. 其中每一种基于的算法都会衍生出一至几种算法,对应的每一种算法不管在学术界还是工业界都存在着许多的改进的算法 这里想介绍的是基于基于划分的算法里

k均值算法

import matplotlib.pyplot as plt import numpy as np import time from django.template.defaultfilters import center def loadDataSet(fileName): dataMat=[] fr=open(fileName) for line in fr.readlines(): curLine=line.strip().split('\t') fltLine=map(float,cu

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&amp;交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

聚类算法:K-means 算法(k均值算法)

k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设定,例如可选开始的$K$个模式样本的向量值作为初始聚类中心.      第二步:逐个将需分类的模式样本$\{x\}$按最小距离准则分配给$K$个聚类中心中的某一个$z_j(1)$.假设$i=j$时, \[D_j (k) = \min \{ \left\| {x - z_i (k)} \right\|

二分-k均值算法

首先我们都知道k均值算法有一个炒鸡大的bug,就是在很多情况下他只会收敛到局部最小值而不是全局最小值,为了解决这个问题,很多学者提出了很多的方法,我们在这里介绍一种叫做2分k均值的方法. 该算法首先将所有点作为一个簇,然后将该簇一分为二.之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于哪个簇的sse是最大值.上述基于sse的划分过程不断重复,直到得到用户指定的簇数目为止. 将所有的点看成一个簇,当粗的数目小于k时,对每一个簇计算总误差,在给定的粗上进行k均值聚类(k=2),计算将该粗一

K近邻算法

1.1.什么是K近邻算法 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属

K均值算法-python实现

测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点A,聚类个数k输出:k个聚类的中心点 随机选取k个初始的中心点repeat: 计算每个点和中心点的距离,将点分配给最近的中心簇中 计算Ck,更新簇的中心点until 中心点稳定 -----------------------------'''import sysimport randomimport