求KNN文本分类算法java实现源码分散!!!!

# include & ltiostream & gt

# include & ltcmath & gt

# include & ltfstream & gt

使用命名空间std

#定义属性数5//属性数

#定义MAXSZ 1700//训练集的最大大小

# define max value 10000.0//最大属性值低于10000(int)

#定义K 5

结构向量{

双重属性[NATTRS];

双classlabel

};

结构项目{

双倍距离;

双classlabel

};

struct vector trSet[MAXSZ];//全局变量,定型集

结构项KNN[K];//全局变量,k-near east-neighborhood集

int curTSize = 0;//定型集的当前大小

int AddtoTSet(结构向量v)

{

if(curTSize & gt;=MAXSZ) {

cout & lt& ltendl & lt& lt“训练集具有”& lt& ltMAXSZ & lt& lt“举例子!”& lt& ltendl & lt& ltendl

返回0;

}

trSet[curTSize]= v;

curtsize++;

返回1;

}

双精度距离(结构向量v1,结构向量v2)

{

双d = 0.0

双tem = 0.0

for(int I = 0;我& ltNATTRSi++)

tem+=(v 1 . attributes[I]-v2 . attributes[I])*(v 1 . attributes[I]-v2 . attributes[I]);

d = sqrt(tem);

返回d;

}

int max(struct item KNN[])//返回距离最大的项的编号(

//应该被替换)

{

int maxNo = 0;

if(K & gt;1)

for(int I = 1;我& ltk;i++)

if(knn[i])。距离& gtknn[maxNo]。距离)

maxNo = I;

返回maxNo

} double Classify(struct vector v)//决定将标签分配给哪个类

//使用knn方法的给定输入向量

{

double DD = 0;

int maxn = 0;

int freq[K];

double MFR eqc = 0;//类别标签出现得最频繁

int I;

for(I = 0;我& ltk;i++)

knn[i]。距离= MAXVALUE

for(I = 0;我& ltcurTSizei++)

{

dd =距离(trSet[i],v);

maxn = max(KNN);//对于训练集的每个新状态,都应该更新maxn

if(DD & lt;knn[maxn]。距离){

knn[maxn]。距离= dd

knn[maxn]。classlabel = trSet[i]。classlabel

}

}

for(I = 0;我& ltk;i++)//freq[i]表示knn[i]。classlabel出现了多少次

freq[I]= 1;

for(I = 0;我& ltk;i++)

for(int j = 0;j & ltk;j++)

如果((我!= j)& amp;& amp(knn[i]。classlabel == knn[j]。classlabel))

freq[I]+= 1;

int MFR eq = 1;

mfreqC = knn[0]。classlabel

for(I = 0;我& ltk;i++)

if(freq[I]& gt;mfreq) {

MFR eq = freq[I];//mfreq代表最多的频率

mfreqC = knn[i]。classlabel//mfreqNo是最频繁的项目号

//classlabel

}

退货mfreqC

}

void main()

{ double classlabel

双c;

双n;

结构向量trExmp

int I;

ifstream filein(" G:\ \ data \ \ for KNN \ \ data . txt ");

if(filein . fail()){ cout & lt;& lt“无法打开data . txt”& lt;& ltendl返回;}

而(!filein.eof()) {

filein & gt& gtc;

trex MP . class label = c;

cout & lt& lttrex MP . class label & lt;& lt" ";for(int I = 0;我& ltNATTRSi++) {

filein & gt& gtn;

trex MP . attributes[I]= n;

cout & lt& lttrex MP . attributes[I]& lt;& lt" ";

} cout & lt& ltendl

如果(!AddtoTSet(trExmp))

打破;

} filein . close();结构向量testv={{142,188,11,1159,0.5513196},17 };

class label = Classify(testv);

cout & lt& lt" testv的类别是:";

cout & lt& ltclasslabel & lt& ltendl

for(I = 0;我& ltk;i++)

cout & lt& ltknn[i]。距离& lt& lt" \ t " & lt& ltknn[i]。classlabel & lt& ltendl

//cout & lt;& ltmax(KNN);

}