アットウィキロゴ

csharp_inner

内積とJaccard係数の計算をメモしておく。

配列をベクトルとして扱う

   class Program
   {
       /// <summary>
       /// 内積を計算
       /// </summary>
       private static double InnerProduct(double[] v1, double[] v2)
       {
           double ip = 0;

           if (v1.Length != v2.Length)
               throw new ArgumentException("配列の次元は同じにして下さい", "v1, v2");

           for (int i = 0; i < v1.Length; i++)
           {
               ip += v1[i] * v2[i];
           }
           return ip;
       }

       /// <summary>
       /// 2乗和を計算
       /// </summary>        
       private static double PowSum(double[] v)
       {
           double ss = 0;
           for (int i = 0; i < v.Length; i++)
           {
               ss += Math.Pow(v[i], 2);
           }
           return ss;
       }

       /// <summary>
       /// Jaccard係数を計算
       /// </summary>   
       private static double JaccardCoefficient(double[] v1, double[] v2)
       {
           double jc = 0;

           if (v1.Length != v2.Length)
               throw new ArgumentException("配列の次元は同じにして下さい", "v1, v2");

           return InnerProduct(v1, v2) / (PowSum(v1) + PowSum(v2) - InnerProduct(v1, v2));
       }

       static void Main(string[] args)
       {
           double[] a = { 1, 2, 3 };
           double[] b = { 3, 4, 5 };

           Console.WriteLine(PowSum(a));
           Console.WriteLine(InnerProduct(a, b));
           Console.WriteLine(JaccardCoefficient(a, b));
       }
   }

[出力結果]
   14
   26
   0.684210526315789
最終更新:2009年02月13日 11:59