Browse Source

Cosmetics

provider
Christoph Ruegg 13 years ago
parent
commit
5fccbdd957
  1. 2
      LICENSE.md
  2. 5
      MathNet.Numerics.sln.DotSettings
  3. 42
      src/Numerics/Distributions/Triangular.cs
  4. 2
      src/Numerics/Financial/AbsoluteRiskMeasures.cs
  5. 4
      src/Numerics/LinearRegression/WeightedRegression.cs
  6. 10
      src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs
  7. 16
      src/Numerics/SpecialFunctions/Gamma.cs
  8. 135
      src/Numerics/Statistics/DescriptiveStatistics.cs

2
LICENSE.md

@ -1,7 +1,7 @@
Math.NET Numerics License (MIT/X11) Math.NET Numerics License (MIT/X11)
=================================== ===================================
Copyright (c) 2002-2013 Math.NET Copyright (c) 2002-2014 Math.NET
Permission is hereby granted, free of charge, to any person Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation obtaining a copy of this software and associated documentation

5
MathNet.Numerics.sln.DotSettings

@ -1,4 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FileMasksToSkip/=_002A_002Ecshtml/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/CodeCleanup/Profiles/=Full_0020Cleanup_0020_0028Math_002ENET_0029/@EntryIndexedValue">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Profile name="Full Cleanup (Math.NET)"&gt;&lt;CSArrangeThisQualifier&gt;True&lt;/CSArrangeThisQualifier&gt;&lt;CSRemoveCodeRedundancies&gt;True&lt;/CSRemoveCodeRedundancies&gt;&lt;CSUseAutoProperty&gt;True&lt;/CSUseAutoProperty&gt;&lt;CSMakeFieldReadonly&gt;True&lt;/CSMakeFieldReadonly&gt;&lt;CSUpdateFileHeader&gt;True&lt;/CSUpdateFileHeader&gt;&lt;CSOptimizeUsings&gt;&lt;OptimizeUsings&gt;True&lt;/OptimizeUsings&gt;&lt;EmbraceInRegion&gt;False&lt;/EmbraceInRegion&gt;&lt;RegionName&gt;&lt;/RegionName&gt;&lt;/CSOptimizeUsings&gt;&lt;CSShortenReferences&gt;True&lt;/CSShortenReferences&gt;&lt;CSReformatCode&gt;True&lt;/CSReformatCode&gt;&lt;XMLReformatCode&gt;True&lt;/XMLReformatCode&gt;&lt;CssAlphabetizeProperties&gt;True&lt;/CssAlphabetizeProperties&gt;&lt;CssReformatCode&gt;True&lt;/CssReformatCode&gt;&lt;JsReformatCode&gt;True&lt;/JsReformatCode&gt;&lt;JsInsertSemicolon&gt;True&lt;/JsInsertSemicolon&gt;&lt;VBFormatDocComments&gt;True&lt;/VBFormatDocComments&gt;&lt;VBReformatCode&gt;True&lt;/VBReformatCode&gt;&lt;VBShortenReferences&gt;True&lt;/VBShortenReferences&gt;&lt;VBOptimizeImports&gt;True&lt;/VBOptimizeImports&gt;&lt;HtmlReformatCode&gt;True&lt;/HtmlReformatCode&gt;&lt;AspOptimizeRegisterDirectives&gt;True&lt;/AspOptimizeRegisterDirectives&gt;&lt;CSReorderTypeMembers&gt;True&lt;/CSReorderTypeMembers&gt;&lt;CSUseVar&gt;&lt;BehavourStyle&gt;CAN_CHANGE_BOTH&lt;/BehavourStyle&gt;&lt;LocalVariableStyle&gt;IMPLICIT_WHEN_INITIALIZER_HAS_TYPE&lt;/LocalVariableStyle&gt;&lt;ForeachVariableStyle&gt;ALWAYS_EXPLICIT&lt;/ForeachVariableStyle&gt;&lt;/CSUseVar&gt;&lt;/Profile&gt;</s:String> <s:String x:Key="/Default/CodeStyle/CodeCleanup/Profiles/=Full_0020Cleanup_0020_0028Math_002ENET_0029/@EntryIndexedValue">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;Profile name="Full Cleanup (Math.NET)"&gt;&lt;CSArrangeThisQualifier&gt;True&lt;/CSArrangeThisQualifier&gt;&lt;CSRemoveCodeRedundancies&gt;True&lt;/CSRemoveCodeRedundancies&gt;&lt;CSUseAutoProperty&gt;True&lt;/CSUseAutoProperty&gt;&lt;CSMakeFieldReadonly&gt;True&lt;/CSMakeFieldReadonly&gt;&lt;CSUpdateFileHeader&gt;True&lt;/CSUpdateFileHeader&gt;&lt;CSOptimizeUsings&gt;&lt;OptimizeUsings&gt;True&lt;/OptimizeUsings&gt;&lt;EmbraceInRegion&gt;False&lt;/EmbraceInRegion&gt;&lt;RegionName&gt;&lt;/RegionName&gt;&lt;/CSOptimizeUsings&gt;&lt;CSShortenReferences&gt;True&lt;/CSShortenReferences&gt;&lt;CSReformatCode&gt;True&lt;/CSReformatCode&gt;&lt;XMLReformatCode&gt;True&lt;/XMLReformatCode&gt;&lt;CssAlphabetizeProperties&gt;True&lt;/CssAlphabetizeProperties&gt;&lt;CssReformatCode&gt;True&lt;/CssReformatCode&gt;&lt;JsReformatCode&gt;True&lt;/JsReformatCode&gt;&lt;JsInsertSemicolon&gt;True&lt;/JsInsertSemicolon&gt;&lt;VBFormatDocComments&gt;True&lt;/VBFormatDocComments&gt;&lt;VBReformatCode&gt;True&lt;/VBReformatCode&gt;&lt;VBShortenReferences&gt;True&lt;/VBShortenReferences&gt;&lt;VBOptimizeImports&gt;True&lt;/VBOptimizeImports&gt;&lt;HtmlReformatCode&gt;True&lt;/HtmlReformatCode&gt;&lt;AspOptimizeRegisterDirectives&gt;True&lt;/AspOptimizeRegisterDirectives&gt;&lt;CSReorderTypeMembers&gt;True&lt;/CSReorderTypeMembers&gt;&lt;CSUseVar&gt;&lt;BehavourStyle&gt;CAN_CHANGE_BOTH&lt;/BehavourStyle&gt;&lt;LocalVariableStyle&gt;IMPLICIT_WHEN_INITIALIZER_HAS_TYPE&lt;/LocalVariableStyle&gt;&lt;ForeachVariableStyle&gt;ALWAYS_EXPLICIT&lt;/ForeachVariableStyle&gt;&lt;/CSUseVar&gt;&lt;/Profile&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/CodeCleanup/RecentlyUsedProfile/@EntryValue">Full Cleanup (Math.NET)</s:String> <s:String x:Key="/Default/CodeStyle/CodeCleanup/RecentlyUsedProfile/@EntryValue">Full Cleanup (Math.NET)</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ALIGN_LINQ_QUERY/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ALIGN_LINQ_QUERY/@EntryValue">False</s:Boolean>
@ -48,11 +49,14 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING&#xD;
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR&#xD; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR&#xD;
OTHER DEALINGS IN THE SOFTWARE.&#xD; OTHER DEALINGS IN THE SOFTWARE.&#xD;
&lt;/copyright&gt;</s:String> &lt;/copyright&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AVX/@EntryIndexedValue">AVX</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CDF/@EntryIndexedValue">CDF</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CDF/@EntryIndexedValue">CDF</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DFT/@EntryIndexedValue">DFT</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DFT/@EntryIndexedValue">DFT</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FFT/@EntryIndexedValue">FFT</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FFT/@EntryIndexedValue">FFT</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IA/@EntryIndexedValue">IA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ILU/@EntryIndexedValue">ILU</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ILU/@EntryIndexedValue">ILU</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ILUTP/@EntryIndexedValue">ILUTP</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ILUTP/@EntryIndexedValue">ILUTP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IX/@EntryIndexedValue">IX</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LU/@EntryIndexedValue">LU</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LU/@EntryIndexedValue">LU</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MAE/@EntryIndexedValue">MAE</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MAE/@EntryIndexedValue">MAE</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MC/@EntryIndexedValue">MC</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MC/@EntryIndexedValue">MC</s:String>
@ -66,6 +70,7 @@ OTHER DEALINGS IN THE SOFTWARE.&#xD;
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SAS/@EntryIndexedValue">SAS</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SAS/@EntryIndexedValue">SAS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SPSS/@EntryIndexedValue">SPSS</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SPSS/@EntryIndexedValue">SPSS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SSD/@EntryIndexedValue">SSD</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SSD/@EntryIndexedValue">SSD</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SSE/@EntryIndexedValue">SSE</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SVD/@EntryIndexedValue">SVD</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SVD/@EntryIndexedValue">SVD</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TFQMR/@EntryIndexedValue">TFQMR</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TFQMR/@EntryIndexedValue">TFQMR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WH/@EntryIndexedValue">WH</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WH/@EntryIndexedValue">WH</s:String>

