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;
}
结果: