Skip to content

Commit

Permalink
Merge pull request #227 from karlnapf/master
Browse files Browse the repository at this point in the history
simplified parameter trees for model selection
  • Loading branch information
Soeren Sonnenburg committed Jul 22, 2011
2 parents 0f1f5d9 + 80b7302 commit 31d21d3
Show file tree
Hide file tree
Showing 9 changed files with 24 additions and 138 deletions.
Expand Up @@ -27,9 +27,6 @@ CModelSelectionParameters* create_param_tree()
{
CModelSelectionParameters* root=new CModelSelectionParameters();

CModelSelectionParameters* kernel=new CModelSelectionParameters("kernel");
root->append_child(kernel);

CModelSelectionParameters* c=new CModelSelectionParameters("C1");
root->append_child(c);
c->build_values(1, 2, R_EXP);
Expand All @@ -38,7 +35,7 @@ CModelSelectionParameters* create_param_tree()
CModelSelectionParameters* param_gaussian_kernel=
new CModelSelectionParameters("kernel", gaussian_kernel);

kernel->append_child(param_gaussian_kernel);
root->append_child(param_gaussian_kernel);

CModelSelectionParameters* param_gaussian_kernel_width=
new CModelSelectionParameters("width");
Expand Down
Expand Up @@ -27,9 +27,6 @@ CModelSelectionParameters* build_complex_example_tree()
{
CModelSelectionParameters* root=new CModelSelectionParameters();

CModelSelectionParameters* kernel=new CModelSelectionParameters("kernel");
root->append_child(kernel);

CModelSelectionParameters* c=new CModelSelectionParameters("C");
root->append_child(c);
c->build_values(1, 1, R_EXP);
Expand All @@ -38,7 +35,7 @@ CModelSelectionParameters* build_complex_example_tree()
CModelSelectionParameters* param_power_kernel=
new CModelSelectionParameters("kernel", power_kernel);

kernel->append_child(param_power_kernel);
root->append_child(param_power_kernel);

CModelSelectionParameters* param_power_kernel_degree=
new CModelSelectionParameters("degree");
Expand All @@ -60,7 +57,7 @@ CModelSelectionParameters* build_complex_example_tree()
CModelSelectionParameters* param_gaussian_kernel=
new CModelSelectionParameters("kernel", gaussian_kernel);

kernel->append_child(param_gaussian_kernel);
root->append_child(param_gaussian_kernel);

CModelSelectionParameters* param_gaussian_kernel_width=
new CModelSelectionParameters("width");
Expand All @@ -71,7 +68,7 @@ CModelSelectionParameters* build_complex_example_tree()
CModelSelectionParameters* param_ds_kernel=new CModelSelectionParameters("kernel",
ds_kernel);

kernel->append_child(param_ds_kernel);
root->append_child(param_ds_kernel);

CModelSelectionParameters* param_ds_kernel_delta=
new CModelSelectionParameters("delta");
Expand Down Expand Up @@ -108,19 +105,6 @@ CModelSelectionParameters* build_root_no_childs_tree()
return new CModelSelectionParameters();
}

CModelSelectionParameters* build_name_node_one_child_tree()
{
CModelSelectionParameters* kernel=new CModelSelectionParameters("kernel");

CPowerKernel* power_kernel=new CPowerKernel();
CModelSelectionParameters* param_power_kernel=new CModelSelectionParameters(
"kernel", power_kernel);

kernel->append_child(param_power_kernel);

return kernel;
}

CModelSelectionParameters* build_root_value_childs_tree()
{
CModelSelectionParameters* root=new CModelSelectionParameters();
Expand All @@ -136,29 +120,23 @@ CModelSelectionParameters* build_root_value_childs_tree()
return root;
}

CModelSelectionParameters* build_root_name_sg_object_child_tree()
CModelSelectionParameters* build_root_sg_object_child_tree()
{
CModelSelectionParameters* root=new CModelSelectionParameters();

CModelSelectionParameters* kernel=new CModelSelectionParameters("kernel");
root->append_child(kernel);

CPowerKernel* power_kernel=new CPowerKernel();
CModelSelectionParameters* param_power_kernel=
new CModelSelectionParameters("kernel", power_kernel);

kernel->append_child(param_power_kernel);
root->append_child(param_power_kernel);

return root;
}

CModelSelectionParameters* build_root_name_sg_object_child_value_child_tree()
CModelSelectionParameters* build_root_sg_object_child_value_child_tree()
{
CModelSelectionParameters* root=new CModelSelectionParameters();

CModelSelectionParameters* kernel=new CModelSelectionParameters("kernel");
root->append_child(kernel);

CPowerKernel* power_kernel=new CPowerKernel();
CModelSelectionParameters* param_power_kernel=
new CModelSelectionParameters("kernel", power_kernel);
Expand All @@ -167,7 +145,7 @@ CModelSelectionParameters* build_root_name_sg_object_child_value_child_tree()
root->append_child(c);
c->build_values(1, 1, R_EXP);

kernel->append_child(param_power_kernel);
root->append_child(param_power_kernel);

return root;
}
Expand Down Expand Up @@ -212,22 +190,17 @@ int main(int argc, char **argv)
test_get_combinations(tree);
SG_UNREF(tree);

tree=build_name_node_one_child_tree();
SG_REF(tree);
test_get_combinations(tree);
SG_UNREF(tree);

tree=build_root_value_childs_tree();
SG_REF(tree);
test_get_combinations(tree);
SG_UNREF(tree);

tree=build_root_name_sg_object_child_tree();
tree=build_root_sg_object_child_tree();
SG_REF(tree);
test_get_combinations(tree);
SG_UNREF(tree);

tree=build_root_name_sg_object_child_value_child_tree();
tree=build_root_sg_object_child_value_child_tree();
SG_REF(tree);
test_get_combinations(tree);
SG_UNREF(tree);
Expand Down
Expand Up @@ -27,9 +27,6 @@ CModelSelectionParameters* create_param_tree()
{
CModelSelectionParameters* root=new CModelSelectionParameters();

CModelSelectionParameters* kernel=new CModelSelectionParameters("kernel");
root->append_child(kernel);

CModelSelectionParameters* c=new CModelSelectionParameters("C");
root->append_child(c);
c->build_values(1, 11, R_EXP);
Expand All @@ -38,7 +35,7 @@ CModelSelectionParameters* create_param_tree()
CModelSelectionParameters* param_power_kernel=
new CModelSelectionParameters("kernel", power_kernel);

kernel->append_child(param_power_kernel);
root->append_child(param_power_kernel);

CModelSelectionParameters* param_power_kernel_degree=
new CModelSelectionParameters("degree");
Expand All @@ -60,7 +57,7 @@ CModelSelectionParameters* create_param_tree()
CModelSelectionParameters* param_gaussian_kernel=
new CModelSelectionParameters("kernel", gaussian_kernel);

kernel->append_child(param_gaussian_kernel);
root->append_child(param_gaussian_kernel);

CModelSelectionParameters* param_gaussian_kernel_width=
new CModelSelectionParameters("width");
Expand All @@ -71,7 +68,7 @@ CModelSelectionParameters* create_param_tree()
CModelSelectionParameters* param_ds_kernel=new CModelSelectionParameters("kernel",
ds_kernel);

kernel->append_child(param_ds_kernel);
root->append_child(param_ds_kernel);

CModelSelectionParameters* param_ds_kernel_delta=
new CModelSelectionParameters("delta");
Expand Down
Expand Up @@ -22,16 +22,13 @@ def modelselection_parameter_tree_modular():
combinations=root.get_combinations()
combinations.get_num_elements()

kernel=ModelSelectionParameters('kernel')
root.append_child(kernel)

c=ModelSelectionParameters('C');
root.append_child(c)
c.build_values(1, 11, R_EXP)

power_kernel=PowerKernel()
param_power_kernel=ModelSelectionParameters('kernel', power_kernel)
kernel.append_child(param_power_kernel)
root.append_child(param_power_kernel)

param_power_kernel_degree=ModelSelectionParameters('degree')
param_power_kernel_degree.build_values(1, 1, R_EXP)
Expand All @@ -49,7 +46,7 @@ def modelselection_parameter_tree_modular():
gaussian_kernel=GaussianKernel()
param_gaussian_kernel=ModelSelectionParameters('kernel', gaussian_kernel)

kernel.append_child(param_gaussian_kernel)
root.append_child(param_gaussian_kernel)

param_gaussian_kernel_width=ModelSelectionParameters('width')
param_gaussian_kernel_width.build_values(1, 2, R_EXP)
Expand All @@ -58,7 +55,7 @@ def modelselection_parameter_tree_modular():
ds_kernel=DistantSegmentsKernel()
param_ds_kernel=ModelSelectionParameters('kernel', ds_kernel)

kernel.append_child(param_ds_kernel)
root.append_child(param_ds_kernel)

param_ds_kernel_delta=ModelSelectionParameters('delta')
param_ds_kernel_delta.build_values(1, 2, R_EXP)
Expand Down
5 changes: 3 additions & 2 deletions src/shogun/evaluation/CrossValidation.cpp
Expand Up @@ -13,6 +13,7 @@
#include <shogun/evaluation/Evaluation.h>
#include <shogun/evaluation/SplittingStrategy.h>
#include <shogun/base/Parameter.h>
#include <shogun/mathematics/Statistics.h>

using namespace shogun;

Expand Down Expand Up @@ -86,7 +87,7 @@ CrossValidationResult CCrossValidation::evaluate()

/* construct evaluation result */
CrossValidationResult result;
result.value=CMath::mean(results, m_num_runs);
result.value=CStatistics::mean(SGVector<float64_t>(results, m_num_runs));
result.has_conf_int=m_conf_int_p!=0;
result.conf_int_p=m_conf_int_p;

Expand Down Expand Up @@ -178,7 +179,7 @@ float64_t CCrossValidation::evaluate_one_run()
}

/* build arithmetic mean of results */
float64_t mean=CMath::mean(results, num_subsets);
float64_t mean=CStatistics::mean(SGVector<float64_t>(results, num_subsets));

/* clean up */
delete[] results;
Expand Down
50 changes: 0 additions & 50 deletions src/shogun/modelselection/ModelSelectionParameters.cpp
Expand Up @@ -86,10 +86,6 @@ void CModelSelectionParameters::append_child(CModelSelectionParameters* child)
}
}

