[mlpack-svn] r10179 - mlpack/trunk/src/contrib/nslagle/myKDE
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Tue Nov 8 11:23:17 EST 2011
Author: nslagle
Date: 2011-11-08 11:23:17 -0500 (Tue, 08 Nov 2011)
New Revision: 10179
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: the algorithm almost works...
Modified: mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp
===================================================================
--- mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp 2011-11-08 04:28:44 UTC (rev 10178)
+++ mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree.hpp 2011-11-08 16:23:17 UTC (rev 10179)
@@ -85,6 +85,7 @@
void SetDefaults();
double Priority(TTree* Q, TTree* T);
+ size_t NaiveLogLikelihood();
size_t MultiBandwidthDualTree();
void MultiBandwidthDualTreeBase(TTree* Q,
TTree* T, size_t QIndex,
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-08 04:28:44 UTC (rev 10178)
+++ mlpack/trunk/src/contrib/nslagle/myKDE/kde_dual_tree_impl.hpp 2011-11-08 16:23:17 UTC (rev 10179)
@@ -94,20 +94,25 @@
(log(DBL_EPSILON)/* + log(inverseBandwidths[bIndex])*/));
}
- upperBoundQPointByBandwidth.zeros(queryRoot->count(),bandwidthCount);
+ upperBoundQNodeByBandwidth.zeros(queryTreeSize,bandwidthCount);
+ lowerBoundQNodeByBandwidth.zeros(queryTreeSize,bandwidthCount);
for (size_t bIndex = 0; bIndex < bandwidthCount; ++bIndex)
{
- arma::vec col = upperBoundQPointByBandwidth.unsafe_col(bIndex);
+ arma::vec col = upperBoundQNodeByBandwidth.unsafe_col(bIndex);
col.fill(referenceRoot->count() * inverseBandwidths[bIndex]);
+ arma::vec col2 = lowerBoundQNodeByBandwidth.unsafe_col(bIndex);
+ col2.fill(referenceRoot->count() * DBL_EPSILON);
}
+
+ upperBoundQPointByBandwidth.zeros(queryRoot->count(),bandwidthCount);
lowerBoundQPointByBandwidth.zeros(queryRoot->count(),bandwidthCount);
- upperBoundQNodeByBandwidth.zeros(queryTreeSize,bandwidthCount);
for (size_t bIndex = 0; bIndex < bandwidthCount; ++bIndex)
{
- arma::vec col = upperBoundQNodeByBandwidth.unsafe_col(bIndex);
+ arma::vec col = upperBoundQPointByBandwidth.unsafe_col(bIndex);
col.fill(referenceRoot->count() * inverseBandwidths[bIndex]);
+ arma::vec col2 = lowerBoundQPointByBandwidth.unsafe_col(bIndex);
+ col2.fill(referenceRoot->count() * DBL_EPSILON);
}
- lowerBoundQNodeByBandwidth.zeros(queryTreeSize,bandwidthCount);
arma::vec dl;
arma::vec du;
@@ -120,6 +125,7 @@
++nextAvailableNodeIndex;
nodePriorityQueue.push(firstNode);
size_t finalLevel = MultiBandwidthDualTree();
+ //size_t finalLevel = NaiveLogLikelihood();
std::cout << "the best level is " << finalLevel << "\n";
size_t maxIndex = -1;
@@ -164,6 +170,30 @@
}
template<typename TKernel, typename TTree>
+size_t KdeDualTree<TKernel, TTree>::NaiveLogLikelihood()
+{
+ for (size_t bIndex = 0; bIndex < bandwidthCount; ++bIndex)
+ {
+ bestLevelByBandwidth[bIndex] = 0;
+ double inverseBandwidth = inverseBandwidths[bIndex];
+ for (size_t q = queryRoot->begin(); q < queryRoot->end(); ++q)
+ {
+ double total = 0.0;
+ for (size_t t = referenceRoot->begin(); t < referenceRoot->end(); ++t)
+ {
+ arma::vec diff = queryData.unsafe_col(q) - referenceData.unsafe_col(t);
+ double dist = pow(arma::dot(diff,diff),0.5);
+ total += inverseBandwidth * kernel.Evaluate(inverseBandwidth * dist);
+ }
+ lowerBoundLevelByBandwidth(0,bIndex) -= log(DBL_EPSILON);
+ upperBoundLevelByBandwidth(0,bIndex) -= log(inverseBandwidth);
+ lowerBoundLevelByBandwidth(0,bIndex) += log(total / referenceRoot->count());
+ upperBoundLevelByBandwidth(0,bIndex) += log(total / referenceRoot->count());
+ }
+ }
+ return 0;
+}
+template<typename TKernel, typename TTree>
size_t KdeDualTree<TKernel, TTree>::MultiBandwidthDualTree()
{
/* current level */
@@ -245,7 +275,6 @@
* to the current Q */
if (fabs((du - dl)/(lowerBoundQNodeByBandwidth(QIndex, bIndex) + dl)) < delta)
{
- std::cout << "do we ever meet delta?\n";
for (size_t q = Q->begin(); q < Q->end(); ++q)
{
lowerBoundQPointByBandwidth(q,bIndex) += deltaLower(bIndex);
@@ -616,7 +645,7 @@
{
/* subtract out the current log-likelihood amount for this Q node so we can readjust
* the Q node bounds by the current bandwidth */
- std::cout << "BEFORE========\n" << lowerBoundLevelByBandwidth << std::endl << upperBoundLevelByBandwidth << std::endl;
+ //std::cout << "BEFORE========\n" << lowerBoundLevelByBandwidth << std::endl << upperBoundLevelByBandwidth << std::endl;
upperBoundLevelByBandwidth(levelOfQ, bIndex) -=
sizeOfQNode * log(upperBoundQNodeByBandwidth(QIndex, bIndex));
double value = lowerBoundQNodeByBandwidth(QIndex, bIndex);
@@ -642,6 +671,19 @@
{
maximumUpper = upperBoundQPointByBandwidth(q,bIndex);
}
+ upperBoundLevelByBandwidth(levelOfQ, bIndex) +=
+ log(upperBoundQPointByBandwidth(q, bIndex));
+ value = lowerBoundQPointByBandwidth(q, bIndex);
+ if (value > DBL_EPSILON)
+ {
+ lowerBoundLevelByBandwidth(levelOfQ, bIndex) +=
+ log(value);
+ }
+ else
+ {
+ lowerBoundLevelByBandwidth(levelOfQ, bIndex) +=
+ log(DBL_EPSILON);
+ }
}
/* adjust Q node bounds, then add the new quantities to the level by bandwidth
* log-likelihood bounds */
@@ -649,20 +691,20 @@
//std::cout << "maximum upper - TNodeSize = " << maximumUpper - sizeOfTNode << "\n";
upperBoundQNodeByBandwidth(QIndex, bIndex) = maximumUpper;/* -
inverseBandwidths[bIndex] * sizeOfTNode;*/
- upperBoundLevelByBandwidth(levelOfQ, bIndex) +=
- sizeOfQNode * log(upperBoundQNodeByBandwidth(QIndex, bIndex));
- value = lowerBoundQNodeByBandwidth(QIndex, bIndex);
- if (value > DBL_EPSILON)
- {
- lowerBoundLevelByBandwidth(levelOfQ, bIndex) +=
- sizeOfQNode * log(value);
- }
- else
- {
- lowerBoundLevelByBandwidth(levelOfQ, bIndex) +=
- sizeOfQNode * log(DBL_EPSILON);
- }
- std::cout << "AFTER========\n" << lowerBoundLevelByBandwidth << std::endl << upperBoundLevelByBandwidth << std::endl;
+// upperBoundLevelByBandwidth(levelOfQ, bIndex) +=
+// sizeOfQNode * log(upperBoundQNodeByBandwidth(QIndex, bIndex));
+// value = lowerBoundQNodeByBandwidth(QIndex, bIndex);
+// if (value > DBL_EPSILON)
+// {
+// lowerBoundLevelByBandwidth(levelOfQ, bIndex) +=
+// sizeOfQNode * log(value);
+// }
+// else
+// {
+// lowerBoundLevelByBandwidth(levelOfQ, bIndex) +=
+// sizeOfQNode * log(DBL_EPSILON);
+// }
+// std::cout << "AFTER========\n" << lowerBoundLevelByBandwidth << std::endl << upperBoundLevelByBandwidth << std::endl;
}
}
template<typename TKernel, typename TTree>
More information about the mlpack-svn
mailing list