求KNN文本分类算法java实现源码分散!!!!
# 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);
}