# kmeans

# kmeans

by jihoon kim

HTML

<style>
.MJXp-math.MJXp-display {
  display:inline !important;
}
</style>
<div id="contents">
## 군집(Clustering)?
   - 패턴 공간에 주어진 유한 개의 패턴들이 서로 가깝게 모여서 무리를 이루고 있는 패턴 집합을 묶는 과정.

## K-MEANS (KMEANS)란?
   - [K-평균알고리즘 - WIKI](https://ko.wikipedia.org/wiki/K-평균_알고리즘)

   - 주어진 데이터를 k개의 군집(클러스터:Clustering)로 묶는 알고리즘.
   - 각 클러스터와 거리 차이의 분산을 최소화하는 방식으로 동작.
   - 거리에 기반을 둔 clustering 기법
   - 기준점에 가까운 곳의 데이터들을 하나의 군집으로 묶는 방법.
   - 비지도학습 : Unsupervised Learning - [참고](https://ko.wikipedia.org/wiki/비_지도_학습)

## K-MEANS 수행과정1
  1. 임의의 "K개 중심값" 설정.
  2. 전체 데이터와 "K개 중심값"을 비교, 가장 가까운 군집(K)에 소속.
  3. 군집된 데이터를 기준으로 군집중앙의 위치를 제 설정.
  4. 새롭개 구한 "k개 중심값"이 기존과 동일하면 알고리즘 종료.
     :: 이 과정을 통하여 K개의 군집으로 데이터를 구분.

# 수행과정 - javascript
###**1. 초기 중심값(init Centroid) 초기화.**
   * 알고리즘 : https://ko.wikipedia.org/wiki/K-평균_알고리즘#초기화_기법
      - Random Partition
      - Forgy, MacQueen
      - Kaufman
      
###**2. Data간 거리 계산 및 분류**
**1. 초기 중심값(init Centroid) 과 Data간 거리 계산.**
  * [유클리드 거리(Euclidean distance)](https://ko.wikipedia.org/wiki/유클리드_거리)
```JavaScript
        /* 초기 중심값과 Data의 거리 비교.
          - 초기 중심값 : center
          - Data       : dataset
          >> distance(dataset[n], center[k]);
        */
        let c = [];
        for(let n = 0 ; n < dataset.length ; n++) {
            let x = dataset[n];
            let minDist = -1, rn = 0;
            for(let k = 0 ; k < center.length ; k++) {
                let dist = distance(dataset[n], center[k]);
                if(minDist === -1 || minDist > dist) {
                    minDist = dist;
                    cn = k;
                }
            }
            c[n] = cn;
        }        
        // c : 클러스터링 분류정보 (0~K)
```

**2. 거리가 가까운 군집에 Data를 분류.**
```JavaScript
        c[n] = rn;
```

**3. 중심점 최적화 및 왜곡측정.**
 - 왜곡측정 : 거리의 합을 비교.
    1. 중심점 계산 :centroid();
    2. 왜곡측정 : 중심점과 Data간 최소거리의합과 이전최소거리의 합의 변화를 비교함.

```javaScript
let preJ = 0;
while (true) {
    let c = centroid();

    // 왜곡측정 : 거리의 합을 이용.
    let J = 0;
    for (let n =...