Menu
CoddyTech

Измерение сходства

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 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, представленная в виде сетки:

Сетка 4 на 4 расстояний между Аной, Беном, Си и Ди. На диагонали стоят значения 0.0. Две ячейки для Аны и Бена со значением 1.4 выделены как наименьшие вне диагонали; Ану и Си разделяет наибольшее расстояние — 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