内積と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