값 출력 비교를 위한 엑셀의 샘플 자료값입니다.

    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

 

공분산(covariance)

공분산이 뭐에요? 란 질문에.. 난 당황했었다.. 다.. 당황하셨어요? 그리곤 재빨리 자리를 피했다.. 하지만...

blog.naver.com

 

+ Recent posts