/* root nodes may not have sgobject children */
if (!m_node_name && !has_children() && child->m_sgobject)
SG_ERROR("root node may not have CSGObject children\n");

m_child_nodes->append_element(child);
}

Expand Down Expand Up @@ -341,52 +337,6 @@ CDynamicObjectArray<CParameterCombination>* CModelSelectionParameters::get_combi
}

}

/* case name placeholder node: a node which contains a (parameter) name and
* one (or more) CSGObject nodes which are to be substituted into the
* parameter with the above name. The parameter name is one of the learning
* machine, like "kernel". basically all combinations of all children have to
* be appended to the result and a new root is to be added to all trees
*/
else if (m_node_name && !m_sgobject && !m_values.vector)
{
if (!m_child_nodes->get_num_elements())
{
SG_ERROR("ModelSelectionParameter node with name but no children or "
"values.\n");
}

for (index_t i=0; i<m_child_nodes->get_num_elements(); ++i)
{
/* recursively get all combinations of the current child */
CModelSelectionParameters* child=m_child_nodes->get_element(i);
CDynamicObjectArray<CParameterCombination>* child_combinations=
child->get_combinations();
SG_REF(child_combinations);

SG_UNREF(child);

/* and process them each */
for (index_t j=0; j<child_combinations->get_num_elements(); ++j)
{
CParameterCombination* current=child_combinations->get_element(
j);

/* append new root node with the name */
CParameterCombination* new_root=new CParameterCombination(
m_node_name);
new_root->append_child(current);
child_combinations->set_element(new_root, j);

SG_UNREF(current);

/* append them to the result */
result->append_element(new_root);
}

SG_UNREF(child_combinations);
}
}
else
SG_ERROR("Illegal CModelSelectionParameters node type.\n");

