자율 클러스터링 알고리즘 K-수단

전송 : 저자 : LY 하오
링크 : HTTPS : //www.jianshu.com/p/caef1926adf7

클러스터링

샘플 데이터 세트에 노력하는 여러 하위 집합으로 나누어 클러스터링 일반적으로하지 교차하는 각 하위 통합 "클러스터입니다." 이 부문별로, 각 클러스터는 "밝은 색의 멜론", "어두운 멜론", "수박이있다" "아니오 수박"또는 "이 고구마"와 "외부 고구마 등의 기본 개념 (즉, 클래스)의 일부에 해당 할 수있다 마찬가지로 "이고, 알고리즘 클러스터링 이러한 개념은 미리 알 수 있음을 유의해야한다 자동 클러스터링 프로세스는 의미론 및 네이밍 개념을 이해하기 위해 사용자가 클러스터에 대응하는 클러스터 구조를 형성 할 수있다.

클러스터링 및 등급의 차이?

클러스터링은 자율 학습 알고리즘, 분류 감독 학습 알고리즘이다. 알고리즘 학습 시스템이 모델을 구축, 적절한 매개 변수로 훈련 세트를 배우고, 다음 테스트 세트에 적용 (데이터의 트레이닝 세트가 어떤 범주에 속하는 경우 사전에 알고있다) 알려진 라벨의 소위 감독 트레이닝 세트가있다. 클러스터링 알고리즘에 레이블, 클러스터링 없다, 우리는 클래스가 무엇인지 상관 없어, 우리는 목표는 비슷한 일이 함께 모여 가지고하는 것입니다 달성 할 필요가있다.

성능 메트릭

목적은 매우 직관적 인 아이디어는 가능한 한 높은 같은 클러스터 유사성이며, 클러스터 및 클러스터 사이에 비슷한 샘플이 함께 모여 클러스터하지만,이 "처럼 같이 유치"와 유사한 서로 다른 샘플을 분리하는 것입니다 유사도는 가능한 낮게한다.
성능 메트릭은 크게 2 가지로 나눌 수있다 : 외부 지표 번째 내부 지표이다.
외부 지표 : 클러스터링 결과와 비교를위한 "참조 모델".
내부 지표 : 어떤 참조 모델, 직접 연구 클러스터링 결과를 사용하지 마십시오.

원칙의 K-수단

샘플 크기, K 클러스터로 샘플 세트 사이의 거리에 따라 샘플들의 주어진 세트에 대한. 가까운 곳에 가능한 클러스터 내의 점을하자, 가능한 한 큰로서 클러스터 사이의 거리를하자

K-수단 알고리즘

제곱 오차를 생성 C 클러스터링을위한 소정의 샘플 세트 D, K-수단 클러스터링 알고리즘은 최소화된다.

 
 

어느 정도이 수식은 평균 벡터 주위 클러스터 샘플 클러스터의 친밀감 특징, E 값보다 작은 클러스터 샘플 높은 유사성이다.
상기 식을 최소화하는 최적의 솔루션을 분할 D의 모든 가능한 클러스터의 샘플 세트를 판단한다 쉽게 찾을 수없고, 이것은 인 NP-어려운 문제 . 따라서, K-수단은, 최적화 방정식은 상기 반복적으로 근사 해결 사용을 욕심 전략 알고리즘입니다. 다음 알고리즘 프로세스는 :

 

 

평균 벡터의 첫 번째 행이 반복적 결과 클러스터링 한 후에 업데이트 된 평균 벡터의 현재 갱신을 순차적으로 반복 클러스터링 및 로우 라인 4-8 및 9-16으로 초기화되고, 18 전류에서 그 첫 번째 행 변하지 클러스터 분할 결과가 반환됩니다.

 

4.0 박 데이터는 K-수단 알고리즘의 학습 과정을 설명하기 위해 다음 설정 예. 우리는 "밀도"와 "당도"두 특성의 2 차원 벡터 값을 포함하는 샘플 XI 난에 대한 수를했다.

 

 

