K均值算法(C++版)
选用K均值算法对一串整形数据100行100列进行聚类。输出两个结果文件1第一个输出结果文件为cluster_centers.txt其中输出聚类得到的各区域聚类的中心以及每个聚类区域像素个数。格式如下聚类序号 聚类平均横坐标x 聚类平均纵坐标y 聚类中心值 像素个数1 X Y V N......2第二个输出结果文件为cluster_labels.txt其中输出整串数据的聚类序号即100X100的聚类序号图每个元素的聚类序号用空格分开每一行聚类序号对应每一行输入数据。格式如下1 1 1 1 1 1 ...... 1 1 12 2 1 1 2 2 ...... 2 2 3.......3 3 1 2 2 2 ...... 3 1 1#includeiostream#includefstream#includevector#includecmath#includeiomanipusing namespace std;const int K 3; // 聚类中心const double T 1e-6; // 收敛阈值const int row 100; // 行数const int col 100; // 列数int main() {// 打开数据文件ifstream ifile(data.txt);if (!ifile.is_open()) {cout 文件打开失败;return -1;}ofstream ofile1(cluster_centers.txt);if (!ofile1.is_open()) {cout 文件cluster_centers写入失败;return -1;}ofstream ofile2(cluster_labels.txt);if (!ofile2.is_open()) {cout 文件cluster_labels写入失败;return -1;}// 存储像素值double image[row][col] { 0 };for (int i 0; i row; i) {for (int j 0; j col; j) {ifile image[i][j];}}ifile.close();// 初始化聚类中心double old_centers[K] { 0 };double new_centers[K] { 0 };new_centers[0] image[10][10];new_centers[1] image[70][30];new_centers[2] image[80][90];// 存储每个像素的类别 0/1/2int labels[row][col] { 0 };// 统计每个聚类的x总和、y总和、像素值总和、像素个数double sum_x[K] { 0 };double sum_y[K] { 0 };double sum_val[K] { 0 };int count[K] { 0 };int iter 0;double max_diff 1.0;while (max_diff T){// 保存旧中心for (int k 0; k K; k) {old_centers[k] new_centers[k];}// 清空统计数据for (int k 0; k K; k) {sum_x[k] 0;sum_y[k] 0;sum_val[k] 0;count[k] 0;}// 遍历所有像素分配类别for (int i 0; i row; i) {for (int j 0; j col; j) {double pixel image[i][j];double d1 fabs(pixel - new_centers[0]);double d2 fabs(pixel - new_centers[1]);double d3 fabs(pixel - new_centers[2]);// 归类if (d1 d2 d1 d3) labels[i][j] 0;else if (d2 d1 d2 d3) labels[i][j] 1;else labels[i][j] 2;// 累加坐标、灰度值、计数int c labels[i][j];sum_x[c] j; // 横坐标 jsum_y[c] i; // 纵坐标 isum_val[c] pixel;count[c];}}// 更新聚类中心for (int k 0; k K; k) {if (count[k] 0) {new_centers[k] sum_val[k] / count[k];}}// 计算最大变化量max_diff 0;for (int k 0; k K; k) {double diff fabs(new_centers[k] - old_centers[k]);if (diff max_diff) max_diff diff;}iter;cout 第 iter 次迭代中心变化量 max_diff endl;}ofile1 聚类序号 聚类平均横坐标x 聚类平均纵坐标y 聚类中心值 像素个数 endl;for (int k 0; k K; k) {int id k 1; // 序号从 1 开始double x sum_x[k] / count[k];double y sum_y[k] / count[k];double v new_centers[k];int n count[k];// 按格式输出对齐ofile1 fixed setprecision(2);ofile1 setw(4) id setw(12) x setw(14) y setw(12) v setw(10) n endl;}ofile1.close();for (int i 0; i row; i) {for (int j 0; j col; j) {ofile2 labels[i][j] 1 ;}ofile2 endl;}ofile2.close();cout \n 聚类完成 endl;cout 已生成两个文件 endl;cout 1. cluster_centers.txt endl;cout 2. cluster_labels.txt endl;return 0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2476536.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!