[mlpack-svn] r10159 - mlpack/trunk/src/contrib/nslagle/myKDE
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Sat Nov 5 17:59:21 EDT 2011
Author: nslagle
Date: 2011-11-05 17:59:21 -0400 (Sat, 05 Nov 2011)
New Revision: 10159
Modified:
mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp
mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp
Log:
mlpack/contrib/nslagle: correct for bounds; track the success level for each bandwidth
Modified: mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp
===================================================================
--- mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp 2011-11-05 20:56:46 UTC (rev 10158)
+++ mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp 2011-11-05 21:59:21 UTC (rev 10159)
@@ -59,7 +59,7 @@
size_t nextAvailableNodeIndex;
std::vector<size_t> referenceShuffledIndices;
std::vector<size_t> queryShuffledIndices;
- arma::Mat<size_t> touched;
+ std::vector<size_t> bestLevelByBandwidth;
arma::mat referenceData;
arma::mat queryData;
arma::mat upperBoundLevelByBandwidth;
Modified: mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp
===================================================================
--- mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp 2011-11-05 20:56:46 UTC (rev 10158)
+++ mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp 2011-11-05 21:59:21 UTC (rev 10159)
@@ -59,8 +59,10 @@
std::vector<double> KdeDualTree<TKernel, TTree>::Calculate()
{
/* calculate the bandwidths */
+ std::cout << "epsilon=" << epsilon << std::endl;
bandwidths.clear();
inverseBandwidths.clear();
+ bestLevelByBandwidth.clear();
if (bandwidthCount > 1)
{
@@ -69,12 +71,14 @@
{
bandwidths.push_back(lowBandwidth + bandwidthDelta * bIndex);
inverseBandwidths.push_back(1.0 / bandwidths.back());
+ bestLevelByBandwidth.push_back(-1);
}
}
else
{
bandwidths.push_back(lowBandwidth);
inverseBandwidths.push_back(1.0 / lowBandwidth);
+ bestLevelByBandwidth.push_back(-1);
}
/* resize the critical matrices */
@@ -126,9 +130,11 @@
for (size_t bIndex = 0; bIndex < bandwidthCount; ++bIndex)
{
- double currentLogLikelihood = (upperBoundLevelByBandwidth(finalLevel,bIndex) +
- lowerBoundLevelByBandwidth(finalLevel,bIndex)) / 2.0;
- std::cout << bandwidths[bIndex] << "," << inverseBandwidths[bIndex] << "," << currentLogLikelihood << std::endl;
+ double currentLogLikelihood = (upperBoundLevelByBandwidth(
+ bestLevelByBandwidth[bIndex],bIndex) +
+ lowerBoundLevelByBandwidth(
+ bestLevelByBandwidth[bIndex],bIndex)) / 2.0;
+ std::cout << bandwidths[bIndex] << "," << inverseBandwidths[bIndex] << "," << currentLogLikelihood << "; RANGE " << lowerBoundLevelByBandwidth(bestLevelByBandwidth[bIndex],bIndex) << ", " << upperBoundLevelByBandwidth(bestLevelByBandwidth[bIndex],bIndex) << std::endl;
if (currentLogLikelihood > maxLogLikelihood)
{
maxLogLikelihood = currentLogLikelihood;
@@ -198,22 +204,20 @@
bIndex <= queueCurrent.bUpperIndex;
++bIndex)
{
- if (abs(lowerBoundLevelByBandwidth(v,bIndex)) > DBL_EPSILON)
+ double constraint = abs((upperBoundLevelByBandwidth(v,bIndex) -
+ lowerBoundLevelByBandwidth(v,bIndex)) /
+ lowerBoundLevelByBandwidth(v,bIndex));
+ if (constraint >= epsilon)
{
- double constraint = abs((upperBoundLevelByBandwidth(v,bIndex) -
- lowerBoundLevelByBandwidth(v,bIndex)) /
- lowerBoundLevelByBandwidth(v,bIndex));
- if (constraint > epsilon)
- {
- epsilonCondition = false;
- break;
- }
+ epsilonCondition = false;
+ break;
}
else
{
- /* we haven't set this lower bound */
- epsilonCondition = false;
- break;
+ if (bestLevelByBandwidth[bIndex] == (size_t)-1)
+ {
+ bestLevelByBandwidth[bIndex] = v;
+ }
}
}
/* return */
@@ -301,23 +305,25 @@
/* the continue forces us to undo the previous node */
continue;
}
- else
- {
- /* winnow according to the delta conditions */
- std::vector<bool>::iterator bIt = deltaCondition.begin();
- while (*bIt && bIt != deltaCondition.end())
- {
- ++bIt;
- ++bLower;
- }
- bIt = deltaCondition.end();
- --bIt;
- while (*bIt && bIt != deltaCondition.begin())
- {
- --bIt;
- --bUpper;
- }
- }
+// else
+// {
+// /* winnow according to the delta conditions */
+// std::vector<bool>::iterator bIt = deltaCondition.begin();
+// while (*bIt && bIt != deltaCondition.end())
+// {
+// ++bIt;
+// //bestLevelByBandwidth[bLower] = v;
+// ++bLower;
+// }
+// bIt = deltaCondition.end();
+// --bIt;
+// while (*bIt && bIt != deltaCondition.begin())
+// {
+// --bIt;
+// //bestLevelByBandwidth[bUpper] = v;
+// --bUpper;
+// }
+// }
}
else /* the priority exceeds the maximum available; back the node out */
{
@@ -433,60 +439,42 @@
size_t* bUpper)
{
size_t bIndex = *bLower;
- double constraint = delta;
+ double constraint = epsilon;
bool enteredTheLoop = false;
/* bring the lower up */
- if (abs(lowerBoundLevelByBandwidth(level,bIndex)) > DBL_EPSILON)
+ constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
+ lowerBoundLevelByBandwidth(level,bIndex)) /
+ lowerBoundLevelByBandwidth(level,bIndex));
+ while (constraint < epsilon && bIndex <= *bUpper)
{
+ enteredTheLoop = true;
+ bestLevelByBandwidth[bIndex] = level;
+ ++bIndex;
constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
lowerBoundLevelByBandwidth(level,bIndex)) /
lowerBoundLevelByBandwidth(level,bIndex));
}
- while (constraint < delta && bIndex <= *bUpper)
- {
- enteredTheLoop = true;
- ++bIndex;
- if (lowerBoundLevelByBandwidth(level,bIndex) > DBL_EPSILON)
- {
- constraint = (upperBoundLevelByBandwidth(level,bIndex) -
- lowerBoundLevelByBandwidth(level,bIndex)) /
- lowerBoundLevelByBandwidth(level,bIndex);
- }
- else
- {
- break;
- }
- }
if (enteredTheLoop)
{
*bLower = bIndex - 1;
}
bIndex = *bUpper;
- constraint = delta;
+ constraint = epsilon;
enteredTheLoop = false;
/* bring the lower up */
- if (abs(lowerBoundLevelByBandwidth(level,bIndex)) > DBL_EPSILON)
+ constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
+ lowerBoundLevelByBandwidth(level,bIndex)) /
+ lowerBoundLevelByBandwidth(level,bIndex));
+ while (constraint < epsilon && bIndex >= *bLower)
{
+ enteredTheLoop = true;
+ bestLevelByBandwidth[bIndex] = level;
+ --bIndex;
constraint = abs((upperBoundLevelByBandwidth(level,bIndex) -
lowerBoundLevelByBandwidth(level,bIndex)) /
lowerBoundLevelByBandwidth(level,bIndex));
}
- while (constraint < delta && bIndex >= *bLower)
- {
- enteredTheLoop = true;
- --bIndex;
- if (lowerBoundLevelByBandwidth(level,bIndex) > DBL_EPSILON)
- {
- constraint = (upperBoundLevelByBandwidth(level,bIndex) -
- lowerBoundLevelByBandwidth(level,bIndex)) /
- lowerBoundLevelByBandwidth(level,bIndex);
- }
- else
- {
- break;
- }
- }
if (enteredTheLoop)
{
*bUpper = bIndex + 1;
@@ -529,7 +517,7 @@
}
for (size_t bIndex = lowerBIndex; bIndex <= upperBIndex; ++bIndex)
{
- upperBoundQPointByBandwidth(q, bIndex) -= sizeOfTNode;
+ upperBoundQPointByBandwidth(q, bIndex) -= inverseBandwidths[bIndex] * sizeOfTNode;
}
}
for (size_t bIndex = lowerBIndex; bIndex <= upperBIndex; ++bIndex)
More information about the mlpack-svn
mailing list