如何在机器学习类中使用数组?

时间:2016-10-08 17:46:31

标签: c++ machine-learning

我是C ++的新手,我认为让我加入的一个好方法是构建一些我用其他语言构建的基本模型。我想从使用一阶方法解决的线性回归开始。所以这就是我希望如何组织事物(伪代码)。

class LinearRegression

    LinearRegression:
        tol = <a supplied tolerance or defaulted to 1e-5>
        max_ite = <a supplied max iter or default to 1k>

    fit(X, y):
        // model learns weights specific to this data set

    _gradient(X, y):
        // compute the gradient

    score(X,y):
        // model uses weights learned from fit to compute accuracy of 
        //   y_predicted to actual y

我的问题是,当我使用fit,score和gradient方法时,我实际上不需要传递数组(X和y),甚至将它们存储在任何地方,所以我想使用引用或指向那些结构。我的问题是,如果方法接受指向2D数组的指针,我需要提前提供第二个维度大小或使用模板。如果我使用模板我现在对于接受2D数组的每个方法都有这样的东西

template<std::size_t rows, std::size_t cols> 
void fit(double (&X)[rows][cols], double &y){...}

似乎可能有更好的方法。我希望我的回归类适用于任何大小的输入。这是如何在工业中完成的?我知道在某些情况下,数组只是扁平化为行或列主要格式,其中只传递了指向第一个元素的指针,但我没有足够的经验来了解人们在C ++中使用的内容。

1 个答案:

答案 0 :(得分:2)

你在问题​​中写了不少分,所以这里有一些要点:

  1. 当代C ++不鼓励直接使用手动分配或解除分配所需的堆分配数据。您可以使用例如std::vector<double>来表示向量,并使用std::vector<std::vector<double>>来表示矩阵。更好的方法是使用matrix class,最好是one that is already in mainstream use

  2. 使用这样的类后,您可以在运行时轻松获取维度。例如,使用std::vector,您可以使用size()方法。其他类有其他方法。查看您选择的文档。

  3. 您可能真的不想使用尺寸模板。

    一个。如果这样做,则每次获得不同的输入时都需要重新编译。您的代码将(由编译器)复制到您同时使用的不同维度的数量。很多坏东西,收益很少(在这种情况下)。从类中获取维度时没有真正的缺点。

    湾模板(在您的设置中)适合矩阵的类型(例如,它是double s或float s的矩阵,还是可能维数的数量(例如,用于指定张量)。

  4. 您的回归量不需要存储矩阵和/或向量。通过const引用传递它们。您的界面看起来像sklearn。如果您愿意,请检查那里的源代码。调用fit的结果只是使类对象存储对应于预测向量β的参数。它不会复制或存储输入矩阵和/或向量。