机器学习笔记

    返回首页    发表留言
本文作者:李德强
          第二节 程序实现
 
 

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