Commit c543a025 authored by Davis King's avatar Davis King

Changed the code to normalize the regularizer by the sum of edge weights

instead of the straight sum of edges.

--HG--
extra : convert_revision : svn%3Afdd8eb12-d10e-0410-9acb-85c331704f74/trunk%403660
parent b46186fc
...@@ -26,6 +26,7 @@ namespace dlib ...@@ -26,6 +26,7 @@ namespace dlib
) )
{ {
_size = 0; _size = 0;
sum_edge_weights = 0;
} }
struct neighbor struct neighbor
...@@ -132,10 +133,12 @@ namespace dlib ...@@ -132,10 +133,12 @@ namespace dlib
mutable_blocks[i+1] = mutable_blocks[i] + num_neighbors[i]; mutable_blocks[i+1] = mutable_blocks[i] + num_neighbors[i];
} }
sum_edge_weights = 0;
// finally, put the edges into data // finally, put the edges into data
for (unsigned long i = 0; i < edges.size(); ++i) for (unsigned long i = 0; i < edges.size(); ++i)
{ {
const float weight = weight_funct(edges[i]); const float weight = weight_funct(edges[i]);
sum_edge_weights += weight;
// make sure requires clause is not broken // make sure requires clause is not broken
DLIB_ASSERT(weight >= 0, DLIB_ASSERT(weight >= 0,
...@@ -150,6 +153,12 @@ namespace dlib ...@@ -150,6 +153,12 @@ namespace dlib
} }
double sum_of_edge_weights (
) const
{
return sum_edge_weights;
}
private: private:
/*! /*!
...@@ -157,10 +166,12 @@ namespace dlib ...@@ -157,10 +166,12 @@ namespace dlib
- _size == 0 - _size == 0
- data.size() == 0 - data.size() == 0
- blocks.size() == 0 - blocks.size() == 0
- sum_edge_weights == 0
CONVENTION CONVENTION
- size() == _size - size() == _size
- blocks.size() == _size + 1 - blocks.size() == _size + 1
- sum_of_edge_weights() == sum_edge_weights
- blocks == a vector of iterators that point into data. - blocks == a vector of iterators that point into data.
For all valid i: For all valid i:
- The iterator range [blocks[i], blocks[i+1]) contains all the edges - The iterator range [blocks[i], blocks[i+1]) contains all the edges
...@@ -170,6 +181,8 @@ namespace dlib ...@@ -170,6 +181,8 @@ namespace dlib
std::vector<neighbor> data; std::vector<neighbor> data;
std::vector<const_iterator> blocks; std::vector<const_iterator> blocks;
unsigned long _size; unsigned long _size;
double sum_edge_weights;
}; };
} }
...@@ -216,7 +229,7 @@ namespace dlib ...@@ -216,7 +229,7 @@ namespace dlib
impl::undirected_adjacency_list graph; impl::undirected_adjacency_list graph;
graph.build(edges, weight_funct); graph.build(edges, weight_funct);
num_edges = edges.size(); sum_edge_weights = graph.sum_of_edge_weights();
make_mr_matrix(samples, graph); make_mr_matrix(samples, graph);
} }
...@@ -243,7 +256,7 @@ namespace dlib ...@@ -243,7 +256,7 @@ namespace dlib
// sums is typical of most machine learning algorithms. Moreover, doing this makes // sums is typical of most machine learning algorithms. Moreover, doing this makes
// the argument to this function more invariant to the size of the edge set. So it // the argument to this function more invariant to the size of the edge set. So it
// should make it easier for the user. // should make it easier for the user.
intrinsic_regularization_strength /= num_edges; intrinsic_regularization_strength /= sum_edge_weights;
return inv_lower_triangular(chol(identity_matrix<scalar_type>(reg_mat.nr()) + intrinsic_regularization_strength*reg_mat)); return inv_lower_triangular(chol(identity_matrix<scalar_type>(reg_mat.nr()) + intrinsic_regularization_strength*reg_mat));
} }
...@@ -304,7 +317,7 @@ namespace dlib ...@@ -304,7 +317,7 @@ namespace dlib
} }
general_matrix reg_mat; general_matrix reg_mat;
unsigned long num_edges; double sum_edge_weights;
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment