希望小蒯不要追究俺地责任呢,数据集呢就是OHSUMED数据集了,query1-9做trainingset(不要包含4),query4做testset.代码如下:
#include <iostream>
#include <fstream>
#include <limits>
#include <iomanip>
using namespace std;
#define K
3//排序的序数,即如排成全相关,部分相关,不相关,序数就是3
#define N 25//特征的维数
int *b,*y,*t;
double *w;
//从文件中获得特征值
bool getData(double *x,int &yt,ifstream &fin)
{
if
(fin.eof())
return
false;
char
data[1024];
int index =
1;
fin.getline(data,1024);
char *p =
data;
char
q[100];
q[0] =
p[0];
q[1] =
'\0';
yt = atoi(q)
+ 1;
p =
p+7;//跳过qid:1的冒号
for(;*p !=
'\0';++p)
{
if(*p ==
':')
{
++p;
for(int i=0;
*p != ' ';i++,p++)
{
q[i] =
*p;
}
q[i] =
'\0';
x[index ++]
= atof(q);
}
}
return
true;
}
//各变量进行初始化
void Initialize()
{
w = new
double[N+1];
b = new
int[K+1];
y = new
int[K+1];
t = new
int[K+1];
int i;
for(i=1;
i<=N;i++)
w[i] = 0
;
for(i=1;i<=K-1;i++)
b[i] =
0;
b[K] =
std::numeric_limits<int>::max();//无穷大
}
//利用Prank算法进行训练
void PrankTraining(double *x,int yt)
{
int i;
double wx =
0;
for(i =1;
i<=N; i++)
wx+= w[i] *
x[i];
for(i =1;
i<=K; i++)
{
if(wx - b[i]
<0 )
break;
}
int yy = i
;
if (yy ==
yt)
return;
else
{
for(i=1;
i<K; i++)