Введение
В этом практическом занятии мы изучим алгоритм k-ближайших соседей, мощный инструмент для классификации точек данных. Реализовав этот алгоритм на JavaScript, мы сможем классифицировать новые точки данных на основе их близости к имеющимся помеченным точкам данных, что делает его ценным инструментом для различных приложений, таких как системы рекомендаций и распознавание образов. С помощью этого практического занятия мы глубже узнаем, как работают алгоритмы машинного обучения и как их можно реализовать в реальных сценариях.
Алгоритм k-ближайших соседей
Для использования Алгоритма k-ближайших соседей следуйте шагам:
- Откройте Терминал/SSH и введите
node. - Классифицируйте точку данных относительно помеченного набора данных с использованием алгоритма k-ближайших соседей.
- Сопоставьте
dataс объектами с использованиемArray.prototype.map(). Каждый объект содержит евклидово расстояние элемента отpoint, вычисленное с использованиемMath.hypot(),Object.keys()и егоlabel. - Используйте
Array.prototype.sort()иArray.prototype.slice(), чтобы получитьkближайших соседейpoint. - Используйте
Array.prototype.reduce()в сочетании сObject.keys()иArray.prototype.indexOf(), чтобы найти наиболее часто встречающийсяlabelсреди них.
Вот пример кода, который реализует Алгоритм k-ближайших соседей:
const kNearestNeighbors = (data, labels, point, k = 3) => {
const kNearest = data
.map((el, i) => ({
dist: Math.hypot(...Object.keys(el).map((key) => point[key] - el[key])),
label: labels[i]
}))
.sort((a, b) => a.dist - b.dist)
.slice(0, k);
return kNearest.reduce(
(acc, { label }, i) => {
acc.classCounts[label] =
Object.keys(acc.classCounts).indexOf(label) !== -1
? acc.classCounts[label] + 1
: 1;
if (acc.classCounts[label] > acc.topClassCount) {
acc.topClassCount = acc.classCounts[label];
acc.topClass = label;
}
return acc;
},
{
classCounts: {},
topClass: kNearest[0].label,
topClassCount: 0
}
).topClass;
};
Вот, как использовать этот код:
const data = [
[0, 0],
[0, 1],
[1, 3],
[2, 0]
];
const labels = [0, 1, 1, 0];
kNearestNeighbors(data, labels, [1, 2], 2); // 1
kNearestNeighbors(data, labels, [1, 0], 2); // 0
Резюме
Поздравляем! Вы завершили практическое занятие по алгоритму k-ближайших соседей. Вы можете выполнить больше практических занятий в LabEx, чтобы улучшить свои навыки.