衡量相似度
本课属于 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:
跳过 0 对角线,也就是每个朋友与自己比较的情况。剩下的最小数字表示最相似的一对,最大的数字表示最不同的一对。距离越小,行就越相似。
挑战
简单果汁吧把厨师新研发的奶昔加入菜单,这款奶昔由程序读取。哪两款最相似,可以去掉其中一款?哪两款差异最大,适合组成品尝套餐?
- 构建
menu的距离表。 - 找出最相似和差异最大的配对:每对只计算一次,不能让奶昔与自身配对。
- 打印这两对,名称按菜单顺序排列,距离保留 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]])
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器