【python】コサイン類似度は高校数学の知識で理解できます!

自然言語処理の分野でよく使われる、「コサイン類似度」について解説しようと思います。

タイトルに書いてあるとおり、高校数学のベクトルの知識があればスムーズに理解できると思います。

Cos類似度

コサイン類似度とは、「2つのベクトルがどれだけ近い(似ている)のかを示す指標」です。

1に近づくほど類似度が高いと言えます。

AとBのコサイン類似度

計算式は以上の通りです。各ベクトルの平方和の積に根号をとったものが分母です。分子は各ベクトルの積の和です。

二つのベクトルが重なっていれば、分母と分子で値が同じになり、コサイン類似度は1を取ります。逆に、正反対を向いていれば、コサイン類似度は-1を取ります。

cosθは 90<θ<π であれば、負の値を取るというのは、高校数学で習いましたね。2つのベクトルの間が90度を超えるとコサイン類似度は負の値を取るということです。

ちょっと相関係数のような形をしていますね。

2次元を例に挙げてみてみましょう。

ベクトルが3つあります。
それぞれを比べた時に、コサイン類似度が最も高いのはどの組み合わせでしょうか。

A(2,8)
B(5,6)
C(6,3)
例:2次元の話

上のような図が書けました。

では、AとB/BとC/AとCそれぞれのコサイン類似度を求めてみましょう。

AとBのコサイン類似度

上の式に当てはめると、このようになります。

結果は、電卓等で計算してみてください。約0.90です。

やり方は同じなのでBとC/AとCは結果のみ書きます。

BとCのコサイン類似度:0.92

AとCのコサイン類似度:0.65

つまり、3つのベクトルの中ではBとCが一番似ている組み合わせです。

これは別に3次元でも同じやり方ができます。

自然言語処理

さて、実際ベクトル同士の類似度がわかると、何が嬉しいのでしょうか。

まず自然言語処理の解説をします。自然言語処理とは、「人間が使う言葉をプログラムが理解するための処理」です。

例えば、チャットボットを思い浮かべてほしいです。

人間「なんか、静かだけど、結構イケてる感じのレストランがいいです」

チャットボット「?」

機械は自然言語をそのまま理解することはできません。

以下の手順で、類似文書検索タスクを行います。

1:形態素解析

文章を文節や単語に区切ります。

入力文章「なんか | 静か | だけ | ど | 、| 結構 | イケてる | 感じ | の | レストラン | が | 良い | です | 。」

形態素解析について詳しく知りたい方は、【自然言語処理】形態素解析で文章を単語に分けてみましょう。をご覧ください。

2:Bag of Words

各文書のうち、特定の単語が何回出たか(頻度)をベクトルで表す。

3:コサイン類似度を測る

先ほどの、「なんか、静かだけど、結構イケてる感じのレストランが良いです。」を入力文書ベクトルとしたとき、下の図では口コミ1ベクトルとコサイン類似度が高いことがわかりました。そこで、口コミ1に掲載されているレストランをレコメンドしてあげよう、ということになります。

単語の出現頻度だけでなく、意味や文脈まで考慮すると、かなり正確なレコメンドができそうです。

コサイン類似度は、元のデータ数がそこまでなくても、類似文書検索ができる便利な指標です。

自然言語処理以外の例

例えば、ユーザーの好みにぴったりのクーポンを出したいとします。

事前に、「あっさり系?」→「Yes or No」などの選択肢を複数選んでもらいます。

Yesなら1、Noなら0という2値をとるベクトルを下のように作ってみます。

あっさり系?値段は安め?静かな店内?中華?洋風?和風?
110100
Aさんの今日の好み

ここで、A(1,1,0,1,0,0)というベクトルが出来ました。

そして事前に用意してあるクーポンの特徴をベクトルで表します。

あっさり系?値段は安め?静かな店内?中華?洋風?和風?
101100
クーポンXの特徴

このクーポンのベクトルは、X(1,0,1,1,0,0)です。