Expand Down
11 changes: 2 additions & 9 deletions src/shogun/modelselection/ModelSelectionParameters.h
Expand Up @@ -29,11 +29,7 @@ enum ERangeType
* structure is organized as a tree with different kinds of nodes, depending on
* the values of its member variables of name and CSGObject.
*
* -root node: no name and no CSGObject, may have children. Children may not be
* of CSGObject node type (use placeholder node)
*
* -placeholder node: only has a name and children, used to bundle parameters
* that belong to the learning machine directly, like "kernel"
* -root node: no name and no CSGObject, may have children
*
* -CSGObject node: has name and a CSGObject, may have children which are the
* parameters of the CSGObject. CSGObjects are SG_REF'ed/SG_UNREF'ed
Expand All @@ -45,7 +41,7 @@ enum ERangeType
* After a (legal!) tree is constructed with the append_child method, all
* possible combinations that are implied by this tree may be extracted with the
* get_combinations method. It generates a set of trees (different kind than
* this one) that contain the instanciated parameter combinations.
* this one) that contain the instantiated parameter combinations.
*/
class CModelSelectionParameters: public CSGObject
{
Expand Down Expand Up @@ -80,9 +76,6 @@ class CModelSelectionParameters: public CSGObject
* ERangeType (s. above) of the range, which is used to fill an array with
* concrete values. For some range types, a base is required
*
* Calling this function transforms a placeholder node (without children)
* into a value node.
*
* @param min minimum of desired range. Requires min<max
* @param max maximum of desired range. Requires min<max
* @param type the way the values are created, see ERangeType
Expand Down

0 comments on commit 31d21d3

Please sign in to comment.