JavaScript 로 K-평균 클러스터링 구현하기

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 JavaScript 에서 k-평균 클러스터링 알고리즘을 탐구합니다. 이 랩의 목적은 k-평균 알고리즘을 사용하여 유사성을 기반으로 데이터를 k 개의 클러스터로 그룹화하는 방법을 배우는 것입니다. 알고리즘을 단계별로 구현하고 샘플 데이터 세트에 적용하여 작동 방식을 이해할 것입니다.

JavaScript 로 구현한 K-평균 클러스터링 알고리즘

k-평균 클러스터링 알고리즘을 사용하여 코딩 연습을 시작하려면 터미널/SSH 를 열고 node를 입력하십시오. 이 알고리즘은 주어진 데이터를 k-평균 클러스터링 알고리즘을 사용하여 k개의 클러스터로 그룹화합니다.

구현에 사용되는 단계는 다음과 같습니다.

  1. Array.from()Array.prototype.slice()를 사용하여 클러스터 centroids, distancesclasses에 대한 적절한 변수를 초기화합니다.
  2. itr로 표시된 대로 이전 반복에서 변경 사항이 있는 동안 while 루프를 사용하여 할당 및 업데이트 단계를 반복합니다.
  3. Math.hypot(), Object.keys()Array.prototype.map()을 사용하여 각 데이터 포인트와 중심점 간의 유클리드 거리 (euclidean distance) 를 계산합니다.
  4. Array.prototype.indexOf()Math.min()을 사용하여 가장 가까운 중심점을 찾습니다.
  5. Array.from(), Array.prototype.reduce(), parseFloat()Number.prototype.toFixed()를 사용하여 새로운 중심점을 계산합니다.
const kMeans = (data, k = 1) => {
  const centroids = data.slice(0, k);
  const distances = Array.from({ length: data.length }, () =>
    Array.from({ length: k }, () => 0)
  );
  const classes = Array.from({ length: data.length }, () => -1);
  let itr = true;

  while (itr) {
    itr = false;

    for (let d in data) {
      for (let c = 0; c < k; c++) {
        distances[d][c] = Math.hypot(
          ...Object.keys(data[0]).map((key) => data[d][key] - centroids[c][key])
        );
      }
      const m = distances[d].indexOf(Math.min(...distances[d]));
      if (classes[d] !== m) itr = true;
      classes[d] = m;
    }

    for (let c = 0; c < k; c++) {
      centroids[c] = Array.from({ length: data[0].length }, () => 0);
      const size = data.reduce((acc, _, d) => {
        if (classes[d] === c) {
          acc++;
          for (let i in data[0]) centroids[c][i] += data[d][i];
        }
        return acc;
      }, 0);
      for (let i in data[0]) {
        centroids[c][i] = parseFloat(Number(centroids[c][i] / size).toFixed(2));
      }
    }
  }

  return classes;
};

알고리즘을 테스트하려면 데이터 배열과 원하는 클러스터 수 k를 사용하여 kMeans() 함수를 호출하십시오. 이 함수는 각 데이터 포인트에 대한 클래스 할당 배열을 반환합니다.

kMeans(
  [
    [0, 0],
    [0, 1],
    [1, 3],
    [2, 0]
  ],
  2
); // [0, 1, 1, 0]

요약

축하합니다! K-평균 클러스터링 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.