KNN
KNN原理:
K最近邻(KNN)算法核心思想是如果一个样本在特征空间中的k个最临近的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。
最重要的三点就是:k值的选取,距离度量的方式和分类决策规则。
规则:分类决策规则一般使用多数表决法。即如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
过程:
输入训练集数据和标签,输入测试数据;
计算测试数据与各个训练数据之间的距离;
按照距离的递增关系进行排序,选取距离最小的K个点;
确定前K个点所在类别的出现频率,返回前K个点中出现频率最高的类别作为测试数据的预测分类。
算法步骤:
1初始化距离为最大值
2计算未知样本和每个训练样本的距离dist
3得到目前K个最近邻样本中最大距离maxdist
4如果dist小于maxdist,则将该训练样本作为K-最近邻样本
5重复步骤2,3,4,直到未知样本和所有训练样本的距离都算完
6统计K个最近邻样本中每个类别出现的次数
7选择出现频率最大的类别作为未知样本的类别;
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define K 3 //近邻数k
typedef float type;
//动态创建二维数组
type **createarray(int n,int m)
{
int i;
type **array;
array=(type **)malloc(n*sizeof(type ));
array[0]=(type )malloc(nmsizeof(type));
for(i=1;i<n;i++) array[i]=array[i-1]+m;
return array;
}
//读取文本中数据,要求首行格式为 N=数据量,D=维数
void loaddata(int *n,int *d,type ***array,type ***karray)
{
int i,j;
FILE *fp;
if((fp=fopen(“C:\Users\杨素素\Desktop\data.txt”,“r”))NULL)
fprintf(st