42
src/Numerics/Distributions/Triangular.cs

@ -138,7 +138,7 @@ namespace MathNet.Numerics.Distributions
/// </summary> /// </summary>
public double Mean public double Mean
{ {
get { return (_lower + _upper + _mode) / 3.0; } get { return (_lower + _upper + _mode)/3.0; }
} }
/// <summary> /// <summary>
@ -151,7 +151,7 @@ namespace MathNet.Numerics.Distributions
var a = _lower; var a = _lower;
var b = _upper; var b = _upper;
var c = _mode; var c = _mode;
return (a * a + b * b + c * c - a * b - a * c - b * c) / 18.0; return (a*a + b*b + c*c - a*b - a*c - b*c)/18.0;
} }
} }
@ -169,7 +169,7 @@ namespace MathNet.Numerics.Distributions
/// <value></value> /// <value></value>
public double Entropy public double Entropy
{ {
get { return 0.5 + Math.Log((_upper - _lower) / 2); } get { return 0.5 + Math.Log((_upper - _lower)/2); }
} }
/// <summary> /// <summary>
@ -182,9 +182,9 @@ namespace MathNet.Numerics.Distributions
var a = _lower; var a = _lower;
var b = _upper; var b = _upper;
var c = _mode; var c = _mode;
var q = Math.Sqrt(2) * (a + b - 2 * c) * (2 * a - b - c) * (a - 2 * b + c); var q = Math.Sqrt(2)*(a + b - 2*c)*(2*a - b - c)*(a - 2*b + c);
var d = 5 * Math.Pow(a * a + b * b + c * c - a * b - a * c - b * c, 3.0 / 2); var d = 5*Math.Pow(a*a + b*b + c*c - a*b - a*c - b*c, 3.0/2);
return q / d; return q/d;
} }
} }
@ -208,9 +208,9 @@ namespace MathNet.Numerics.Distributions
var a = _lower; var a = _lower;
var b = _upper; var b = _upper;
var c = _mode; var c = _mode;
return c >= (a + b) / 2 return c >= (a + b)/2
? a + Math.Sqrt((b - a) * (c - a) / 2) ? a + Math.Sqrt((b - a)*(c - a)/2)
: b - Math.Sqrt((b - a) * (b - c) / 2); : b - Math.Sqrt((b - a)*(b - c)/2);
} }
} }
@ -311,8 +311,8 @@ namespace MathNet.Numerics.Distributions
var b = upper; var b = upper;
var c = mode; var c = mode;
if (a <= x && x <= c) return 2 * (x - a) / ((b - a) * (c - a)); if (a <= x && x <= c) return 2*(x - a)/((b - a)*(c - a));
if (c < x & x <= b) return 2 * (b - x) / ((b - a) * (b - c)); if (c < x & x <= b) return 2*(b - x)/((b - a)*(b - c));
return 0; return 0;
} }
@ -342,15 +342,15 @@ namespace MathNet.Numerics.Distributions
public static double CDF(double lower, double upper, double mode, double x) public static double CDF(double lower, double upper, double mode, double x)
{ {
if (upper < mode) throw new ArgumentOutOfRangeException("upper", Resources.InvalidDistributionParameters); if (upper < mode) throw new ArgumentOutOfRangeException("upper", Resources.InvalidDistributionParameters);
if (mode < lower) throw new ArgumentOutOfRangeException("lower", Resources.InvalidDistributionParameters); // TODO: Is "lower" the appropriate argument here? if (lower > mode) throw new ArgumentOutOfRangeException("lower", Resources.InvalidDistributionParameters);
var a = lower; var a = lower;
var b = upper; var b = upper;
var c = mode; var c = mode;
if (x < a) return 0; if (x < a) return 0;
if (a <= x && x <= c) return (x - a) * (x - a) / ((b - a) * (c - a)); if (a <= x && x <= c) return (x - a)*(x - a)/((b - a)*(c - a));
if (c < x & x <= b) return 1 - (b - x) * (b - x) / ((b - a) * (b - c)); if (c < x & x <= b) return 1 - (b - x)*(b - x)/((b - a)*(b - c));
return 1; return 1;
} }
@ -367,7 +367,7 @@ namespace MathNet.Numerics.Distributions
public static double InvCDF(double lower, double upper, double mode, double p) public static double InvCDF(double lower, double upper, double mode, double p)
{ {
if (upper < mode) throw new ArgumentOutOfRangeException("upper", Resources.InvalidDistributionParameters); if (upper < mode) throw new ArgumentOutOfRangeException("upper", Resources.InvalidDistributionParameters);
if (mode < lower) throw new ArgumentOutOfRangeException("lower", Resources.InvalidDistributionParameters); // TODO: Is "lower" the appropriate argument here? if (lower > mode) throw new ArgumentOutOfRangeException("lower", Resources.InvalidDistributionParameters);
var a = lower; var a = lower;
var b = upper; var b = upper;
@ -375,8 +375,8 @@ namespace MathNet.Numerics.Distributions
if (p <= 0) return lower; if (p <= 0) return lower;
// Taken from http://www.ntrand.com/triangular-distribution/ // Taken from http://www.ntrand.com/triangular-distribution/
if (p < (c - a) / (b - a)) return a + Math.Sqrt(p * (c - a) * (b - a)); if (p < (c - a)/(b - a)) return a + Math.Sqrt(p*(c - a)*(b - a));
if (p < 1) return b - Math.Sqrt((1 - p) * (b - c) * (b - a)); if (p < 1) return b - Math.Sqrt((1 - p)*(b - c)*(b - a));
return upper; return upper;
} }
@ -395,9 +395,9 @@ namespace MathNet.Numerics.Distributions
var c = mode; var c = mode;
var u = rnd.NextDouble(); var u = rnd.NextDouble();
return u < (c - a) / (b - a) return u < (c - a)/(b - a)
? a + Math.Sqrt(u * (b - a) * (c - a)) ? a + Math.Sqrt(u*(b - a)*(c - a))
: b - Math.Sqrt((1 - u) * (b - a) * (b - c)); ; : b - Math.Sqrt((1 - u)*(b - a)*(b - c));
} }
/// <summary> /// <summary>
@ -417,4 +417,4 @@ namespace MathNet.Numerics.Distributions
} }
} }
} }

