原理见网站http://blog.csdn.net/loadstar_kun/article/details/39450615。C++代码如下
#include<math.h>
#include<stdio.h>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<iostream>
using namespace std;
#include<stdio.h>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<iostream>
using namespace std;
struct Result_Sort{
int minlocation;
double result;
};
//排序,对所有点分簇,返回分簇的簇,和距离的大小
Result_Sort Sort(vector<double> tmp, Result_Sort Result_Sort1);
Result_Sort Sort(vector<double> tmp, Result_Sort Result_Sort1){
Result_Sort1.result = tmp[0];
for (int i = 1; i < tmp.size(); i++){
if (Result_Sort1.result>tmp[i])
{
Result_Sort1.result = tmp[i];
Result_Sort1.minlocation = i;
}
}
return Result_Sort1;
}
int minlocation;
double result;
};
//排序,对所有点分簇,返回分簇的簇,和距离的大小
Result_Sort Sort(vector<double> tmp, Result_Sort Result_Sort1);
Result_Sort Sort(vector<double> tmp, Result_Sort Result_Sort1){
Result_Sort1.result = tmp[0];
for (int i = 1; i < tmp.size(); i++){
if (Result_Sort1.result>tmp[i])
{
Result_Sort1.result = tmp[i];
Result_Sort1.minlocation = i;
}
}
return Result_Sort1;
}
struct K_Means_Result{
vector<int>Label;
vector<double>CentralPoint;
};
//一维的标准的k-means算法
K_Means_Result K_Means(vector<double>Input, K_Means_Result K_Means_Result1);
K_Means_Result K_Means(vector<double>Input, K_Means_Result K_Means_Result1){
int M, N;
M = Input.size();
N = K_Means_Result1.CentralPoint.size();
vector<vector<double>> Dist(M, vector<double>(N));
vector<double> mindist(M);
vector<double>tmpCen(N);
vector<int> Count(N);
for (int i = 0; i < M; i++){ mindist[i] = 0.0;}
for (int i = 0; i < N; i++){ tmpCen[i] = 0.0; Count[i] = 0; }
//迭代次数
int iteration = 30;
for (int iter = 0; iter<iteration; iter++){
for (int len = 0; len < M ; len++){
for (int kk = 0; kk < N; kk++){
//计算所有点和所有质心的距离
Dist[len][kk] = sqrt(
vector<int>Label;
vector<double>CentralPoint;
};
//一维的标准的k-means算法
K_Means_Result K_Means(vector<double>Input, K_Means_Result K_Means_Result1);
K_Means_Result K_Means(vector<double>Input, K_Means_Result K_Means_Result1){
int M, N;
M = Input.size();
N = K_Means_Result1.CentralPoint.size();
vector<vector<double>> Dist(M, vector<double>(N));
vector<double> mindist(M);
vector<double>tmpCen(N);
vector<int> Count(N);
for (int i = 0; i < M; i++){ mindist[i] = 0.0;}
for (int i = 0; i < N; i++){ tmpCen[i] = 0.0; Count[i] = 0; }
//迭代次数
int iteration = 30;
for (int iter = 0; iter<iteration; iter++){
for (int len = 0; len < M ; len++){
for (int kk = 0; kk < N; kk++){
//计算所有点和所有质心的距离
Dist[len][kk] = sqrt(