Menu
CoddyTech

類似度を測る

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を見てみましょう。

Ana、Ben、Cy、Dee の間の距離を示す 4×4 のグリッド。対角線上は 0.0。Ana と Ben の距離を示す 2 つのセル(1.4)が、対角線以外で最小の値として強調表示されている。Ana と Cy は最も遠く、距離は 9.9。

0 の対角線(各友人と自分自身の比較)は除外します。残った中で最小の数が最も似ているペア、最大の数が最も異なるペアです。距離が小さいほど、行は似ています。

challenge icon

チャレンジ

簡単

ジュースバーでは、プログラムが読み取ったシェフの新しいスムージーをメニューに追加します。どの2つがよく似ていて、どちらかを外せるでしょうか?テイスティング用のセットにするなら、最も異なる2つはどれでしょうか?

  1. menuの距離表を作成します。
  2. 最も似ているペアと最も異なるペアを見つけます。各ペアは1回だけ調べ、同じスムージー同士の組み合わせは含めません。
  3. 両方のペアを、名前はメニュー順に、距離は小数第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]])

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