当前位置: 首页 > 编程语言 > C#

C#中两个数组的相关性分享

时间:2023-04-10 13:48:54 C#

C#中两个数组的相关性有两个数组的double值,我想计算相关系数(单个double值,就像MSExcel中的CORREL函数一样).C#中是否有一些简单的单行解决方案?我发现了一个名为MetaNumerics的数学库。根据这个问题,它应该完成这项工作。HereisthedocumentationforMetaNumericsrelatedmethods,我没有得到。有人可以给我提供一个简单的代码片段或示例如何使用该库吗?注意:最后,我被迫使用自定义实现。但是,如果阅读此问题的任何人都知道一个好的、有文档记录的C#数学库/框架,请不要犹豫,在答案中发布一个链接。您可以将值放在同一索引处的单独列表中,并使用简单的Zip。varfitResult=newFitResult();varvalues1=newList();varvalues2=new列表();变量相关=值1。Zip(values2,(v1,v2)=>fitResult.CorrelationCoefficient(v1,v2));第二种方法是编写您自己的自定义实现(我的未针对速度进行优化):值必须是相同的长度");varavg1=值1。平均的();varavg2=值2。平均的();varsum1=值1。Zip(values2,(x1,y1)=>(x1-avg1)*(y1-avg2)).Sum();varsumSqr1=values1.Sum(x=>Math.Pow((x-avg1),2.0));varsumSqr2=values2.Sum(y=>Math.Pow((y-avg2),2.0));varresult=sum1/Math.Sqrt(sumSqr1*sumSqr2);返回结果;}用法:varvalues1=newList{3,2,4,5,6};varvalues2=newList{9,7,12,15,17};varresult=ComputeCoeff(values1.ToArray(),values2.ToArray());//0.997054485501581Debug.Assert(result.ToString("F6")=="0.997054");另一种方法是直接使用Excel函数:varvalues1=新列表{3,2,4,5,6};varvalues2=newList{9,7,12,15,17};//确保添加对Microsoft.Office.Interop.Excel.dll的引用//并使用命名空间varapplication=newApplication();varworksheetFunction=application.WorksheetFunction;varresult=worksheetFunction.Correl(values1.ToArray(),values2.ToArray());控制台。写(结果);//0.997054485501581Math.NETNumerics是一个有据可查的数学库,包括计算Pearson和Spearman等级相关性的Correlation类:http://numerics.mathdotnet.com/api/MathNet.Numerics.Statistics/Correlation.htm该库是可在非常自由的MIT/X11许可下使用。使用它来计算相关系数非常简单:使用MathNet.Numerics.Statistics;...correlation=Correlation.Pearson(arrayOfValues1,arrayOfValues2);祝你好运!为了计算Pearson乘积矩相关系数http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient你可以使用这个简单的代码:publicstaticDoubleCorrelation(Double[]Xs,Double[]Ys){DoublesumX=0;双sumX2=0;双和Y=0;双和Y2=0;双sumXY=0;intn=Xs.Length如果你不想使用第3方库,你可以使用这篇文章中的方法(在此处发布代码以供备份)。双[]array1={3,2,4,5,6};双[]array2={9,7,12,15,17};双相关=相关性(array1,array2);publicdoubleCorrelation(doublearray1,doublearray2){double[]array_xy=newdouble[array1.Length];double[]array_xp2=newdouble[array1.Length];double[]array_yp2=newdouble[array1.Length];for(inti=0;i