-
大小: 6KB文件類(lèi)型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-06-02
- 語(yǔ)言: C/C++
- 標(biāo)簽:
資源簡(jiǎn)介
基于KNN實(shí)現(xiàn)的手寫(xiě)體數(shù)字識(shí)別C++代碼,輸出結(jié)果有混淆矩陣、召回率、訓(xùn)練準(zhǔn)確率、預(yù)測(cè)數(shù)據(jù)輸出等。
代碼片段和文件信息
#include
#include
#include
#include
#include
#define?path?“E:\\vs207\\train.txt“
#define?path2?“E:\\vs207\\test.txt“
#define?predictFile??“E:\\vs207\\predict.txt“
typedef?const?int?cint;
typedef?const?char?cchar;
/*一個(gè)手寫(xiě)數(shù)字的結(jié)構(gòu)體*/
typedef?struct
{
int?pixel[1024];
int?label;
}Digit;
/*一個(gè)有l(wèi)abel的距離結(jié)構(gòu)體*/
typedef?struct
{
float?distance;
int?label;
}Distance;
/*文件路徑+名稱(chēng)*/
/*每個(gè)數(shù)據(jù)集的數(shù)字個(gè)數(shù)*/
cint???ntrain?=?1130;//943
cint????ntest?=?501;//196
cint?npredict?=?50;
float?calDistance(Digit?digit1?Digit?digit2)
/*求距離*/
{
int?i?squareSum?=?0.0;
for?(i?=?0;?i<1024;?i++)
{
squareSum?+=?pow(digit1.pixel[i]?-?digit2.pixel[i]?2.0);
}
return?sqrtf(squareSum);//平方根
}
int?loadDigit(Digit?*digit?FILE?*fp?int?*labels)
/*讀取digit*/
{
int?index?=?0;
for?(index?=?0;?index<784;?index++)
{
if?(!fscanf(fp?“%d“?&(digit->pixel[index])))
{
printf(“FILE?already?read?finish.\n“);
return?-1;
}
}
fscanf(fp?“%d“?&(digit->label));
*labels?=?digit->label;
return?1;
}
void?exchange(Distance?*in?int?index1?int?index2)
/*交換字符串兩項(xiàng)*/
{
Distance?tmp?=?(Distance)in[index1];
in[index1]?=?in[index2];
in[index2]?=?tmp;
}
void?selectSort(Distance?*in?int?length)
/*選擇排序*/
{
int?i?j?min;
int?N?=?length;
for?(i?=?0;?i {
min?=?i;
for?(j?=?i?+?1;?j {
if?(in[j].distance }
exchange(in?i?min);
}
}
int?prediction(int?K?Digit?in?Digit?*train?int?nt)//K?Dtest[itest]?Dtrain?ntrain?943
/*利用訓(xùn)練數(shù)據(jù)預(yù)測(cè)一個(gè)數(shù)據(jù)digit*/
{
int?i?it;
Distance?distance[1133];
/*求取輸入digit與訓(xùn)練數(shù)據(jù)的距離*/
for?(it?=?0;?it {
distance[it].distance?=?calDistance(in?train[it]);
distance[it].label?=?train[it].label;
}
/*給計(jì)算的距離排序(選擇排序)*/
int?predict?=?0;
int?b0[10]?=?{?0?};
selectSort(distance?nt);
for?(i?=?0;?i {
//predict?+=?distance[i].label;
switch?(distance[i].label)
{
case?0:
b0[0]++;
break;
case?1:
b0[1]++;
break;
case?2:
b0[2]++;
break;
case?3:
b0[3]++;
break;
case?4:
b0[4]++;
break;
case?5:
b0[5]++;
break;
case?6:
b0[6]++;
break;
case?7:
b0[7]++;
break;
case?8:
b0[8]++;
break;
case?9:
b0[9]++;
break;
default:
break;
}
}
int?max?=?0;
for?(int?m?=?0;?m?10;?m++)?{
if?(b0[m]?>=?max)?{
max?=?b0[m];
predict?=?m;
}
}
return?predict;
}
void?knn_classifiy(int?K)
/*用測(cè)試數(shù)據(jù)集進(jìn)行測(cè)試*/
{
printf(“knn_arithmetic_begin....\n“);
clock_t?startfinish?aa?dd;
int?i;
FILE?*fp;
/*讀入訓(xùn)練數(shù)據(jù)*/
int?trainLabels[ntrain];
int?trainCount[10]?=?{?0?};
Digit?*Dtrain?=?(Digit*)calloc(ntrain??sizeof(Digit));
?? fp?=?fopen(path?“r“);?//讀文件
?? printf(“l(fā)oad?training?digits...\n“);
start?=?clock();
for?(i?=?0;?i {
loadDigit(&Dtrain[i]?fp?&trainLabels[i]);
trainCount[Dtrain[i
評(píng)論
共有 條評(píng)論