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

轻量级替代方案:用AIFlowy + Ollama在本地快速搭建一个可用的AI智能体平台

本文介绍了如何使用AIFlowy和Ollama在本地快速搭建轻量级AI智能体平台,涵盖从环境准备到智能体集成的全流程。通过简化部署步骤和优化性能,15分钟内即可完成搭建,适用于原型验证和小团队协作,显著提升开发效率。

weixin_29207533的博客 222

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 459

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

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

waitingforone的博客 1671

Mplus实战:如何用交叉滞后面板模型(CLPM)分析心理学纵向数据?

本文提供了在Mplus软件中应用交叉滞后面板模型(CLPM)分析心理学纵向数据的实战指南。文章详细拆解了CLPM的核心概念、Mplus语法框架,并涵盖从基础的两变量模型到多变量、潜变量建模的扩展,以及结果解读与常见陷阱规避,旨在帮助研究者利用这一经典工具有效探索变量间的动态预测关系。

weixin_29253711的博客 405

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

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

懂幸福,爱生活 3万+

jemalloc实战:5分钟搞定C程序内存泄漏检测(附PDF报告生成技巧)

本文详细介绍了使用jemalloc的heap profiling功能快速检测C/C++程序内存泄漏的实战方法。通过预编译库和LD_PRELOAD注入,无需修改代码即可启动低开销剖析,并利用jeprof工具进行深度分析和生成可视化PDF报告,帮助开发者高效定位线上或开发环境中的内存问题。

i3j4k5的博客 227

HPE磁盘阵列管理04——MSA事件

本文介绍了HPE MSA存储系统的事件处理机制,重点分析了常见磁盘故障事件及其解决方案。文章首先定义了MSA事件的五个严重级别(严重、错误、警告、信息和解决),然后详细列举了多个典型事件案例(如事件1、3、6、8、172等),包括每种事件的触发条件、对系统的影响以及具体修复步骤。针对磁盘故障场景,文章提供了更换磁盘、重建磁盘组、取消隔离等操作建议,并强调应及时配置备用磁盘以降低数据风险。最后指出更详细的事件说明可参考《MSA事件描述参考指南》,并提供了HPE官方手册下载链接。全文为技术人员处理MSA存储故障

istrangeboy&begin zero的博客 1123

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

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

probie的博客 2374

PSIM仿真实战:反激电源从设计到调试的完整流程(附短路保护配置)

本文详细介绍了使用PSIM仿真工具进行反激电源从设计到调试的完整流程,包括变压器参数设计、功率器件选型、动态特性调试以及短路保护配置。通过实战案例和仿真技巧,帮助工程师提前暴露并解决设计中的常见问题,如负载突变、输入电压波动和短路保护失效等,显著降低硬件试错成本。

weixin_29216353的博客 244

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

第21章—技术管理篇(上):身为技术人该怎样带好团队并做好管理者

上节讲了职业规划和学习提升这两个话题,随着职业规划的不断落地,或者自己能力的不断提升,大家也会逐渐被提拔成“职级更高”的人。企业规模扩张时,员工数量也会变多,意味着Boss需要更多的人来辅助管理,而管理者会从外部招聘吗?也许会,但大多企业更喜欢从内部选拔,毕竟人的天性更希望找的人值得信赖。此时,一些能力不错、做事靠谱的老员工,就会被“赶上”管理者的位子。作管理不难,但想要“”就需要一定情商。

运维老生常谈 1367

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[C++] Kmeans算法实现

kmeans

weixin_44179561的博客 4154

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

qq_40692109的博客 4556

聚类算法-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-NN (一)

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

cv_pyer的博客 1115

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

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

Bonnie的专栏 7619

【模式识别】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、付费专栏及课程。

余额充值