class Program
{
static void Main(string[] args)
{
var x = new decimal[] { 20, 30, 40, 50, 60, 70 };
var y = new decimal[] { 12.48M, 32.33M, 33.11M, 84.12M, 45.91M, 40.11M };
var cp = CovarianceP(x, y);
Console.WriteLine("Covariance Population : {0}", cp); //모집단 공분산
var cs = CovarianceS(x, y);
Console.WriteLine("Covariance Sample : {0}", cs); //표본집단 공분산
Console.ReadLine();
}
/// <summary>
/// 모집단 공분산 구하기
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
static decimal CovarianceP(decimal[] x, decimal[] y)
{
if (x.Length != y.Length)
throw new ArgumentException("two parameters must be same length.");
var avg_x = x.Average();
var avg_y = y.Average();
return x.Zip(y, (x1, y1) => (x1 - avg_x) * (y1 - avg_y)).Average();
}
/// <summary>
/// 표본집단 공분산 구하기
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
static decimal CovarianceS(decimal[] x, decimal[] y)
{
if (x.Length != y.Length)
throw new ArgumentException("two parameters must be same length.");
var avg_x = x.Average();
var avg_y = y.Average();
return x.Zip(y, (x1, y1) => (x1 - avg_x) * (y1 - avg_y)).Sum() / (x.Length -1);
}
}
결과입니다.
double로 하실경우 소수점 마지막자리에 오차가 좀 발생합니다.
공분산에 대한 설명은 이분 블로그에서 너무나 친절하고 쉽게 설명이 되어 있습니다.
https://blog.naver.com/ikek21/220003173213
'C#' 카테고리의 다른 글
asp.net swagger api에서 c#코드 주석이 swagger주석으로 나오도록 하기 (0) | 2024.06.23 |
---|---|
asp.net core 3.1, NLog 설정시 문제해결 (0) | 2020.06.26 |
log4net.config 예제 (0) | 2019.08.03 |
GDI+ Bitmap Rotaion (0) | 2019.02.19 |
WPF RichText에서 HTML 표시하기 (2) | 2019.02.09 |