TRAIN = [
([120, 0.9, 0.1], "электроника"),
([125, 0.8, 0.2], "электроника"),
([70, 0.3, 0.9], "фолк"),
([80, 0.4, 0.8], "фолк"),
([118, 0.7, 0.3], "поп"),
]
def test_example():
"""Пример: электроника"""
got = classify(TRAIN, [122, 0.85, 0.15], 3)
assert got == "электроника", f"получено {got!r}"
def test_k_one():
"""k = 1 — жанр ближайшего трека"""
got = classify(TRAIN, [75, 0.35, 0.85], 1)
assert got == "фолк", f"получено {got!r}"
def test_k_all():
"""k = n — побеждает самый частый жанр… при ничьей — ближайший из лидеров"""
got = classify(TRAIN, [119, 0.7, 0.3], 5)
assert got == "электроника", f"получено {got!r} (электроника и фолк по 2, но ближе электроника)"
def test_tie_break_by_nearest():
"""Ничья в голосовании → жанр ближайшего соседа среди лидеров"""
train = [([0, 0], "A"), ([10, 0], "B"), ([3, 0], "B"), ([2, 0], "A")]
got = classify(train, [1, 0], 4)
assert got == "A", f"получено {got!r}"
got = classify(train, [4, 0], 2)
assert got == "B", f"получено {got!r} — соседи [3,0] B и [2,0] A, ближе B"
def test_majority_beats_nearest():
"""Большинство важнее одного самого близкого соседа"""
train = [([0], "X"), ([2], "Y"), ([2.5], "Y"), ([-3], "X"), ([3], "Y")]
got = classify(train, [0.5], 3)
assert got == "Y", f"получено {got!r}: ближайшие [0] X, [2] Y, [2.5] Y"
def test_equal_distance_order():
"""Равные расстояния: раньше в train — значит ближе"""
train = [([1], "left"), ([-1], "right")]
got = classify(train, [0], 1)
assert got == "left", f"получено {got!r}"
train = [([1], "яз"), ([-1], "аз")] # по алфавиту «аз» раньше, но в train раньше «яз»
got = classify(train, [0], 1)
assert got == "яз", f"получено {got!r} — при равных расстояниях решает порядок в train, а не алфавит"