正面我们来看一下代码的具体实现过程。主要内容为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号