-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Add deseasonality in SrCnnEntireAnomalyDetect #5202
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
52 commits
Select commit
Hold shift + click to select a range
78961c7
add seasonality detect and stl decompose in srcnn
468d444
optimizations in performance
45b6971
Add parameter period in SrCnn interface, remove inner period detect l…
245731f
add periodical data
604084a
add test
7c6734f
Remove unused files
8ea07f6
further remove unused codes
b398fdb
remove unused functions
cce849d
update
10935c3
optimize WeightedRegression; clean code; add null checks
b524957
recover
d40440b
reduce file numbers
92c6aab
restore
f6e8566
move stl related codes to a subfolder
d4515ee
fix sln file
8778e5a
update code style
219decd
fix members initialization outside the constructor
e039cba
remove unused using
3553277
refactor InnerStl
8c693c9
use contract exception
37e7c6f
remove unused class
65fb7a5
update stl
d2e2653
remove unused usings
edc8a21
add readonly
7737a57
fix bug
2e6b0e5
Merge branch 'master' into dev/srcnn_deseasonality
8df11b5
Merge branch 'master' into dev/srcnn_deseasonality
guinao fbf3e0e
Merge branch 'dev/srcnn_deseasonality' of https://github.com/guinao/m…
86f64f7
add deseasonality
0d1a038
update deseasonality
c87ae95
update
b59660c
add options
5a93fa1
refine code style
1a7b071
refine code
b6fa553
update
192d782
updates
1b90669
remove max neighbor number constraint
92b0963
remove the max neightbor count constraint
59e7f2b
update SrCnnEntireDetectOptions, move input/output column name out; …
b38c123
refactor the constructor of Loess
d72d97b
remove unused imports
c58a45b
refactor and optimization
3939380
optimize
7e48255
unfold pow(x, 2) to x * x for performance optimization
c3f74d5
refactor polynomial model class and deseasonality functions, refine c…
816479a
refine
a239a89
update comment
1446115
updates
8b10cc0
update some wordings
a817829
update comments
8fac10e
update some comments
2cad48f
wording
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
// See the LICENSE file in the project root for more information. | ||
|
||
using System; | ||
using System.Collections.Generic; | ||
|
||
namespace Microsoft.ML.TimeSeries | ||
{ | ||
internal interface IDeseasonality | ||
{ | ||
/// <summary> | ||
/// Remove the seasonality component from the given time-series. | ||
/// </summary> | ||
/// <param name="values">An array representing the input time-series.</param> | ||
/// <param name="period">The period value of the time-series.</param> | ||
/// <param name="results">The de-seasonalized time-series.</param> | ||
public abstract void Deseasonality(ref double[] values, int period, ref double[] results); | ||
} | ||
|
||
internal sealed class MeanDeseasonality : IDeseasonality | ||
{ | ||
private double[] _circularComponent; | ||
|
||
public void Deseasonality(ref double[] values, int period, ref double[] results) | ||
{ | ||
Array.Resize(ref _circularComponent, period); | ||
|
||
var length = values.Length; | ||
|
||
// Initialize the circular component to 0. | ||
for (int i = 0; i < period; ++i) | ||
{ | ||
_circularComponent[i] = 0; | ||
} | ||
|
||
// Sum up values that locate at the same position in one period. | ||
for (int i = 0; i < length; ++i) | ||
{ | ||
var indexInPeriod = i % period; | ||
_circularComponent[indexInPeriod] += values[i]; | ||
} | ||
|
||
// Calculate the mean value as circular component. | ||
var cnt = (length - 1) / period; | ||
var rest = (length - 1) % period; | ||
for (int i = 0; i < period; ++i) | ||
{ | ||
var lastCircle = i <= rest ? 1 : 0; | ||
_circularComponent[i] = _circularComponent[i] / (cnt + lastCircle); | ||
} | ||
|
||
// Substract the circular component from the original series. | ||
for (int i = 0; i < length; ++i) | ||
{ | ||
var indexInPeriod = i % period; | ||
results[i] -= _circularComponent[indexInPeriod]; | ||
} | ||
} | ||
} | ||
|
||
internal sealed class MedianDeseasonality : IDeseasonality | ||
{ | ||
private List<double>[] _subSeries; | ||
private double[] _circularComponent; | ||
|
||
public void Deseasonality(ref double[] values, int period, ref double[] results) | ||
{ | ||
Array.Resize(ref _circularComponent, period); | ||
Array.Resize(ref _subSeries, period); | ||
|
||
var length = values.Length; | ||
|
||
for (int i = 0; i < period; ++i) | ||
{ | ||
_subSeries[i] = new List<double>(); | ||
} | ||
|
||
// Split the original series into #period subseries. | ||
for (int i = 0; i < length; ++i) | ||
{ | ||
var indexInPeriod = i % period; | ||
_subSeries[indexInPeriod].Add(values[i]); | ||
} | ||
|
||
// Calculate the median value as circular component. | ||
for (int i = 0; i < period; ++i) | ||
{ | ||
_circularComponent[i] = MathUtility.QuickMedian(_subSeries[i]); | ||
} | ||
|
||
// Substract the circular component from the original series. | ||
for (int i = 0; i < length; ++i) | ||
{ | ||
var indexInPeriod = i % period; | ||
results[i] -= _circularComponent[indexInPeriod]; | ||
} | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// This class takes the residual component of stl decompose as the deseasonality result. | ||
/// </summary> | ||
internal sealed class StlDeseasonality : IDeseasonality | ||
{ | ||
private readonly InnerStl _stl; | ||
|
||
public StlDeseasonality() | ||
{ | ||
_stl = new InnerStl(true); | ||
} | ||
|
||
public void Deseasonality(ref double[] values, int period, ref double[] results) | ||
{ | ||
bool success = _stl.Decomposition(values, period); | ||
if (success) | ||
{ | ||
for (int i = 0; i < _stl.Residual.Count; ++i) | ||
{ | ||
results[i] = _stl.Residual[i]; | ||
} | ||
} | ||
else | ||
{ | ||
for (int i = 0; i < values.Length; ++i) | ||
{ | ||
results[i] = values[i]; | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
// See the LICENSE file in the project root for more information. | ||
|
||
using System.Collections.Generic; | ||
using Microsoft.ML.Runtime; | ||
|
||
namespace Microsoft.ML.TimeSeries | ||
{ | ||
/// <summary> | ||
/// This is the fast version of Loess. There are several alternatives to improve the performance. This one is an approximation approach. | ||
/// The smoothing is conducted on a sample set, and then the values on the left points are assigned directly. | ||
/// </summary> | ||
internal class FastLoess | ||
{ | ||
/// <summary> | ||
/// This class is a sampling based method, so here specifies the sample size. | ||
/// </summary> | ||
private const int _sampleSize = 100; | ||
|
||
/// <summary> | ||
/// The minimum length of a valid time series. A time series with length equals 2 is so trivial and meaningless less than 2. | ||
/// </summary> | ||
public const int MinTimeSeriesLength = 3; | ||
|
||
private readonly IReadOnlyList<double> _x; | ||
private readonly IReadOnlyList<double> _y; | ||
private readonly int _length; | ||
|
||
private readonly Loess _smoother; | ||
|
||
/// <summary> | ||
/// Initializes a new instance of the <see cref="FastLoess"/> class. | ||
/// The fast version of the Loess method. when the time series is too long, the sampling will be conducted first to improve the performance. | ||
/// </summary> | ||
/// <param name="xValues">The input x-axis values</param> | ||
/// <param name="yValues">The input y-axis values</param> | ||
/// <param name="isTemporal">If the regression is considered to take temporal information into account. In general, this is true if we are regressing a time series, and false if we are regressing scatter plot data</param> | ||
/// <param name="r">This method will provide default smoothing ratio if user did not specify</param> | ||
public FastLoess(IReadOnlyList<double> xValues, IReadOnlyList<double> yValues, bool isTemporal = true, int r = -1) | ||
{ | ||
Contracts.CheckValue(xValues, nameof(xValues)); | ||
Contracts.CheckValue(yValues, nameof(yValues)); | ||
Y = new List<double>(); | ||
|
||
if (yValues.Count < MinTimeSeriesLength) | ||
throw Contracts.Except("input data structure cannot be 0-length: lowess"); | ||
|
||
_x = xValues; | ||
_y = yValues; | ||
_length = _y.Count; | ||
|
||
if (_length <= FastLoess._sampleSize) | ||
{ | ||
if (r == -1) | ||
_smoother = new Loess(_x, _y, isTemporal); | ||
else | ||
_smoother = new Loess(_x, _y, isTemporal, r); | ||
} | ||
else | ||
{ | ||
// Conduct sampling based strategy, to boost the performance. | ||
double step = _length * 1.0 / FastLoess._sampleSize; | ||
var sampleX = new double[FastLoess._sampleSize]; | ||
var sampleY = new double[FastLoess._sampleSize]; | ||
for (int i = 0; i < FastLoess._sampleSize; i++) | ||
{ | ||
int index = (int)(i * step); | ||
sampleX[i] = _x[index]; | ||
sampleY[i] = _y[index]; | ||
} | ||
if (r == -1) | ||
_smoother = new Loess(sampleX, sampleY, isTemporal); | ||
else | ||
_smoother = new Loess(sampleX, sampleY, isTemporal, r); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// The estimated y values. | ||
/// </summary> | ||
public List<double> Y { get; } | ||
|
||
/// <summary> | ||
/// Assign the smoothing values to all the data points, not only on the sample size. | ||
/// </summary> | ||
public void Estimate() | ||
{ | ||
for (int i = 0; i < _length; i++) | ||
{ | ||
double yValue = _smoother.EstimateY(_x[i]); | ||
Y.Add(yValue); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// Estimate a y value by giving an x value, even if the x value is not one of the input points. | ||
/// </summary> | ||
public double EstimateY(double xValue) | ||
{ | ||
return _smoother.EstimateY(xValue); | ||
} | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.