Menu
CoddyTech

衡量相似度

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 2 课,共 51 课。

在 k-NN 中,最近表示距离最小。要找到分组,你需要计算每一对行之间的距离:一张距离表。四位朋友为两部电影打分,评分范围是 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 对应的两个单元格中的距离为 1.4,是对角线以外最小的值;Ana 和 Cy 之间的距离最远,为 9.9

跳过 0 对角线,也就是每个朋友与自己比较的情况。剩下的最小数字表示最相似的一对,最大的数字表示最不同的一对。距离越小,行就越相似。

challenge icon

挑战

简单

果汁吧把厨师新研发的奶昔加入菜单,这款奶昔由程序读取。哪两款最相似,可以去掉其中一款?哪两款差异最大,适合组成品尝套餐?

  1. 构建 menu 的距离表。
  2. 找出最相似和差异最大的配对:每对只计算一次,不能让奶昔与自身配对。
  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"]
# 每款冰沙占一行,每杯的原料克数依次为:水果、绿叶蔬菜、酸奶
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 在线编译器