准确的来讲我这段程序算不得真正的k-means算法,这是我在数学建模过程中中针对一维数据聚合为两类的情况下,针对改进的版本!要想学习真正的k-means聚类请不要误入歧途!
#include <iostream>//一维k-means聚两类
#include<stdio.h>
#define n 10
void dist(int b, int s, float* p, float* q);//距离和
void sort(int* p, int size);//顺序冒泡排序
int main()
{
FILE* fpr, * fpw;
fopen_s(&fpr, "1.txt", "r");
fopen_s(&fpw, "_1.txt", "w");
float a[n], min, g[2*n], d[n], y[2];
int i, j, b = n - 1, s = 0, z = 0;
for (i = 0; i < n; i++)
fscanf_s(fpr, "%d", a + i);
for (i = 0; b > s; i += 2)
{
dist(b, s, a, y);
d[z++] = y[0] + y[1];
g[i] = y[0];
g[i + 1] = y[1];
b--;
s++;
}
min = d[0];
for (i = 1, z = 0; i < z; i++)
if (d[i] < min)
{
min = d[i];
z = i;
}
fprintf(fpw, "%f %f %f\n", min, g[z], g[z]);
fclose(fpr);
fclose(fpw);
return 0;
}
void sort(int* p, int size)//顺序冒泡排序
{
int i, b[10], j, k;
for (i = 0; i < size - 1; i++)
for (j = i + 1; j < size; j++)
if (p[i] > p[j])
{
k = p[i];
p[i] = p[j];
p[j] = k;
}
}
void dist(int b, int s, float* p, float* q)//距离和
{
q[0] = q[1] = 0;
for (int i = 0; i < n; i++)
{
if (abs(p[i] - p[b]) < abs(p[i] - p[s]))
q[1] += abs(p[i] - p[b]);
else
q[0] += abs(p[i] - p[s]);
}
}