首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提供了长度为3的数组,当使用vVector__1对变量“Infer.NET”期望长度为6时

提供了长度为3的数组,当使用vVector__1对变量“Infer.NET”期望长度为6时
EN

Stack Overflow用户
提问于 2012-11-10 04:14:20
回答 1查看 109关注 0票数 0

我正在尝试修改一个来自Infer.NET的示例,使其更加灵活。我希望能够发送任意数量的度量来进行预测。

我创建了以下包装类(非常接近原始示例):

代码语言:javascript
复制
class Inference
{
    private readonly List<List<double>> _pastMetrics = new List<List<double>>();

    public void AddPastMetrics(List<double> pastMetrics)
    {
        _pastMetrics.Add(pastMetrics);
    }

    private readonly List<Boolean> _pastResults = new List<Boolean>();

    public void AddPastResults(Boolean pastResults)
    {
        _pastResults.Add(pastResults);
    }

    private readonly List<List<double>> _testMetrics = new List<List<double>>();

    public void AddTestMetrics(List<double> dayMetrics)
    {
        _testMetrics.Add(dayMetrics);
    }

    public Object GetInfer()
    {
        // Create x vector, augmented by 1
        Vector[] xdata = new Vector[_pastMetrics.Count];
        for (int i = 0; i < xdata.Length; i++)
            xdata[i] = Vector.FromList(_pastMetrics[i]);
        VariableArray<Vector> x = Variable.Observed(xdata);

        // Create target y
        VariableArray<bool> y = Variable.Observed(_pastResults.ToArray(), x.Range);
        var count = _pastMetrics.First().Count;
        Variable<Vector> w = Variable.Random(new VectorGaussian(Vector.Zero(count), PositiveDefiniteMatrix.Identity(count)));
        Range j = y.Range;
        double noise = 0.1;
        y[j] = Variable.GaussianFromMeanAndVariance(Variable.InnerProduct(w, x[j]), noise) > 0;

        InferenceEngine engine = new InferenceEngine(new ExpectationPropagation());
        VectorGaussian wPosterior = engine.Infer<VectorGaussian>(w);

        VariableArray<bool> ytest = Variable.Array<bool>(new Range(_pastMetrics.Count));
        BayesPointMachine(Variable.Random(wPosterior), ytest);
        return engine.Infer(ytest);

    }

    void BayesPointMachine(Variable<Vector> w, VariableArray<bool> y)
    {
        // Create x vector, augmented by 1
        Range j = y.Range;
        Vector[] xdata = new Vector[_testMetrics.Count];
        for (int i = 0; i < xdata.Length; i++)
            xdata[i] = Vector.FromList(_testMetrics[i]);
        VariableArray<Vector> x = Variable.Observed(xdata, j);

        // Bayes Point Machine
        double noise = 0.1;
        y[j] = Variable.GaussianFromMeanAndVariance(Variable.InnerProduct(w, x[j]), noise) > 0;
    }
}

以下是主要的步骤:

代码语言:javascript
复制
static void Main()
{   
    var inf = new Inference();
    double[] incomes = { 63, 16, 28, 55, 22, 20 };
    double[] ages = { 38, 23, 40, 27, 18, 40 };
    for (int i = 0; i < incomes.Length; i++)
        inf.AddPastMetrics(new List<double> {incomes[i], ages[i]});

    double[] incomesTest = { 58, 18, 22 };
    double[] agesTest = { 36, 24, 37 };
    for (int i = 0; i < incomesTest.Length; i++)
        inf.AddTestMetrics(new List<double> { incomesTest[i], agesTest[i] });

    bool[] willBuy = { true, false, true, true, false, false };
    for (int i = 0; i < willBuy.Length; i++)
        inf.AddPastResults(willBuy[i]);

    Console.WriteLine("output=\n" + inf.GetInfer());

}

当我调用infer方法时,我得到以下错误:

提供了长度为3的数组,当变量“vVector__1”的长度为6时

知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-10 05:59:18

我忘了给数组添加一个1。从示例页面:

我们将利用这些数据来训练我们的贝斯点机。为此,我们需要创建两个观测数组,一个称为x,它由输入特性的向量(通过附加1)来增强,另一个叫做y,它只是包装willBuy。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13319178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档