48. 距離計算の高速化
TF-IDF の大きさを 1 に揃えることで距離計算を高速化できる
◦ 点 A (a1, a2, a3, …, aN) と点 B (b1, b2, b3, …, bN) の距離は・・・
2014/6/20 社内勉強会資料 48
sum = 0;
for (i = 0; i < N; i++) {
sum += pow(b[i] – a[i], 2);
}
sum = sqrt(sum);
◦ pow の部分を展開すると・・・
sum = 0;
for (i = 0; i < N; i++) {
sum += b[i]*b[i] – 2*a[i]*b[i] + a[i]*a[i];
}
sum = sqrt(sum);
49. 距離計算の高速化
TF-IDF の大きさを 1 に揃えることで距離計算を高速化できる
◦ pow の部分を展開すると・・・
2014/6/20 社内勉強会資料 49
sum = 0;
for (i = 0; i < N; i++) {
sum += b[i]*b[i] – 2*a[i]*b[i] + a[i]*a[i];
}
sum = sqrt(sum);
◦ ばらばらに足してみると・・・
sum = 0;
for (i = 0; i < N; i++) sum += b[i]*b[i];
for (i = 0; i < N; i++) sum –= 2*a[i]*b[i];
for (i = 0; i < N; i++) sum += a[i]*a[i];
sum = sqrt(sum);
50. 距離計算の高速化
TF-IDF の大きさを 1 に揃えることで距離計算を高速化できる
◦ ばらばらに足してみると・・・
2014/6/20 社内勉強会資料 50
◦ 大きさを 1 に揃えたのだから・・・
sum = 0;
for (i = 0; i < N; i++) sum += b[i]*b[i];
for (i = 0; i < N; i++) sum –= 2*a[i]*b[i];
for (i = 0; i < N; i++) sum += a[i]*a[i];
sum = sqrt(sum);
sum = 0;
sum += 1;
for (i = 0; i < N; i++) sum –= 2*a[i]*b[i];
sum += 1;
sum = sqrt(sum);
51. 距離計算の高速化
TF-IDF の大きさを 1 に揃えることで距離計算を高速化できる
◦ 大きさを 1 に揃えたのだから・・・
2014/6/20 社内勉強会資料 51
◦ ここまでを整理すると・・・
sum = 0;
sum += 1;
for (i = 0; i < N; i++) sum –= 2*a[i]*b[i];
sum += 1;
sum = sqrt(sum);
sum = 2;
for (i = 0; i < N; i++) sum –= 2*a[i]*b[i];
sum = sqrt(sum);
52. 距離計算の高速化
TF-IDF の大きさを 1 に揃えることで距離計算を高速化できる
◦ ここまでを整理すると・・・
2014/6/20 社内勉強会資料 52
◦ 距離そのものを計算しなくても大小関係が分かればよいので・・・
sum = 2;
for (i = 0; i < N; i++) sum –= 2*a[i]*b[i];
sum = sqrt(sum);
sum = 0;
for (i = 0; i < N; i++) sum += a[i]*b[i];
◦ これを大きな順に並べれば距離の近い順と同じになる
◦ a[i]*b[i] という形の計算しか残っていないのがポイント
◦ TF-IDF がどちらも 0 ではない単語だけ計算すればよい