正面我们来看一下代码的具体实现过程。主要内容为3个部分:
1、计算目标样本与所有训练样本的距离。
2、将距离结果按升序排列。
3、选定K个最小距离并找出同一分类最多的分类号。
//计算目标样本与训练样本的距离 int knn_distance(double *sample_x, double *target_x, double *dis) { if (sample_x == NULL) { return -1; } if (target_x == NULL) { return -1; } if (dis == NULL) { return -1; } //循环所有样本 for (int i = 0; i < S_ROW; i++) { double s = 0; //循环每一个样本的所有特征 for (int j = 0; j < S_COL; j++) { //计算特征差的平方 if (j < S_COL - 1) { s += pow(target_x[j] - sample_x[i * S_COL + j], 2); } //加入距离数组 dis[i * (S_COL + 1) + j] = sample_x[i * S_COL + j]; } //计算距离 dis[i * (S_COL + 1) + S_COL] = sqrt(s); } //对距离按升序排序 knn_sort(dis, S_ROW); return 0; } //冒泡排序 void knn_sort(double *array, int size) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { //将较大的值向右交换 if (array[j * (S_COL + 1) + S_COL] > array[(j + 1) * (S_COL + 1) + S_COL]) { for (int n = 0; n <= S_COL; n++) { double t = array[(j + 1) * (S_COL + 1) + n]; array[(j + 1) * (S_COL + 1) + n] = array[j * (S_COL + 1) + n]; array[j * (S_COL + 1) + n] = t; } } } } } //K值邻近计算分类 int knn_classification(double *dis) { //class的下标号表示类别,class的值表示此类别出现的次数 double class[K]; for (int i = 0; i < K; i++) { class[i] = 0; } //计算K个最小距离中每一种类别出现的次数 for (int i = 0; i < K; i++) { class[(int) dis[i * (S_COL + 1) + S_COL - 1]]++; } //找出某一个类别出现次数最大的值 double max = 0; int knn_class = -1; for (int i = 0; i < K; i++) { //计算出现次数最多的 if (class[i] > max) { //取得次数 max = class[i]; //取得分类 knn_class = i; } } //返回分类 return knn_class; }
Copyright © 2015-2023 问渠网 辽ICP备15013245号