他にも、クーポンのベクトルを作り、ベクトルAとのコサイン類似度が高い上位5番目くらいまでのクーポンをレコメンドすれば、「データ量が少なく、アイテムの特徴量のみで」簡単なレコメンド機能が作れます。

*料理のジャンルは重要度が高いので、「ジャンルが違っていればコサイン類似度は2倍下がる」などの工夫次第では精度を上げることも可能です。

教師なし学習

今回のコサイン類似度は、機械学習の中でも、「強化学習」や「教師あり学習」と同列の概念である「教師なし学習」に分類されます。

教師なし学習とは、入力データのみを与えて、データの中に内在するパターンを導出するアルゴリズムを特徴としています。正しい出力が紐づいていないので、「教師データがない」ということになります。ユーザーのクラスタリングやアイテムのレコメンドなどの施策に利用されます。

入力データとしては、ユーザーの行動特徴などが入ります。

教師データが用意できない場面では、非常に有効な方法ですが、正解がないためモデルの「精度」を決めることはできません。

そのグループの分類が妥当かどうかは、人間の知見に委ねられることになります。

学習がうまくいっているかどうかを評価することが難しく、発展途上の技術といえます。

代表的なアルゴリズムは、k-means法です。

【非階層型】K-means法でクラスタリングをしてみましょう。

pythonでやってみる

では、コサイン類似度をpython ライブラリのnumpyを使って計算してみます。

from numpy import dot
from numpy.linalg import norm
nyuryoku = [0, 1, 3, 3, 5]
kutikomi = [3, 2, 0, 1, 2]
result = dot(nyuryoku, kutikomi)/(norm(nyuryoku)*norm(kutikomi))
print(result)

コードで言うと、nyuryoku = [0, 1, 3, 3, 5]が、人間が入力した文書から作ったクエリベクトルです。それに対して、kutikomi = [3, 2, 0, 1, 2]が、もともとあった口コミ(店舗情報と結びついている)をクエリベクトルにしたものです。

出力結果は、0.5330017908890262となりました。

-Udemy-のご紹介

データサイエンスやプログラミングに興味がある方におすすめなのが、Udemyと呼ばれる世界最大級のオンライン学習プラットフォームです。

Udemyは、世界中の学びたい人と教えたい人をオンラインでつなぐサービスです。

つまり、講師は企業ではなく、一般のエンジニアやデータサイエンティスト、デザイナーです。

講座カテゴリー

  • Pythonなど、機械学習プログラミング言語
  • Javaなど、Webアプリケーション言語
  • Webデザイン(HTML&CSS/JavaScript)
  • Excel
  • マーケティング

特に最近ではAI・データサイエンスなど先端ITの講座が人気を博しております。気になる方は以下のボタンからご覧ください。

ジャンルが豊富で学びたい講座がきっとみつかる

受講者数講師数講座数
4,000万人70,000人約18.5万
2021年3月時点(Udemy)

世界中にサービスを展開しているため、サービスの規模は非常に大きいです。

AI・データサイエンスなど最先端のIT技術からプレゼンなどビジネススキルに関する講座まで 18.5万以上(※海外講座含む)あるため、自分が学びたい講座をみつけることができます。

きっとピッタリな講座が見つかるでしょう!

講座は、PC一台があればカフェでも学校でも職場でも受講することができます。

また倍速対応ができ、0.5〜2倍の変速機能で自分のペースで受講が可能です。

お手頃な価格帯

講座により、価格は大きく変わりますが、数千円台のものも多く、手を出しやすいです。

講座は一度購入すれば視聴期限なく受講でき、30日返金保証もついているので安心して始めることができます

こんな方におすすめ!

  • Webデザイナーになって、自由な生活を手に入れたい方。
  • プログラマーになって、本業以外の副収入を得たい方。
  • 自学自習じゃなかなか続かない方。
  • 資格習得や、スキルの向上により、今の年収をupさせたい方。

具体的には、以下のようなコースがあります。きっと良い講師に出会えるはずです。

FOLLOW ME !

PAGE TOP