我正在使用Microsoft.ML
和Microsoft.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/