K-menas聚类算法C++实现

聚类算法-K-means-C++实现 程序流程图: K-means核心功能函数,首先,随机选择K-中心点(中心点坐标为簇中所有点的x坐标的平均值,y坐标的平均值,该点用于记录位置,不属于原始数据集);循环判断中心点是否不变,若是,将二维点对信息写入clustering文件,程序结束。否则,对于每个二维数据点,选择与其距离最近的中心点,将点cluster编号更新为中心点的cluster编号。然后对于K-簇,重新计算K-中心点, 阅读详情

基本介绍: k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。 工作过程:   k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 (1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;   (2) 循环(3)到(4)直到每个聚类不再发生变化为止   (3) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;   (4) 重新计算每个(有变化)聚类的均值(中心对象)   k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。   k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。   计算复杂度:   O(nkt), 其中t是迭代次数。   k-means算法是一种基于样本间相似性度量的间接聚类方法,属于非监督学习方法。此算法以k为参数,把n 个对象分为k个簇,以使簇内具有较高的相似度,而且簇间的相似度较低。相似度的计算根据一个簇中对象的平均值(被看作簇的重心)来进行。此算法首先随机选择k个对象,每个对象代表一个聚类的质心。对于其余的每一个对象,根据该对象与各聚类质心之间的距离,把它分配到与之最相似的聚类中。然后,计算每个聚类的新质心。重复上述过程,直到准则函数会聚。k-means算法是一种较典型的逐点修改迭代的动态聚类算法,其要点是以误差平方和为准则函数。逐点修改类中心:一个象元样本按某一原则,归属于某一组类后,就要重新计算这个组类的均值,并且以新的均值作为凝聚中心点进行下一次象元素聚类;逐批修改类中心:在全部象元样本按某一组的类中心分类之后,再计算修改各类的均值,作为下一次分类的凝聚中心点。 

/*kmeans算法实现(此处只考虑元组只有两个属性的情况)
*@File:k_means.cpp
*@Author:Cai0538
*@Create:2011-12-10
*@Last Modified:2011-12-10
*/
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#define k 3
using namespace std;
//存放元组的属性信息
struct Tuple{
	float attr1;
	float attr2;
};
//计算两个元组间的欧几里距离
float getDistXY(Tuple t1, Tuple t2) 
{
	return sqrt((t1.attr1 - t2.attr1) * (t1.attr1 - t2.attr1) + (t1.attr2 - t2.attr2) * (t1.attr2 - t2.attr2));
}
 
//根据质心,决定当前元组属于哪个簇
int clusterOfTuple(Tuple means[],Tuple tuple){
	float dist=getDistXY(means[0],tuple);
	float tmp;
	int label=0;//标示属于哪一个簇
	for(int i=1;i<k;i++){
		tmp=getDistXY(means[i],tuple);
		if(tmp<dist) {dist=tmp;label=i;}
	}
	return label;	
}
//获得给定簇集的平方误差
float getVar(vector<Tuple> clusters[],Tuple means[]){
	float var = 0;
	for (int i = 0; i < k; i++)
	{
		vector<Tuple> t = clusters[i];
		for (int j = 0; j< t.size(); j++)
		{
			var += getDistXY(t[j],means[i]);
		}
	}
	//cout<<"sum:"<<sum<<endl;
	return var;
 
}
//获得当前簇的均值(质心)
Tuple getMeans(vector<Tuple> cluster){
	
	int num = cluster.size();
	double meansX = 0, meansY = 0;
	Tuple t;
	for (int i = 0; i < num; i++)
	{
		meansX += cluster[i].attr1;
		meansY += cluster[i].attr2;
	}
	t.attr1 = meansX / num;
	t.attr2 = meansY / num;
	return t;
	//cout<<"sum:"<<sum<<endl;
	
 
}
void KMeans(vector<Tuple> tuples){
	vector<Tuple> clusters[k];
	Tuple means[k];
	int i=0;
	//默认一开始将前K个元组的值作为k个簇的质心(均值)
	for(i=0;i<k;i++){
		means[i].attr1=tuples[i].attr1;
		means[i].attr2=tuples[i].attr2;
	}
	int lable=0;
	//根据默认的质心给簇赋值
	for(i=0;i!=tuples.size();++i){
		lable=clusterOfTuple(means,tuples[i]);
		clusters[lable].push_back(tuples[i]);
	}
	//输出刚开始的簇
	for(lable=0;lable<3;lable++){
		cout<<"第"<<lable+1<<"个簇:"<<endl;
		vector<Tuple> t = clusters[lable];
		for (i = 0; i< t.size(); i++)
		{
			cout<<"("<<t[i].attr1<<","<<t[i].attr2<<")"<<"   ";
		}	
		cout<<endl;
	}
	float oldVar=-1;
	float newVar=getVar(clusters,means);
	while(abs(newVar - oldVar) >= 1) //当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止
	{
		
		for (i = 0; i < k; i++) //更新每个簇的中心点
		{
			means[i] = getMeans(clusters[i]);
			//cout<<"means["<<i<<"]:"<<means[i].attr1<<"  "<<means[i].attr2<<endl;
		}
		oldVar = newVar;
		newVar = getVar(clusters,means); //计算新的准则函数值
		for (i = 0; i < k; i++) //清空每个簇
		{
			clusters[i].clear();
		}
		//根据新的质心获得新的簇
		for(i=0;i!=tuples.size();++i){
			lable=clusterOfTuple(means,tuples[i]);
			clusters[lable].push_back(tuples[i]);
		}
		//输出当前的簇
		for(lable=0;lable<3;lable++){
			cout<<"第"<<lable+1<<"个簇:"<<endl;
			vector<Tuple> t = clusters[lable];
			for (i = 0; i< t.size(); i++)
			{
				cout<<"("<<t[i].attr1<<","<<t[i].attr2<<")"<<"   ";
			}	
			cout<<endl;
		}
	}
	
}
int main(){
 
	char fname[256];
	cout<<"请输入存放数据的文件名: ";
	cin>>fname;
	cout<<endl;
	ifstream infile;
	infile.open(fname,ios::in);
	if(!infile){
		cout<<"不能打开输入的文件"<<fname<<endl;
		return 0;
	}
	int count=0;
	vector<Tuple> tuples;
	Tuple tuple;
	//从文件流中读入数据
	while(!infile.eof()){
		count++;
		if(count%2==1) infile>>tuple.attr1;
		else {
			infile>>tuple.attr2;
			tuples.push_back(tuple);
		}
	}
	//int k;
	//cout<<"请输入期望的簇的个数:"
	//cin>>k;
	//cout<<endl;
 
	//输出文件中的元组信息
	for(vector<Tuple>::size_type ix=0;ix!=tuples.size();++ix)
		cout<<"("<<tuples[ix].attr1<<","<<tuples[ix].attr2<<")"<<"    ";
    cout<<endl;
	KMeans(tuples);
	return 0;
}

原文转自:https://blog.youkuaiyun.com/cai0538/article/details/7061922

点云 K-Means聚类算法 (附c++代码) 在诸多的聚类方法中,K-Means聚类方法是属于“基于原型的聚类”(也称为原型聚类)的方法,此类方法均是假设聚类结构能通过一组原型刻画,在现实聚类中极为常用。通常情况下,该类算法会先对原型进行初始化,然后再对原型进行迭代更新求解。采用不同的原型表示、不同的求解方式,也将会产生不同的算法。 阅读详情

相关推荐

K-Means聚类算法---C++

在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。

qq_40464599的博客 3461

kmeans聚类算法C++实现

kmeans算法实现和动态演示

crazybobo1207的博客 1112

C/C++ 聚类K-means cluster算法详解及源码

K-means聚类算法是一种基于距离的聚类方法,其主要思想是根据样本之间的相似性进行聚类。该算法将数据集分为K个簇,每个簇都以质心来表示。K-means聚类算法是一种基于距离的聚类方法,其主要思想是根据样本之间的相似性进行聚类。该算法将数据集分为K个簇,每个簇都以质心来表示。K-means聚类算法是一种基于距离的聚类方法,其主要思想是根据样本之间的相似性进行聚类。该算法将数据集分为K个簇,每个簇都以质心来表示。K-means聚类算法是一种基于距离的聚类方法,其主要思想是根据样本之间的相似性进行聚类。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2039

K-均值聚类(K-Means) C++代码实现

        K-均值聚类(K-Means)简介可以参考: http://blog.youkuaiyun.com/fengbingchun/article/details/79276668      以下是K-Means的C++实现,code参考OpenCV 3.3中的cv::kmeans函数,均值点初始化的方法仅支持KMEANS_RANDOM_CENTERS。        以下是从数据集MNIST中提取...

网络资源是无限的 4183

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 562

用Python对CAPM和Fama French Three Factor model的初步学习

用Python对CAPM和Fama French Three Factor model的初步学习概述介绍建模与分析CAPMFama French Three-Factor Model总结 概述 本文主要使用CAPM(资本资产定价模型)和Fama French Three Factor model来评估中国股票市场的股票价格。 使用CAPM来选择投资组合,然后建立Fama法国三因素模型来评估投资组合...

weixin_43168138的博客 5464

K-means算法的c++代码实现

简单实现K-means算法的c++代码实现

waitingforone的博客 1671

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 492

【机器学习实战之三】:C++实现K-均值(K-Means)聚类算法

聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类(类别体系是自动构建的)。聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好。本文要介绍一种称为K-均值(K-means)聚类的算法。之所以称之为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。

懂幸福,爱生活 3万+

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1413

LoveSQL

LoveSQL(SQL注入详解) 1、根据题目,显然想到的是sql注入漏洞,直接尝试万能密码 2、此时url构造,查看字段数 /check.php?username=admin' order by 3%23&password=1 # 存在 /check.php?username=admin' order by 4%23&password=1 # 报错 因此,得到总共有三个字段数 注意:url中不能用#,应该用url编码%23 3、用union来查询测试注入点,查看回显点

lunan的博客 1562

简单的KMeans聚类C++代码实现及解析

KMeans是一种无监督学习方法,通常用于没有任何标记的数据的分类。它的目标是将数据分为k类或者k组。通过不断地迭代将每个点根据特征相似度分配给k个类别中的某一类。 GitHub看到一个C++实现KMeans的代码,具体实现如下(这个代码有一个问题是需要外部传参给main函数,指示数据文件和k的具体值。如果想直接在vs中运行需要对代码进行一定的更改,将main函数中的参数和内部一些解析参数命令删掉...

probie的博客 2374

想在 Visual Studio Code 里进行 ABAP 开发,需要安装的扩展列表

安装完毕后,我们可以将 SAP 系统配置为 Visual Studio Code 连接的远程文件系统。为了连接到 SAP 系统,需要启用 ABAP 开发工具 (ADT) ICF 节点,这与 SAP Hana Studio 等工具使用的服务相同。打开 SAP GUI 并连接到目标系统,运行事务 SICF,然后激活 ADT_SRV 服务,如下所示。这启用了允许代码编辑器和 IDE 连接到 SAP 系统的服务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3125

kmeans聚类 c++实现

/* num_class: 聚类数 num_data:数据个数 dimension:数据维度(每个数据是多少维的) data:待聚类数据指针 cluster_center:聚类中心指针 max_error:前后两次误差降低到此值迭代终止 max_iters:最大迭代次数 1、随机初始化聚类中心 2、根据聚类中心计算每个样本属于哪个聚类中心 3、根据聚出来数据重新计算每个类新的聚类中心 重复2,3步骤 */ void kmeans_cluster(const int num_class, const in.

想要游向大海的鱼 499

k8s上分离集群seatunnel部署(生产推荐)

k8s上分离集群seatunnel部署(生产推荐)

寂夜了无痕的博客 890

Electron - Electron failed to install correctly, please delete node_modules/electron and try install

Electron安装失败:Electron failed to install correctly, please delete node_modules/electron and try installing again,electron安装报错:Electron failed to install correctly...解决方案,Electron 未能正确安装,请删除 node_modules/electron,然后再次尝试安装,如何解决这个问题,手把手教你解决,在yarn dev时报错,electr

🏆 前端领域优质创作者 4370

[C++] Kmeans算法实现

kmeans

weixin_44179561的博客 4154

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

K-means聚类算法C++实现

#include<stdio.h> #include<iostream> #include<fstream> #include<string> #include<sstream> #include<math.h> #include<cstdlib> #include<time.h> //clock() using namespace std; //创建动态数组 int *aarray1(int m) { .

wjk137381的博客 717

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

K-means聚类算法原理及c++实现

聚类是指根据数据本身的特征对数据进行分类,不需要人工标注,是无监督学习的一种。k-means算法是聚类算法中最简单的算法之一。 k-means 算法将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。 基于这样一个假设,我们再来导出k-means所要优...

qq_40692109的博客 4556

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

聚类算法-DBSCAN-C++优化算法

聚类算法-DBSCAN-C++优化算法 在聚类算法-DBSCAN-C++实现的基础上做了优化,优化前本人测试对900左右个点进行聚类,用时2000ms左右,经过优化后的算法用时在100ms左右,提升了近20倍。 优化前主要耗时的地方: float squareDistance(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } 这个函数涉及到平方和再开方,在做聚类时,每一次循环都在调用它,并且聚类算法中含有很

Power392413的博客 1768

数据挖掘算法学习(一)K-Means算法

算法简介: K-Means算法是输入聚类个数k,以及包含n个数据对象的数据库,输出满足方差最小标准的k个聚类。并使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中 对象相似度较小。 算法假设: 均方误差是计算群组分散度的最佳参数。 算法输入: 聚类个数k;

Bonnie的专栏 7619

机器学习实战笔记:k-means和k-NN (一)

监督学习和无监督学习 对于很多和我一样的朋友们,作为一个机器学习的初学者,在刚开始接触这两个算法的时候,总是弄不清楚这两者的区别。因此,今天特意专门写一篇文章来阐述这两个算法的原理以及实践,在巩固自己学习知识的同时,能让更多的初学者能够理解这两个算法。 首先我们要理解什么是监督学习和无监督学习。监督学习就是最常见的分类问题(注意和聚类区分),通过已有的训练样本(即已知数据机器对应的输出)去训练...

cv_pyer的博客 1115

【模式识别】C++实现K-means算法

一、问题描述 试用K均值法对如下模式分布进行聚类分析: {x1(0, 0),x2(3,8),x3(2,2),x4(1,1),x5(5,3),x6(4,8),x7(6,3),x8(5,4),x9(6,4),x10(7,5)} 二、算法介绍 对于本次算法程序,我将其分为以下几个部分: 1、变量定义: ...

qq_50688324的博客 3720

【C++】Keans聚类算法的C++实现

Kmeans算法的实现步骤: 1、从D中随机取k个元素,作为k个簇的各自的中心。 2、分别计算剩下的元素到k个簇中心的相异度(元素到簇中心的欧氏距离),将这些元素分别划归到相异度最低的簇。 3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数。 4、将D中全部元素按照新的中心重新聚类。 5、重复第4步,直到聚类结果不再变化。 6、将结果输出。inclu

长相忆兮长相忆的专栏 1670

Kmean聚类算法(c++实现)

c++实现的Kmeans聚类算法

weixin_51580530的博客 927
上一篇: .h文件和.hpp文件的区别描述
下一篇: 图像分割
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值