[mlpack-svn] r17472 - in mlpack/tags/mlpack-1.0.11: . src/mlpack/methods/sparse_coding src/mlpack/tests
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Sun Dec 7 14:47:07 EST 2014
Author: rcurtin
Date: Sun Dec 7 14:47:07 2014
New Revision: 17472
Log:
Backport r17432:17437.
Modified:
mlpack/tags/mlpack-1.0.11/ (props changed)
mlpack/tags/mlpack-1.0.11/HISTORY.txt
mlpack/tags/mlpack-1.0.11/src/mlpack/methods/sparse_coding/sparse_coding_impl.hpp
mlpack/tags/mlpack-1.0.11/src/mlpack/tests/cosine_tree_test.cpp
mlpack/tags/mlpack-1.0.11/src/mlpack/tests/logistic_regression_test.cpp
mlpack/tags/mlpack-1.0.11/src/mlpack/tests/sa_test.cpp
mlpack/tags/mlpack-1.0.11/src/mlpack/tests/svd_batch_test.cpp
Modified: mlpack/tags/mlpack-1.0.11/HISTORY.txt
==============================================================================
--- mlpack/tags/mlpack-1.0.11/HISTORY.txt (original)
+++ mlpack/tags/mlpack-1.0.11/HISTORY.txt Sun Dec 7 14:47:07 2014
@@ -18,6 +18,9 @@
* math::RandomSeed() now sets the random seed for recent (>=3.930) Armadillo
versions.
+ * Handle Newton method convergence better for
+ SparseCoding::OptimizeDictionary() and make maximum iterations a parameter.
+
2014-08-29 mlpack 1.0.10
* Bugfix for NeighborSearch regression which caused very slow allknn/allkfn.
Modified: mlpack/tags/mlpack-1.0.11/src/mlpack/methods/sparse_coding/sparse_coding_impl.hpp
==============================================================================
--- mlpack/tags/mlpack-1.0.11/src/mlpack/methods/sparse_coding/sparse_coding_impl.hpp (original)
+++ mlpack/tags/mlpack-1.0.11/src/mlpack/methods/sparse_coding/sparse_coding_impl.hpp Sun Dec 7 14:47:07 2014
@@ -270,7 +270,7 @@
<< "." << std::endl;
Log::Debug << " Improvement: " << std::scientific << improvement << ".\n";
- if (improvement < newtonTolerance)
+ if (normGradient < newtonTolerance)
converged = true;
}
@@ -307,7 +307,7 @@
}
}
}
- //printf("final reconstruction error: %e\n", norm(data - dictionary * codes, "fro"));
+
return normGradient;
}
Modified: mlpack/tags/mlpack-1.0.11/src/mlpack/tests/cosine_tree_test.cpp
==============================================================================
--- mlpack/tags/mlpack-1.0.11/src/mlpack/tests/cosine_tree_test.cpp (original)
+++ mlpack/tags/mlpack-1.0.11/src/mlpack/tests/cosine_tree_test.cpp Sun Dec 7 14:47:07 2014
@@ -45,13 +45,13 @@
// Make a random dataset.
arma::mat data = arma::randu(numRows, numCols);
-
+
// Make a cosine tree, with the generated dataset and the defined constants.
// Note that the value of epsilon is one.
CosineTree ctree(data, epsilon, delta);
arma::mat basis;
ctree.GetFinalBasis(basis);
-
+
// Since epsilon is one, there should be no splitting and the only vector in
// the basis should come from the root node.
BOOST_REQUIRE_EQUAL(basis.n_cols, 1);
@@ -66,74 +66,68 @@
// Intialize constants required for the test.
const size_t numRows = 500;
const size_t numCols = 1000;
-
+
// Make a random dataset and the root object.
arma::mat data = arma::randu(numRows, numCols);
CosineTree root(data);
-
+
// Stack for depth first search of the tree.
std::vector<CosineTree*> nodeStack;
nodeStack.push_back(&root);
-
+
// While stack is not empty.
- while(nodeStack.size())
+ while (nodeStack.size())
{
// Pop a node from the stack and split it.
CosineTree *currentNode, *currentLeft, *currentRight;
currentNode = nodeStack.back();
currentNode->CosineNodeSplit();
nodeStack.pop_back();
-
+
// Obtain pointers to the children of the node.
currentLeft = currentNode->Left();
currentRight = currentNode->Right();
-
+
// If children exist.
- if(currentLeft && currentRight)
+ if (currentLeft && currentRight)
{
// Push the child nodes on to the stack.
nodeStack.push_back(currentLeft);
nodeStack.push_back(currentRight);
-
+
// Obtain the split point of the popped node.
arma::vec splitPoint = data.col(currentNode->SplitPointIndex());
-
+
// Column indices of the the child nodes.
std::vector<size_t> leftIndices, rightIndices;
leftIndices = currentLeft->VectorIndices();
rightIndices = currentRight->VectorIndices();
-
+
// The columns in the popped should be split into left and right nodes.
BOOST_REQUIRE_EQUAL(currentNode->NumColumns(), leftIndices.size() +
rightIndices.size());
-
+
// Calculate the cosine values for each of the columns in the node.
arma::vec cosines;
cosines.zeros(currentNode->NumColumns());
-
+
size_t i, j, k;
- for(i = 0; i < leftIndices.size(); i++)
- {
+ for (i = 0; i < leftIndices.size(); i++)
cosines(i) = arma::norm_dot(data.col(leftIndices[i]), splitPoint);
- }
- for(j = 0, k = i; j < rightIndices.size(); j++, k++)
- {
+
+ for (j = 0, k = i; j < rightIndices.size(); j++, k++)
cosines(k) = arma::norm_dot(data.col(rightIndices[j]), splitPoint);
- }
-
+
// Check if the columns assigned to the children agree with the splitting
// condition.
double cosineMax = arma::max(cosines % (cosines < 1));
double cosineMin = arma::min(cosines);
-
- for(i = 0; i < leftIndices.size(); i++)
- {
+
+ for (i = 0; i < leftIndices.size(); i++)
BOOST_CHECK_LT(cosineMax - cosines(i), cosines(i) - cosineMin);
- }
- for(j = 0, k = i; j < rightIndices.size(); j++, k++)
- {
+
+ for (j = 0, k = i; j < rightIndices.size(); j++, k++)
BOOST_CHECK_GT(cosineMax - cosines(k), cosines(k) - cosineMin);
- }
}
}
}
@@ -149,51 +143,51 @@
const size_t numCols = 50;
const double epsilon = 1;
const double delta = 0.1;
-
+
// Make a random dataset.
arma::mat data = arma::randu(numRows, numCols);
-
+
// Declare a queue and a dummy CosineTree object.
CosineNodeQueue basisQueue;
CosineTree dummyTree(data, epsilon, delta);
-
+
for(size_t i = 0; i < numCols; i++)
{
// Make a new CosineNode object.
CosineTree* basisNode;
basisNode = new CosineTree(data);
-
+
// Use the columns of the dataset as random centroids.
arma::vec centroid = data.col(i);
arma::vec newBasisVector;
-
+
// Obtain the orthonormalized version of the centroid.
- dummyTree.ModifiedGramSchmidt(basisQueue, centroid, newBasisVector);
-
+ dummyTree.ModifiedGramSchmidt(basisQueue, centroid, newBasisVector);
+
// Check if the obtained vector is orthonormal to the basis vectors.
CosineNodeQueue::const_iterator j = basisQueue.begin();
CosineTree* currentNode;
-
+
for(; j != basisQueue.end(); j++)
{
currentNode = *j;
BOOST_REQUIRE_SMALL(arma::dot(currentNode->BasisVector(), newBasisVector),
1e-5);
}
-
+
// Add the obtained vector to the basis.
basisNode->BasisVector(newBasisVector);
basisNode->L2Error(arma::randu());
basisQueue.push(basisNode);
}
-
+
// Deallocate memory given to the objects.
for(size_t i = 0; i < numCols; i++)
{
CosineTree* currentNode;
currentNode = basisQueue.top();
basisQueue.pop();
-
+
delete currentNode;
}
}
Modified: mlpack/tags/mlpack-1.0.11/src/mlpack/tests/logistic_regression_test.cpp
==============================================================================
--- mlpack/tags/mlpack-1.0.11/src/mlpack/tests/logistic_regression_test.cpp (original)
+++ mlpack/tags/mlpack-1.0.11/src/mlpack/tests/logistic_regression_test.cpp Sun Dec 7 14:47:07 2014
@@ -556,8 +556,11 @@
"1 2 3");
arma::vec responses("1 1 0");
- // Create a logistic regression object using SGD.
- LogisticRegression<SGD> lr(data, responses, 0.001);
+ // Create a logistic regression object using custom SGD with a much smaller
+ // tolerance.
+ LogisticRegressionFunction lrf(data, responses, 0.001);
+ SGD<LogisticRegressionFunction> sgd(lrf, 0.005, 500000, 1e-10);
+ LogisticRegression<SGD> lr(sgd);
// Test sigmoid function.
arma::vec sigmoids = 1 / (1 + arma::exp(-lr.Parameters()[0]
Modified: mlpack/tags/mlpack-1.0.11/src/mlpack/tests/sa_test.cpp
==============================================================================
--- mlpack/tags/mlpack-1.0.11/src/mlpack/tests/sa_test.cpp (original)
+++ mlpack/tags/mlpack-1.0.11/src/mlpack/tests/sa_test.cpp Sun Dec 7 14:47:07 2014
@@ -58,7 +58,7 @@
result = sa.Optimize(coordinates);
++iteration;
- BOOST_REQUIRE_LT(iteration, 3); // No more than three tries.
+ BOOST_REQUIRE_LT(iteration, 4); // No more than three tries.
}
// 0.1% tolerance for each coordinate.
Modified: mlpack/tags/mlpack-1.0.11/src/mlpack/tests/svd_batch_test.cpp
==============================================================================
--- mlpack/tags/mlpack-1.0.11/src/mlpack/tests/svd_batch_test.cpp (original)
+++ mlpack/tags/mlpack-1.0.11/src/mlpack/tests/svd_batch_test.cpp Sun Dec 7 14:47:07 2014
@@ -174,14 +174,14 @@
RandomInitialization,
SVDBatchLearning> amf(SimpleToleranceTermination<mat>(),
RandomInitialization(),
- SVDBatchLearning(0.3, 0.001, 0.001, 0));
+ SVDBatchLearning(0.1, 0.001, 0.001, 0));
mat m1, m2;
amf.Apply(test, 3, m1, m2);
arma::mat result = m1 * m2;
- // 2% tolerance on the norm.
- BOOST_REQUIRE_CLOSE(arma::norm(test, "fro"), arma::norm(result, "fro"), 2.0);
+ // 5% tolerance on the norm.
+ BOOST_REQUIRE_CLOSE(arma::norm(test, "fro"), arma::norm(result, "fro"), 5.0);
}
BOOST_AUTO_TEST_SUITE_END();
More information about the mlpack-svn
mailing list