類似度を測る
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 2/51。
k-NNでは、「最も近い」とは距離が最小であることを意味していました。グループを見つけるには、すべての行のペアについて距離を求める必要があります。これが距離表です。4人の友人が2本の映画を1から10で評価しました。
ratings = np.array([[9, 2], [8, 3], [2, 9], [3, 7]]) # Ana, Ben, Cy, Dee
n = len(ratings)
table = np.zeros((n, n))
for i in range(n):
table[i] = np.sqrt(((ratings - ratings[i]) ** 2).sum(axis=1))行 iには、友達 iから全員までの距離が格納されています。グリッドとして描いたtableを見てみましょう。
0 の対角線(各友人と自分自身の比較)は除外します。残った中で最小の数が最も似ているペア、最大の数が最も異なるペアです。距離が小さいほど、行は似ています。
チャレンジ
簡単ジュースバーでは、プログラムが読み取ったシェフの新しいスムージーをメニューに追加します。どの2つがよく似ていて、どちらかを外せるでしょうか?テイスティング用のセットにするなら、最も異なる2つはどれでしょうか?
menuの距離表を作成します。- 最も似ているペアと最も異なるペアを見つけます。各ペアは1回だけ調べ、同じスムージー同士の組み合わせは含めません。
- 両方のペアを、名前はメニュー順に、距離は小数第1位まで表示します。
別のメニューの場合:
Most alike: Lemon Zing and Lime Twist (14.1 g apart)
Most different: Choco Shake and Cucumber Cool (212.6 g apart)自分で試してみよう
import numpy as np
names = ["Berry Blast", "Green Glow", "Mango Lassi", "Kale Kick", "Tropical Sun", "Banana Oat", "Minty Melon"]
# スムージー1種類につき1行。1カップあたりのグラム数:果物、葉物野菜、ヨーグルト
menu = np.array([[180, 0, 120],
[90, 110, 60],
[160, 0, 150],
[60, 150, 30],
[200, 20, 40],
[100, 0, 200],
[170, 40, 0]])
# シェフの新しいレシピをメニューの最後の行に追加する
names.append(input())
new = [int(input()), int(input()), int(input())]
menu = np.concatenate([menu, [new]])
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