C++实现一维数据kmeans分类

本文介绍了一种使用K-means算法进行数据聚类的方法,通过实例演示了如何将一维数组中的元素分为三个类别。算法首先选取数组中前k个元素作为初始聚类中心,然后计算每个元素到各个聚类中心的距离,将其归类到最近的中心,并更新中心值,直至聚类中心不再变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int arr[] = {500,550,531,460,580,100,30,560,40,900,400};

将arr[]中的元素分为三类:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

class mL
{
public:

	void kmeans(vector<int> &sample, int k)
	{
		int len = sample.size();
		vector<int> meanValue(k, 0);
		
		//初始化均值,取待分类的前k个,作为初始化值
		for (int i = 0; i < k; ++i)
			meanValue[i] = sample[i];

		while (1)
		{
			vector<vector<int> > C(k, vector<int>(len, 0));  //用于存储类别,//定义了k个vector<int>(k, 0)向量;vector<int>(len, 0)定义了len个整型元素的向量,且给出每个元素的初值为0
			vector<int> numC(k, 0);//定义了k个整型元素的向量,且给出每个元素的初值为0

			//计算每个样本与各个均值的距离
			for (int i = 0; i < len; ++i)
			{
				int minDis = abs(sample[i] - meanValue[0]);//与第一个类别的差值
				int minDisIndex = 0;

				//更新最小差值,以及index
				for (int j = 1; j < k; ++j)
				{
					int dis = abs(sample[i] - meanValue[j]);
					if (dis < minDis)
					{
						minDis = dis;
						minDisIndex = j;
					}
				}

				//每个样本属于哪个类:C[minDistInex]:当前类,C[minDisIndex][numC[minDisIndex]]当前类的元素
				C[minDisIndex][numC[minDisIndex]] = sample[i];
				numC[minDisIndex]++;
			}

			//均值更新
			int ifBreak = 0;
			for (int i = 0; i < k; ++i)
			{
				int Sum = 0;
				for (int j = 0; j < numC[i]; ++j)
				{
					Sum += C[i][j];
				}
				int lastMeanValue = meanValue[i];

				//当前类所有元素求均值,更新均值
				meanValue[i] = Sum / numC[i];

				//如果更新后均值未改变,说明当前类已更新完毕、未再变动
				if (lastMeanValue == meanValue[i])  ifBreak++;
			}
			//判断均值是否被更新
			if (ifBreak == k)
			{
				int maxNum = 0;
				int maxNumIndex = 0;
				for (int i = 0; i < k; ++i)
				{
					if (numC[i] > maxNum)
					{
						maxNum = numC[i];
						maxNumIndex = i;
					}
				}
				cout << meanValue[maxNumIndex] << endl;
				
				for (int m = 0; m < k; m++)
				{
					cout << m << ":\t";
					for (int n = 0; n < numC[m]; n++)
					{
						cout << C[m][n] << "\t";
					}
					cout << endl;
				}
				
				//cout << " Break" << endl;
				break;
			}

		}
	}

};

int main()
{
	int arr[] = { 500,550,531,460,580,100,30,560,40,900,400 };
	vector<int> lightValue(arr, arr + 10);
	mL *p = new mL;
	p->kmeans(lightValue, 3);
	delete p;

}

结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JoannaJuanCV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值