2
src/Numerics/Financial/AbsoluteRiskMeasures.cs

@ -37,7 +37,7 @@ namespace MathNet.Numerics.Financial
{ {
public static class AbsoluteRiskMeasures public static class AbsoluteRiskMeasures
{ {
//Note: The following statistics would be condidered an absolute risk statistic in the finance realm as well. //Note: The following statistics would be considered an absolute risk statistic in the finance realm as well.
// Standard Deviation // Standard Deviation
// Annualized Standard Deviation = Math.Sqrt(Monthly Standard Deviation x ( 12 )) // Annualized Standard Deviation = Math.Sqrt(Monthly Standard Deviation x ( 12 ))
// Skewness // Skewness

4
src/Numerics/LinearRegression/WeightedRegression.cs

@ -64,7 +64,7 @@ namespace MathNet.Numerics.LinearRegression
/// <param name="x">Predictor matrix X</param> /// <param name="x">Predictor matrix X</param>
/// <param name="y">Response vector Y</param> /// <param name="y">Response vector Y</param>
/// <param name="w">Weight matrix W, usually diagonal with an entry for each predictor (row).</param> /// <param name="w">Weight matrix W, usually diagonal with an entry for each predictor (row).</param>
/// <param name="intercept">True if an intercept should be added as first artificial perdictor value. Default = false.</param> /// <param name="intercept">True if an intercept should be added as first artificial predictor value. Default = false.</param>
public static T[] Weighted<T>(T[][] x, T[] y, T[] w, bool intercept = false) where T : struct, IEquatable<T>, IFormattable public static T[] Weighted<T>(T[][] x, T[] y, T[] w, bool intercept = false) where T : struct, IEquatable<T>, IFormattable
{ {
var predictor = Matrix<T>.Build.DenseOfRowArrays(x); var predictor = Matrix<T>.Build.DenseOfRowArrays(x);
@ -82,7 +82,7 @@ namespace MathNet.Numerics.LinearRegression
/// </summary> /// </summary>
/// <param name="samples">List of sample vectors (predictor) together with their response.</param> /// <param name="samples">List of sample vectors (predictor) together with their response.</param>
/// <param name="weights">List of weights, one for each sample.</param> /// <param name="weights">List of weights, one for each sample.</param>
/// <param name="intercept">True if an intercept should be added as first artificial perdictor value. Default = false.</param> /// <param name="intercept">True if an intercept should be added as first artificial predictor value. Default = false.</param>
public static T[] Weighted<T>(IEnumerable<Tuple<T[], T>> samples, T[] weights, bool intercept = false) where T : struct, IEquatable<T>, IFormattable public static T[] Weighted<T>(IEnumerable<Tuple<T[], T>> samples, T[] weights, bool intercept = false) where T : struct, IEquatable<T>, IFormattable
{ {
var xy = samples.UnpackSinglePass(); var xy = samples.UnpackSinglePass();

10
src/Numerics/Providers/LinearAlgebra/Mkl/MklLinearAlgebraProvider.cs

@ -72,10 +72,10 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
/// </summary> /// </summary>
public partial class MklLinearAlgebraProvider : ManagedLinearAlgebraProvider public partial class MklLinearAlgebraProvider : ManagedLinearAlgebraProvider
{ {
int _nativeRevision = 0; int _nativeRevision;
bool _nativeIX86 = false; bool _nativeIX86;
bool _nativeX64 = false; bool _nativeX64;
bool _nativeIA64 = false; bool _nativeIA64;
readonly MklConsistency _consistency; readonly MklConsistency _consistency;
readonly MklPrecision _precision; readonly MklPrecision _precision;
@ -113,7 +113,7 @@ namespace MathNet.Numerics.Providers.LinearAlgebra.Mkl
{ {
// TODO: Choose x86 or x64 based on Environment.Is64BitProcess // TODO: Choose x86 or x64 based on Environment.Is64BitProcess
int a = 0, b = 0, linearAlgebra = 0; int a, b, linearAlgebra;
try try
{ {
a = SafeNativeMethods.query_capability(0); a = SafeNativeMethods.query_capability(0);

16
src/Numerics/SpecialFunctions/Gamma.cs

@ -265,9 +265,13 @@ namespace MathNet.Numerics
const double big = 4503599627370496.0; const double big = 4503599627370496.0;
const double bigInv = 2.22044604925031308085e-16; const double bigInv = 2.22044604925031308085e-16;
if (a < 0d || x < 0d) if (a < 0d)
{ {
throw new ArgumentOutOfRangeException("a,x", Properties.Resources.ArgumentNotNegative); throw new ArgumentOutOfRangeException("a", Properties.Resources.ArgumentNotNegative);
}
if (x < 0d)
{
throw new ArgumentOutOfRangeException("x", Properties.Resources.ArgumentNotNegative);
} }
if (a.AlmostEqual(0.0)) if (a.AlmostEqual(0.0))
@ -379,9 +383,13 @@ namespace MathNet.Numerics
return double.NaN; return double.NaN;
} }
if (a < 0 || a.AlmostEqual(0.0) || y0 < 0 || y0 > 1) if (a < 0 || a.AlmostEqual(0.0))
{
throw new ArgumentOutOfRangeException("a");
}
if (y0 < 0 || y0 > 1)
{ {
throw new ArgumentOutOfRangeException("a,y0", Properties.Resources.ArgumentNotNegative); throw new ArgumentOutOfRangeException("y0");
} }
if (y0.AlmostEqual(0.0)) if (y0.AlmostEqual(0.0))

135
src/Numerics/Statistics/DescriptiveStatistics.cs

@ -28,11 +28,11 @@
// OTHER DEALINGS IN THE SOFTWARE. // OTHER DEALINGS IN THE SOFTWARE.
// </copyright> // </copyright>
using System;
using System.Collections.Generic;
namespace MathNet.Numerics.Statistics namespace MathNet.Numerics.Statistics
{ {
using System;
using System.Collections.Generic;
/// <summary> /// <summary>
/// Computes the basic statistics of data set. The class meets the /// Computes the basic statistics of data set. The class meets the
/// NIST standard of accuracy for mean, variance, and standard deviation /// NIST standard of accuracy for mean, variance, and standard deviation
@ -153,7 +153,7 @@ namespace MathNet.Numerics.Statistics
/// Computes descriptive statistics from a stream of data values. /// Computes descriptive statistics from a stream of data values.
/// </summary> /// </summary>
/// <param name="data">A sequence of datapoints.</param> /// <param name="data">A sequence of datapoints.</param>
private void Compute(IEnumerable<double> data) void Compute(IEnumerable<double> data)
{ {
double mean = 0; double mean = 0;
double variance = 0; double variance = 0;
@ -165,20 +165,26 @@ namespace MathNet.Numerics.Statistics
foreach (var xi in data) foreach (var xi in data)
{ {
double delta = xi - mean; double delta = xi - mean;
double scaleDelta = delta / ++n; double scaleDelta = delta/++n;
double scaleDeltaSqr = scaleDelta * scaleDelta; double scaleDeltaSqr = scaleDelta*scaleDelta;
double tmpDelta = delta * (n - 1); double tmpDelta = delta*(n - 1);
mean += scaleDelta; mean += scaleDelta;
kurtosis += tmpDelta * scaleDelta * scaleDeltaSqr * (n * n - 3 * n + 3) kurtosis += tmpDelta*scaleDelta*scaleDeltaSqr*(n*n - 3*n + 3)
+ 6 * scaleDeltaSqr * variance - 4 * scaleDelta * skewness; + 6*scaleDeltaSqr*variance - 4*scaleDelta*skewness;
skewness += tmpDelta * scaleDeltaSqr * (n - 2) - 3 * scaleDelta * variance; skewness += tmpDelta*scaleDeltaSqr*(n - 2) - 3*scaleDelta*variance;
variance += tmpDelta * scaleDelta; variance += tmpDelta*scaleDelta;
if (minimum > xi) { minimum = xi; } if (minimum > xi)
if (maximum < xi) { maximum = xi; } {
minimum = xi;
}
if (maximum < xi)
{
maximum = xi;
}
} }
SetStatistics(mean, variance, skewness, kurtosis, minimum, maximum, n); SetStatistics(mean, variance, skewness, kurtosis, minimum, maximum, n);
} }
@ -189,7 +195,7 @@ namespace MathNet.Numerics.Statistics
/// Computes descriptive statistics from a stream of nullable data values. /// Computes descriptive statistics from a stream of nullable data values.
/// </summary> /// </summary>
/// <param name="data">A sequence of datapoints.</param> /// <param name="data">A sequence of datapoints.</param>
private void Compute(IEnumerable<double?> data) void Compute(IEnumerable<double?> data)
{ {
double mean = 0; double mean = 0;
double variance = 0; double variance = 0;
@ -203,19 +209,25 @@ namespace MathNet.Numerics.Statistics
if (xi.HasValue) if (xi.HasValue)
{ {
double delta = xi.Value - mean; double delta = xi.Value - mean;
double scaleDelta = delta / ++n; double scaleDelta = delta/++n;
double scaleDeltaSqr = scaleDelta * scaleDelta; double scaleDeltaSqr = scaleDelta*scaleDelta;
double tmpDelta = delta * (n - 1); double tmpDelta = delta*(n - 1);
mean += scaleDelta; mean += scaleDelta;
kurtosis += tmpDelta * scaleDelta * scaleDeltaSqr * (n * n - 3 * n + 3) kurtosis += tmpDelta*scaleDelta*scaleDeltaSqr*(n*n - 3*n + 3)
+ 6 * scaleDeltaSqr * variance - 4 * scaleDelta * skewness; + 6*scaleDeltaSqr*variance - 4*scaleDelta*skewness;
skewness += tmpDelta * scaleDeltaSqr * (n - 2) - 3 * scaleDelta * variance; skewness += tmpDelta*scaleDeltaSqr*(n - 2) - 3*scaleDelta*variance;
variance += tmpDelta * scaleDelta; variance += tmpDelta*scaleDelta;
if (minimum > xi) { minimum = xi.Value; } if (minimum > xi)
if (maximum < xi) { maximum = xi.Value; } {
minimum = xi.Value;
}
if (maximum < xi)
{
maximum = xi.Value;
}
} }
} }
@ -224,10 +236,10 @@ namespace MathNet.Numerics.Statistics
} }
/// <summary> /// <summary>
/// Computes descriptive statistics from a stream of data values using high accuracy. /// Computes descriptive statistics from a stream of data values.
/// </summary> /// </summary>
/// <param name="data">A sequence of datapoints.</param> /// <param name="data">A sequence of datapoints.</param>
private void ComputeDecimal(IEnumerable<double> data) void ComputeDecimal(IEnumerable<double> data)
{ {
decimal mean = 0; decimal mean = 0;
decimal variance = 0; decimal variance = 0;
@ -236,22 +248,29 @@ namespace MathNet.Numerics.Statistics
decimal minimum = Decimal.MaxValue; decimal minimum = Decimal.MaxValue;
decimal maximum = Decimal.MinValue; decimal maximum = Decimal.MinValue;
int n = 0; int n = 0;
foreach (decimal xi in data) foreach (double x in data)
{ {
decimal xi = (decimal)x;
decimal delta = xi - mean; decimal delta = xi - mean;
decimal scaleDelta = delta / ++n; decimal scaleDelta = delta/++n;
decimal scaleDeltaSQR = scaleDelta * scaleDelta; decimal scaleDeltaSQR = scaleDelta*scaleDelta;
decimal tmpDelta = delta * (n - 1); decimal tmpDelta = delta*(n - 1);
mean += scaleDelta; mean += scaleDelta;
kurtosis += tmpDelta * scaleDelta * scaleDeltaSQR * (n * n - 3 * n + 3) kurtosis += tmpDelta*scaleDelta*scaleDeltaSQR*(n*n - 3*n + 3)
+ 6 * scaleDeltaSQR * variance - 4 * scaleDelta * skewness; + 6*scaleDeltaSQR*variance - 4*scaleDelta*skewness;
skewness += tmpDelta * scaleDeltaSQR * (n - 2) - 3 * scaleDelta * variance; skewness += tmpDelta*scaleDeltaSQR*(n - 2) - 3*scaleDelta*variance;
variance += tmpDelta * scaleDelta; variance += tmpDelta*scaleDelta;
if (minimum > xi) { minimum = xi; } if (minimum > xi)
if (maximum < xi) { maximum = xi; } {
minimum = xi;
}
if (maximum < xi)
{
maximum = xi;
}
} }
SetStatistics((double)mean, (double)variance, (double)skewness, (double)kurtosis, (double)minimum, (double)maximum, n); SetStatistics((double)mean, (double)variance, (double)skewness, (double)kurtosis, (double)minimum, (double)maximum, n);
@ -259,10 +278,10 @@ namespace MathNet.Numerics.Statistics
} }
/// <summary> /// <summary>
/// Computes descriptive statistics from a stream of nullable data values using high accuracy. /// Computes descriptive statistics from a stream of nullable data values.
/// </summary> /// </summary>
/// <param name="data">A sequence of datapoints.</param> /// <param name="data">A sequence of datapoints.</param>
private void ComputeDecimal(IEnumerable<double?> data) void ComputeDecimal(IEnumerable<double?> data)
{ {
decimal mean = 0; decimal mean = 0;
decimal variance = 0; decimal variance = 0;
@ -271,24 +290,31 @@ namespace MathNet.Numerics.Statistics
decimal minimum = Decimal.MaxValue; decimal minimum = Decimal.MaxValue;
decimal maximum = Decimal.MinValue; decimal maximum = Decimal.MinValue;
int n = 0; int n = 0;
foreach (decimal? xi in data) foreach (double? x in data)
{ {
if (xi.HasValue) if (x.HasValue)
{ {
decimal delta = xi.Value - mean; decimal xi = (decimal)x.Value;
decimal scaleDelta = delta / ++n; decimal delta = xi - mean;
decimal scaleDeltaSQR = scaleDelta * scaleDelta; decimal scaleDelta = delta/++n;
decimal tmpDelta = delta * (n - 1); decimal scaleDeltaSQR = scaleDelta*scaleDelta;
decimal tmpDelta = delta*(n - 1);
mean += scaleDelta; mean += scaleDelta;
kurtosis += tmpDelta * scaleDelta * scaleDeltaSQR * (n * n - 3 * n + 3) kurtosis += tmpDelta*scaleDelta*scaleDeltaSQR*(n*n - 3*n + 3)
+ 6 * scaleDeltaSQR * variance - 4 * scaleDelta * skewness; + 6*scaleDeltaSQR*variance - 4*scaleDelta*skewness;
skewness += tmpDelta * scaleDeltaSQR * (n - 2) - 3 * scaleDelta * variance; skewness += tmpDelta*scaleDeltaSQR*(n - 2) - 3*scaleDelta*variance;
variance += tmpDelta * scaleDelta; variance += tmpDelta*scaleDelta;
if (minimum > xi) { minimum = xi.Value; } if (minimum > xi)
if (maximum < xi) { maximum = xi.Value; } {
minimum = xi;
}
if (maximum < xi)
{
maximum = xi;
}
} }
} }
SetStatistics((double)mean, (double)variance, (double)skewness, (double)kurtosis, (double)minimum, (double)maximum, n); SetStatistics((double)mean, (double)variance, (double)skewness, (double)kurtosis, (double)minimum, (double)maximum, n);
@ -305,7 +331,7 @@ namespace MathNet.Numerics.Statistics
/// <param name="minimum">For setting Minimum.</param> /// <param name="minimum">For setting Minimum.</param>
/// <param name="maximum">For setting Maximum.</param> /// <param name="maximum">For setting Maximum.</param>
/// <param name="n">For setting Count.</param> /// <param name="n">For setting Count.</param>
private void SetStatistics(double mean, double variance, double skewness, double kurtosis, double minimum, double maximum, int n) void SetStatistics(double mean, double variance, double skewness, double kurtosis, double minimum, double maximum, int n)
{ {
Mean = mean; Mean = mean;
Count = n; Count = n;
@ -315,24 +341,23 @@ namespace MathNet.Numerics.Statistics
Maximum = maximum; Maximum = maximum;
if (n > 1) if (n > 1)
{ {
Variance = variance / (n - 1); Variance = variance/(n - 1);
StandardDeviation = Math.Sqrt(Variance); StandardDeviation = Math.Sqrt(Variance);
} }
if (Variance != 0) if (Variance != 0)
{ {
if (n > 2) if (n > 2)
{ {
Skewness = (double)n / ((n - 1) * (n - 2)) * (skewness / (Variance * StandardDeviation)); Skewness = (double)n/((n - 1)*(n - 2))*(skewness/(Variance*StandardDeviation));
} }
if (n > 3) if (n > 3)
{ {
Kurtosis = ((double)n * n - 1) / ((n - 2) * (n - 3)) Kurtosis = ((double)n*n - 1)/((n - 2)*(n - 3))
* (n * kurtosis / (variance * variance) - 3 + 6.0 / (n + 1)); *(n*kurtosis/(variance*variance) - 3 + 6.0/(n + 1));
} }
} }
} }
} }
} }
} }

Loading…
Cancel
Save