我有一个列表,其中有许多样本代表来自嘈杂的正弦波的许多幅度值。 我需要找到该波的Pearson相关系数和给定的正弦波(不是噪声)。 (所以我可以从嘈杂的波浪中找到合适的谐波)。 我真正需要的是在C#中的方法中执行相同的过程。 我知道这可以用MATLAB中的corrcoef命令完成。 任何解释或想法都是非常受欢迎的。 提前谢谢。
答案 0 :(得分:1)
为什么不使用Math.NET Numerics
Math.NET Numerics旨在为数字提供方法和算法 科学,工程和日常使用的计算。涵盖的主题 包括特殊函数,线性代数,概率模型,随机 数字,插值,积分,回归,优化问题 等等。
您正在寻找的class编码如下:
namespace MathNet.Numerics.Statistics
{
using System;
using System.Collections.Generic;
using Properties;
/// <summary>
/// A class with correlation measures between two datasets.
/// </summary>
public static class Correlation
{
/// <summary>
/// Computes the Pearson product-moment correlation coefficient.
/// </summary>
/// <param name="dataA">Sample data A.</param>
/// <param name="dataB">Sample data B.</param>
/// <returns>The Pearson product-moment correlation coefficient.</returns>
public static double Pearson(IEnumerable<double> dataA, IEnumerable<double> dataB)
{
int n = 0;
double r = 0.0;
double meanA = dataA.Mean();
double meanB = dataB.Mean();
double sdevA = dataA.StandardDeviation();
double sdevB = dataB.StandardDeviation();
IEnumerator<double> ieA = dataA.GetEnumerator();
IEnumerator<double> ieB = dataB.GetEnumerator();
while (ieA.MoveNext())
{
if (ieB.MoveNext() == false)
{
throw new ArgumentOutOfRangeException("Datasets dataA and dataB need to have the same length.");
}
n++;
r += (ieA.Current - meanA) * (ieB.Current - meanB) / (sdevA * sdevB);
}
if (ieB.MoveNext() == true)
{
throw new ArgumentOutOfRangeException("Datasets dataA and dataB need to have the same length.");
}
return r / (n - 1);
}
}
}
Math.NET Numerics works very well with C# and related .Net languages. When using Visual Studio or another IDE with built-in NuGet support, you can get started quickly by adding a reference to the MathNet.Numerics NuGet package. Alternatively you can grab that package with the command line tool with nuget.exe install MathNet.Numerics -Pre or simply download the Zip package.
我已经集中使用了这个库,效果很好。所以你会像以下一样使用它:
using MathNet.Numerics.Statistics;
correlation = Correlation.Pearson(arrayOfDoubles1, arrayOfDoubles2);