我正在使用Microsoft.MLMicrosoft.ML.TimeSeries来预测一组数字中的峰值。我很难理解我看到的结果。

这是我的代码:

var counts = new[] { 1, 3, 0, 4, 5, 5, 4, 3, 3, 0, 13, 8, 1, 61, 21, 40, 7, 7, 5, 6, 8, 33, 11, 5, 2, 10, 11, 18,
    14, 23, 8, 17, 15, 13, 24, 29, 15, 20, 29, 19, 18, 17, 23, 47, 7, 14, 26, 28, 5, 22, 47, 22, 20, 9, 40, 6, 8,
    4, 10, 10, 1, 4, 27, 3, 3, 7, 6, 12, 8, 3, 1, 2, 0, 0, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2 };
var input = counts.Select(x => new Input { Count = x });

var mlContext = new MLContext();
IDataView data = mlContext.Data.LoadFromEnumerable(input);
var iidSpikeEstimator =
    mlContext.Transforms.DetectIidSpike(nameof(Output.Prediction), nameof(Input.Count), 95, counts.Length / 4);
var empty = mlContext.Data.LoadFromEnumerable(new List<Input>());
ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(empty);
IDataView transformedData = iidSpikeTransform.Transform(data);
var predictions = mlContext.Data.CreateEnumerable<Output>(transformedData, false);

foreach (var prediction in predictions)
{
    Console.WriteLine($"{prediction.Prediction[0]}\t{prediction.Prediction[1]}\t{prediction.Prediction[2]}");
}


我正在使用以下输入和预测类:

class Input
{
    public float Count { get; set; }
}

class Output
{
    [VectorType(3)]
    public double[] Prediction { get; set; }
}


预测的输出如下所示:

0       1       0,5
0       3       0,0227500628872564
0       0       0,0800026155568392
0       4       0,0733626073142035
0       5       0,0932462626257468
0       5       0,190871542788827
0       4       0,379365893907011
0       3       0,452249112542357
0       3       0,454337555107054
0       0       0,0965646168807073
0       13      7,23183654849358E-07
0       8       0,162796225508786
0       1       0,26866445055949
0       61      1E-08               <-- why not a spike
0       21      0,195321812351945
0       40      0,0762898593217751
0       7       0,481418456206597
0       7       0,483562672962325
0       5       0,441585392014299
0       6       0,467300428950856
0       8       0,484291998890946
0       33      0,111856212216161
0       11      0,441518762773849
0       5       0,421979379033421
0       2       0,348450809756736
0       10      0,466840217502056
0       11      0,454355922201826
0       18      0,316468096964188
0       14      0,410908187378685
0       23      0,252048457884371
0       8       0,422207338357772
0       17      0,382816778395844
0       15      0,439773264257255
0       13      0,499329093726086
0       24      0,269983517311637
0       29      0,2086753725973
0       15      0,496567280529924
0       20      0,327020081694874
0       29      0,147369517489864
0       19      0,334164937331234
0       18      0,381759336027671
0       17      0,430897832263909
0       23      0,25778090864275
1       47      0,00250415226768458 <-- agree
0       7       0,200797162863148
0       14      0,421036850271146
0       26      0,230152726021095
0       28      0,202263299629237
0       5       0,107362758973973
0       22      0,385731992498547
1       47      0,0251788165486866 <-- agree
0       22      0,440930249298629
0       20      0,489012267971093
0       9       0,198173557199813
0       40      0,100577620435893
0       6       0,140406687351199
0       8       0,193919165630175
0       4       0,136113850848066
0       10      0,273471906906776
0       10      0,293134313053193
0       1       0,134665458845283
0       4       0,209906681773312
0       27      0,285741557145236
0       3       0,211526145085249
0       3       0,230972979939345
0       7       0,326126679501019
0       6       0,322283486761539
0       12      0,480655683498934
0       8       0,376885091334182
0       3       0,268871502200523
0       1       0,243880218497084
0       2       0,286817699304078
0       0       0,245658326315034
0       0       0,266308213133336
0       2       0,317490216757222
0       0       0,270180835461669
0       2       0,357761804545598
0       0       0,299759432885454
0       0       0,263204845258311
0       0       0,280257822339588
0       4       0,486752376815113
0       0       0,29899600168968
0       0       0,31785768842959
0       0       0,336269786978528
0       0       0,33962160591499
0       0       0,35130274405966
0       0       0,318196919735171
0       1       0,431070960185983
0       1       0,44131445885367
0       0       0,354063798338961
0       0       0,372226649193085
0       2       0,300492332964686


如图所示,有两个峰值。对我来说,这看起来不错。我不明白的是为什么第14行的计数没有标记为峰值。计数范围是0到13,直到14。然后突然跳到61。在查看图形中的数据时,对我来说,跳变绝对是一个峰值。

谁能帮助我了解那里发生的事情

最佳答案

问题似乎是当p值变得太小时,您设置为95的“置信度”无法正常工作。
您可以看到,当在Prediction [2]中添加“ 0.000”时,小于0.000的值不会显示为峰值。

Console.WriteLine($"{prediction.Prediction[0]}\t{prediction.Prediction[1]}\t{prediction.Prediction[2:0.000]}");
0       13      0.000
0       8       0.163
0       23      0.000
0       23      0.258
1       47      0.003
0       7       0.201


我不确定为什么它不起作用,但是一种解决方法是通过检查小于0.05的置信度来手动检测峰值。例如:

            if (prediction.Prediction[2] < (1 - 0.95))
            {
                prediction.Prediction[0] = 1;
            }
            Console.WriteLine($"{prediction.Prediction[0]}\t{prediction.Prediction[1]}\t{prediction.Prediction[2]:0.000}");


将导致

0       1       0.500
1       3       0.023
0       0       0.080
0       4       0.073
0       5       0.093
0       5       0.191
0       4       0.379
0       3       0.452
0       3       0.454
0       0       0.097
1       13      0.000
0       8       0.163
1       23      0.000
1       61      0.000
0       51      0.057
0       6       0.446
0       7       0.468
0       7       0.471
0       5       0.433
0       6       0.457
0       8       0.498
0       33      0.133
0       11      0.456
0       5       0.416
0       2       0.347
0       10      0.480
0       11      0.468
0       18      0.336
0       14      0.426
0       23      0.272
0       8       0.416
0       17      0.398
0       15      0.453
0       13      0.489
0       24      0.289
0       29      0.228
0       15      0.491
0       20      0.325
0       29      0.093
0       19      0.334
0       18      0.382
0       17      0.431
0       23      0.258
1       47      0.003
0       7       0.201
0       14      0.421
0       26      0.230
0       28      0.202
0       5       0.107
0       22      0.386
1       47      0.025
0       22      0.441
0       20      0.489
0       9       0.198
0       40      0.101
0       6       0.140
0       8       0.194
0       4       0.136
0       10      0.273
0       10      0.293
0       1       0.135
0       4       0.210
0       27      0.286
0       3       0.212
0       3       0.231
0       7       0.326
0       6       0.322
0       12      0.481
0       8       0.377
0       3       0.269
0       1       0.244
0       2       0.287
0       0       0.246
0       0       0.266
0       2       0.317
0       0       0.270
0       2       0.358
0       0       0.300
0       0       0.263
0       0       0.280
0       4       0.487
0       0       0.299
0       0       0.318
0       0       0.336
0       0       0.340
0       0       0.351
0       0       0.318
0       1       0.431
0       1       0.441
0       0       0.354
0       0       0.372
0       2       0.300

关于c# - 使用Microsoft.ML和DetectIidSpike了解峰值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58238406/

10-12 22:40