클러스터의 K = (3)의 수는 가정, 알고리즘, 즉, 최초와 같은 세 무작위 샘플 X6, X12, X27, 평균 벡터를 시작
 
 

 

조사한 샘플 X1 = (0.697, 0.460), 현재 평균 벡터는 U1, U2는, U3 0.369,0.506,0.166 각각 거리 X1, 그러므로 클러스터 C3에 포함되는 것이다. 모든 샘플에 대한 유사한이 데이터를 다시 설정 조사 후에는 현재의 클러스터로 나누어 얻을 수 있습니다
 
 
따라서, 각각 C1, C2, C3의 새로운 평균 벡터를 구하는
 
 
다음과 같이 현재의 평균 벡터를 갱신 한 후, 상기 프로세스는 최종 분할 클러스터를주고, 네번째 반복 동일의 5 번 반복에 의해 발생 된 결과는, 다음 알고리즘이 정지 반복된다.

 

 

K-수단 与 KNN

初学者会很容易就把K-Means和KNN搞混,其实两者的差别还是很大的。
K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。
当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。

K-Means的优点与缺点

优点:
简单,易于理解和实现;收敛快,一般仅需5-10次迭代即可,高效
缺点:
1,对K值得选取把握不同对结果有很大的不同
2,对于初始点的选取敏感,不同的随机初始点得到的聚类结果可能完全不同
3,对于不是凸的数据集比较难收敛
4,对噪点过于敏感,因为算法是根据基于均值的
5,结果不一定是全局最优,只能保证局部最优
6,对球形簇的分组效果较好,对非球型簇、不同尺寸、不同密度的簇分组效果不好。

代码部分

读取数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
dataset = pd.read_csv('watermelon_4.csv', delimiter=",")
data = dataset.values
print(dataset)

K-Means算法

import random
def distance(x1, x2):
    return sum((x1-x2)**2)
def Kmeans(D,K,maxIter):
    m, n = np.shape(D)
    if K >= m:
        return D
    initSet = set()
    curK = K
    while(curK>0):  # 随机选取k个样本
        randomInt = random.randint(0, m-1)
        if randomInt not in initSet:
            curK -= 1
            initSet.add(randomInt)
    U = D[list(initSet), :]  # 均值向量
    C = np.zeros(m)
    curIter = maxIter
    while curIter > 0:
        curIter -= 1
        for i in range(m):
            p = 0
            minDistance = distance(D[i], U[0])
            for j in range(1, K):
                if distance(D[i], U[j]) < minDistance:
                    p = j
                    minDistance = distance(D[i], U[j])
            C[i] = p
        newU = np.zeros((K, n))
        cnt = np.zeros(K)
        for i in range(m):
            newU[int(C[i])] += D[i]
            cnt[int(C[i])] += 1
        changed = 0
        for i in range(K):
            newU[i] /= cnt[i]
            for j in range(n):
                if U[i, j] != newU[i, j]:
                    changed = 1
                    U[i, j] = newU[i, j]
        if changed == 0:
            return U, C, maxIter-curIter
    return U, C, maxIter-curIter

作图查看结果

U, C, iter = Kmeans(data,3,10)
# print(U)
# print(C)
# print(iter)

f1 = plt.figure(1)
plt.title('watermelon_4')
plt.xlabel('density')
plt.ylabel('ratio')
plt.scatter(data[:, 0], data[:, 1], marker='o', color='g', s=50)
plt.scatter(U[:, 0], U[:, 1], marker='o', color='r', s=100)
# plt.xlim(0,1)
# plt.ylim(0,1)
m, n = np.shape(data)
for i in range(m):
    plt.plot([data[i, 0], U[int(C[i]), 0]], [data[i, 1], U[int(C[i]), 1]], "c--", linewidth=0.3)
plt.show()

 





추천

출처www.cnblogs.com/zym-yc/p/12111420.html