use of structures._Query in project IR_Base by Linda-sunshine.
the class LambdaRank method gradientUpdate.
// for lambdaRank
protected int gradientUpdate(_Query query) {
double diff;
int i, trainSize = 0;
// Step 1: calculate the ranking score
for (_QUPair pair : query.m_docList) pair.score(m_weight);
m_eval.eval(query);
// Step 2: accumulate the lambdas for each URL
for (_QUPair pair : query.m_docList) {
diff = 0;
if (pair.m_worseURLs != null) {
for (_QUPair worseURL : pair.m_worseURLs) {
// force to moving up
diff += Utils.logistic(worseURL.m_score - pair.m_score) * m_eval.delta(pair, worseURL);
trainSize++;
}
}
if (pair.m_betterURLs != null) {
for (_QUPair betterURL : pair.m_betterURLs) {
// force to moving down
diff -= Utils.logistic(pair.m_score - betterURL.m_score) * m_eval.delta(betterURL, pair);
trainSize++;
}
}
// Step 3: update weight according to this URL
if (diff != 0) {
for (i = 0; i < pair.m_rankFv.length; i++) m_g[i] -= diff * pair.m_rankFv[i];
}
}
return trainSize;
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class LambdaRankWorker method gradientUpdate.
protected int gradientUpdate(_Query query) {
double diff;
int i, trainSize = 0;
// Step 1: calculate the ranking score
for (_QUPair pair : query.m_docList) pair.score(m_weight);
m_eval.eval(query);
// Step 2: accumulate the lambdas for each URL
for (_QUPair pair : query.m_docList) {
diff = 0;
if (pair.m_worseURLs != null) {
for (_QUPair worseURL : pair.m_worseURLs) {
// force to moving up
diff += Utils.logistic(worseURL.m_score - pair.m_score) * m_eval.delta(pair, worseURL);
trainSize++;
}
}
if (pair.m_betterURLs != null) {
for (_QUPair betterURL : pair.m_betterURLs) {
// force to moving down
diff -= Utils.logistic(pair.m_score - betterURL.m_score) * m_eval.delta(betterURL, pair);
trainSize++;
}
}
// Step 3: update weight according to this URL
if (diff != 0) {
for (i = 0; i < pair.m_rankFv.length; i++) m_g[i] -= diff * pair.m_rankFv[i];
}
}
return trainSize;
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class MAP_Evaluator method setQuery.
@Override
public void setQuery(_Query query) {
super.setQuery(query);
m_P = 0;
for (_QUPair d : m_query.m_docList) if (d.m_y > 0)
m_P++;
if (m_P > 0)
updateDeltas();
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class NDCG_Evaluator method setQuery.
@Override
public void setQuery(_Query query) {
// every time we want to evaluate new queries
super.setQuery(query);
ArrayList<Integer> labels = new ArrayList<Integer>(m_size);
for (_QUPair qu : m_query.m_docList) labels.add(qu.m_y);
Collections.sort(labels, Collections.reverseOrder());
// calculate iDCG
m_iDCG = 0;
for (int i = 0; i < Math.min(labels.size(), m_k); i++) m_iDCG += m_gain[labels.get(i)] * m_discount[i];
updateDeltas();
}
use of structures._Query in project IR_Base by Linda-sunshine.
the class L2RMetricLearning method createTrainingCorpus.
// In this training process, we want to get the weight of all pairs of samples.
protected int createTrainingCorpus() {
// pre-compute the similarity between labeled documents
calcLabeledSimilarities();
MyPriorityQueue<_RankItem> simRanker = new MyPriorityQueue<_RankItem>(m_topK);
ArrayList<_Doc> neighbors = new ArrayList<_Doc>();
_Query q;
_Doc di, dj;
int posQ = 0, negQ = 0, pairSize = 0;
int relevant = 0, irrelevant = 0;
for (int i = 0; i < m_trainSet.size(); i++) {
// candidate query document
di = m_trainSet.get(i);
relevant = 0;
irrelevant = 0;
// using content similarity to construct initial ranking
for (int j = 0; j < m_trainSet.size(); j++) {
if (i == j)
continue;
dj = m_trainSet.get(j);
simRanker.add(new _RankItem(j, m_LabeledCache[getIndex(i, j)]));
}
// find the top K similar documents by default similarity measure
for (_RankItem it : simRanker) {
dj = m_trainSet.get(it.m_index);
neighbors.add(dj);
if (di.getYLabel() == dj.getYLabel())
relevant++;
else
irrelevant++;
}
// inject some random neighbors
int j = 0;
while (neighbors.size() < (1.0 + m_noiseRatio) * m_topK) {
if (i != j) {
dj = m_trainSet.get(j);
if (Math.random() < 0.02 && !neighbors.contains(dj)) {
neighbors.add(dj);
if (di.getYLabel() == dj.getYLabel())
relevant++;
else
irrelevant++;
}
}
// until we use up all the random budget
j = (j + 1) % m_trainSet.size();
}
if (relevant == 0 || irrelevant == 0 || (di.getYLabel() == 1 && negQ < 1.1 * posQ)) {
// clear the cache for next query
simRanker.clear();
neighbors.clear();
continue;
} else if (di.getYLabel() == 1)
posQ++;
else
negQ++;
// accept the query
q = new _Query();
m_queries.add(q);
// construct features for the most similar documents with respect to the query di
for (_Doc d : neighbors) q.addQUPair(new _QUPair(d.getYLabel() == di.getYLabel() ? 1 : 0, genRankingFV(di, d)));
pairSize += q.createRankingPairs();
// clear the cache for next query
simRanker.clear();
neighbors.clear();
}
// normalize the features by z-score
normalize();
System.out.format("Generate %d(%d:%d) ranking pairs for L2R model training...\n", pairSize, posQ, negQ);
return pairSize;
}
Aggregations