K - Mean 집합, DBSCAN 집합 원리 와 실현
26042 단어 기계 학습 알고리즘
K - Means 분류 알고리즘
기본 개념: 얻 으 려 는 클 러 스 터 의 갯 수: k 값 질량 심: 평균 값, 즉 벡터 각 차원 의 평균 값 거리의 도량 을 지정 해 야 합 니 다. 보통 유럽식 거리 와 코사인 싱크로 율 (모두 데 이 터 를 표준화 처리 해 야 합 니 다) 을 사용 합 니 다.
최적화 목표:
작업 절차: 1. k 2 를 지정 합 니 다. 무 작위 로 k 개의 점 을 질량 심 으로 선택 합 니 다. 각 점 에서 질량 심 까지 의 거 리 를 계산 하고 이 점 을 가장 가 까 운 질량 심 과 같은 유형 으로 나 눕 니 다. 새로운 질량 심 을 계산 합 니 다. 5. 각 점 에서 각 질량 심 까지 의 거 리 를 다시 계산 하고 분류 합 니 다. 새로운 질량 심 을 계산 합 니 다. 7. 질량 심 은 기본적으로 변화 하지 않 습 니 다.
장점: 간단 하고 빠 르 며 일반적인 데이터 세트 에 적합 합 니 다.
약점: 1. k 수 치 는 확정 하기 어렵다. 2. 복잡 도와 견본 수 는 선형 관 계 를 나타 낸다. 3. 임의의 모양 의 클 러 스 터 (가장 큰 문제) 를 발견 하기 어렵다. 4. 초기 질량 의 선택 이 결과 에 미 친 영향 이 매우 크다 (이런 문제 에 대해 여러 번 평균 을 취해 야 한다)
DBSCAN 알고리즘
기본 개념: DBSCAN: 밀도 에 기반 한 소음 이 있 는 집합 (Density - Based Spatial Clustering of Applications with Noise) 핵심 대상: 특정한 점 의 밀도 가 알고리즘 이 설정 한 한도 값 에 도달 하면 핵심 점 (즉, r 영역 내 점 의 수량 이 minPts 보다 적지 않 음) 입 니 다.ξ영역의 거리 한도 값: 설 정 된 반경 r 직접 밀 도 는 다음 과 같다. 만약 에 특정한 점 p 가 점 q 의 영역 에 있 고 q 가 핵심 점 이 라면 p - q 는 직접 밀도 가 도달 할 수 있 는 (비대 칭 관계) 밀도 가 도달 할 수 있다. 한 점 의 서열 a, b, c, d, e 가 있 고 임 의적 인 인접 점 은 직접 밀도 가 도달 할 수 있 으 며 a 에서 e 까지 밀도 가 도달 할 수 있다 고 한다. 이것 은 실제 적 으로 직접 밀도 가 도달 할 수 있 는 전파 (비대 칭 관계) 이다.밀도 연결: 만약 에 특정한 핵심 q 에서 출발 하여 점 p 와 점 k 가 모두 밀도 가 도달 할 수 있다 면 점 q 와 k 는 밀도 가 연 결 된 (대칭 관계) 경계 점 이 라 고 한다. 특정한 유형의 비 핵심 점 에 속 하고 하선 소음 점 을 발전 시 킬 수 없다. 그 어떠한 클 러 스 터 에 속 하지 않 고 그 어떠한 핵심 에서 출발 하여 밀도 가 도달 할 수 없다.
작업 흐름: 입력: D: 입력 한 데이터 세트ξ:지정 한 반경 MinPts: 밀도 한도 값
흐름:
unvisited
p visited
if p ξ MinPts :
C, p C
N P
for N q:
if q unvisited:
visited
q ξ MinPts , N
q C
C
visited
매개 변수 선택: 반경ξ:k 거리 에 따라 k 거 리 를 설정 할 수 있 습 니 다.k 거리 MinPts: k 거리 에서 k 의 값 이 라 고 불 리 며 보통 작 게 합 니 다.
장점: 클 러 스 터 개 수 를 지정 하지 않 아 도 임의의 모양 의 클 러 스 터 가 분리 점 을 잘 찾 을 수 있 음 을 발견 할 수 있 습 니 다. (DBSCN 알고리즘 을 이용 하여 데이터 의 분리 점 검 사 를 할 수도 있 고 좋 은 효과 가 있 습 니 다) 두 개의 매개 변수 만 지정 하면 됩 니 다.
열세 고 차원 데이터 가 약간 어렵 습 니 다 (강 차원 할 수 있 습 니 다) 매개 변 수 를 선택 하기 어렵 습 니 다 (매개 변수 가 결과 에 미 치 는 영향 이 매우 큽 니 다) sklearn 에서 실행 효율 이 낮 습 니 다 (데이터 감소 할 수 있 습 니 다)
집합 효과 평 가 는 윤곽 계 s (i) s (i) s (i) 수 를 통 해 집합 효 과 를 평가한다.
절차: 1. 샘플 i 에서 같은 샘플 의 평균 거 리 를 계산 하 는 ai, ai 월 소설 명 샘플 i 가 이 클 러 스 터 에 모여 야 할 수록 a (i) a (i) a (i) 를 샘플 i 의 클 러 스 터 내 싱크로 율 이 라 고 부 릅 니 다. 2. 샘플 i 에서 다른 클 러 스 터 Cj 의 모든 샘플 의 평 국 거리 bij 를 계산 하여 샘플 i 와 클 러 스 터 Cj 의 싱크로 율 이 라 고 부 르 고 샘플 i 의 클 러 스 터 간 싱크로 율 이 라 고 정의 합 니 다. b i = min 은 8289 °{ b i 1 , b i 2 , … , b i k } bi =\min \{\mathrm{bi} 1, \mathrm{bi} 2, \ldots, \mathrm{bik}\} bi=min{bi1,bi2,…,bik} s ( i ) = { 1 − a ( i ) b ( i ) , a ( i ) < b ( i ) 0 , a ( i ) = b ( i ) b ( i ) a ( i ) − 1 , a ( i ) > b ( i ) s(i)=\left\{\begin{array}{cc}{1-\frac{a(i)}{b(i)},} & {a(i)b(i)}\end{array}\right. s(i)=⎩⎪⎨⎪⎧1−b(i)a(i),0,a(i)b(i)−1,a(i)b(i)
s (i) s (i) s (i) 가 1 에 가깝다 는 것 은 샘플 i 집합 이 합 리 적 인 s (i) s (i) s (i) s (i) 가 1 에 가깝다 는 것 을 의미한다. 이 는 샘플 i 가 다른 클 러 스 터 s (i) s (i) s (i) 가 0 에 가깝다 는 것 을 의미한다. 이 는 샘플 i 가 두 클 러 스 터 의 경계 에 있다 는 것 을 의미한다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# -----------------------------------------------------------------------------------------------------------
data = pd.read_csv("data.txt", sep=" ")
print(data.head())
X = data[["calories", "sodium", "alcohol", "cost"]]
# sklearn KMean -----------------------------------------------------------------------------------------------------------
km = KMeans(n_clusters=3).fit(X)
km2 = KMeans(n_clusters=2).fit(X)
data["cluster"] = km.labels_
data["cluster2"] = km2.labels_
data = data.sort_values("cluster").reset_index() # cluster
# -----------------------------------------------------------------------------------------------------------
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
km = KMeans(n_clusters=3).fit(X_scaled)
data["scaled_cluster"] = km.labels_
data = data.sort_values("scaled_cluster").reset_index()
# -----------------------------------------------------------------------------------------------------------
centers1 = data.groupby("cluster2").mean()
centers2 = data.groupby("cluster").mean()
centers3 = data.groupby("scaled_cluster").mean()
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
plt.rcParams['font.size'] = 14
colors = np.array(['red', 'green', 'blue', 'yellow'])
ax1.scatter(data['calories'], data['alcohol'], c=colors[data['cluster2']]) #
ax2.scatter(data['calories'], data['alcohol'], c=colors[data['cluster']])
ax3.scatter(data['calories'], data['alcohol'], c=colors[data['scaled_cluster']])
ax1.scatter(centers1.calories, centers1.alcohol, linewidth=3, marker='+', s=300, c='black')
ax2.scatter(centers2.calories, centers2.alcohol, linewidth=3, marker='+', s=300, c='black')
ax3.scatter(centers3.calories, centers3.alcohol, linewidth=3, marker='+', s=300, c='black')
plt.show()
# -----------------------------------------------------------------------------------------------------------
from pandas.plotting import scatter_matrix
cluster_centers = km.cluster_centers_
cluster_centers_2 = km2.cluster_centers_
print(cluster_centers)
print(cluster_centers_2)
scatter_matrix(data[["calories", "sodium", "alcohol", "cost"]], s=100, alpha=1, c=colors[data["cluster"]],
figsize=(10, 10))
plt.suptitle("With 3 centroids initialized")
plt.show()
scatter_matrix(data[["calories", "sodium", "alcohol", "cost"]], s=100, alpha=1, c=colors[data["cluster2"]],
figsize=(10, 10))
plt.suptitle("With 2 centroids initialized")
plt.show()
# -----------------------------------------------------------------------------------------------------------
from sklearn import metrics
score_scaled = metrics.silhouette_score(X, data.scaled_cluster)
score = metrics.silhouette_score(X, data.cluster)
print(score_scaled, score)
scores = []
for k in range(2, 20):
labels = KMeans(n_clusters=k).fit(X).labels_
score = metrics.silhouette_score(X, labels)
scores.append(score)
print(score)
plt.plot(list(range(2, 20)), scores)
plt.show()
DBSCAN 알고리즘 구현
import pandas as pd
data = pd.read_csv("data.txt", sep=" ")
X = data[["calories", "sodium", "alcohol", "cost"]]
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=10, min_samples=2).fit(X)
labels = db.labels_
data["cluster_db"] = labels
data = data.sort_values("cluster_db").reset_index()
print(data)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기계 학습 문제 해결 의 절차앞의 두 가지 방법 은 모두 알고리즘 자체 에서 약간의 돌 파 를 시도 하 는 것 이 고, 세 번 째 방법 은 데이터 자체 에서 시작 하 기 를 바 라 는 것 이다.저 자 는 사실 이런 방법 을 '특징 공정' 이 라...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.