점이 있습니다. . . , x n } 에서 하고 포인트를 클러스터링하여 다음과 같이합니다.
각 군집에는 동일한 수의 요소가 포함 됩니다. (클러스터 수가 나눈다 고 가정합니다 .)
각 군집은 평균 의 군집과 같은 의미에서 "공간적으로 응집력이 있습니다" .
이 중 하나를 만족시키는 많은 클러스터링 절차를 생각하기는 쉽지만 누구나 한 번에 두 가지를 모두 얻는 방법을 알고 있습니까?
점이 있습니다. . . , x n } 에서 하고 포인트를 클러스터링하여 다음과 같이합니다.
각 군집에는 동일한 수의 요소가 포함 됩니다. (클러스터 수가 나눈다 고 가정합니다 .)
각 군집은 평균 의 군집과 같은 의미에서 "공간적으로 응집력이 있습니다" .
이 중 하나를 만족시키는 많은 클러스터링 절차를 생각하기는 쉽지만 누구나 한 번에 두 가지를 모두 얻는 방법을 알고 있습니까?
답변:
2 단계 접근 방식을 제안합니다.
하드 또는 퍼지 K- 평균을 사용하는 등의 클러스터 센터의 초기 추정치를 얻습니다.
Global Nearest Neighbor 할당을 사용하여 점을 군집 중심과 연관 시키십시오 : 각 점과 각 군집 중심 사이의 거리 행렬을 계산하고 (적당한 거리 만 계산하면 문제를 조금 더 작게 만들 수 있습니다), 각 군집 중심을 X 번 복제하고 선형을 푸십시오 과제 문제 . 각 클러스터 센터에 대해 정확히 X가 데이터 포인트와 일치하므로 전체적으로 데이터 포인트와 클러스터 센터 사이의 거리가 최소화됩니다.
2 단계 후에 클러스터 센터를 업데이트하고 2 단계를 반복하여 기본적으로 클러스터 당 고정 된 수의 포인트로 K- 평균을 실행할 수 있습니다. 그래도 처음에 좋은 추측을하는 것이 좋습니다.
이 k- 평균 변형을 시도하십시오.
초기화 :
k
무작위로 데이터 세트에서 센터를 선택 하거나 kmeans ++ 전략을 사용하여 더 나은결국, 클러스터 당 +1 개의 동일한 수의 객체에 대한 요구 사항을 충족하는 분할이 있어야합니다 (마지막 몇 개의 클러스터에도 올바른 수의 객체 m
가 있어야 ceil
합니다 . 첫 번째 클러스터에는 객체 가 있어야 하며 나머지는 정확히 floor
객체입니다).
반복 단계 :
요구 사항 : "스왑 제안"(다른 클러스터에있는 오브젝트)이있는 각 클러스터에 대한 목록.
E 단계 : 일반 k- 평균으로 업데이트 된 군집 중심 계산
M 단계 : 모든 포인트를 반복합니다 (단일 또는 모든 배치에서)
현재 클러스터보다 가까운 모든 클러스터 센터를 객체 / 가장 가까운 클러스터 센터로 계산 다른 클러스터 인 경우 :
군집 크기는 변하지 않고 유지되며 (+-천장 / 바닥 차이), 개체가 추정을 향상시키는 한 한 군집에서 다른 군집으로 만 이동합니다. 따라서 k- 평균과 같은 시점에 수렴해야합니다. 그래도 조금 느릴 수 있습니다 (예 : 반복 횟수가 더 많음).
이것이 이전에 게시 또는 구현되었는지는 알 수 없습니다. 그것은 내가 시도하는 것입니다 (k-means를 시도한다면 훨씬 더 나은 클러스터링 알고리즘이 있습니다).
ELKI 에서 k-means 구현을 시작하는 것이 좋습니다. 이미 이미 k-means ++를 포함하여 세 가지 다른 초기화를 지원하는 것으로 보이며 저자는 다양한 공통 전략을 모두 다루기 위해 다른 반복 전략을 원한다고 말했습니다. 모듈 방식의 변형 (예 : Lloyd, MacQueen 등).
이것은 최적화 문제입니다. 우리는이 문제를 해결하는 오픈 소스 Java 라이브러리를 가지고 있습니다 (클러스터 당 수량이 설정 범위 사이에 있어야 함). 그래도 총 포인트 수는 최대 수천이어야합니다. 5000 또는 10000을 넘지 않아야합니다.
도서관은 여기 있습니다 :
https://github.com/PGWelch/territorium/tree/master/territorium.core
라이브러리 자체는 지리적 / GIS 유형 문제에 맞게 설정되므로 X 및 Y, 위도 및 경도, 고객, 거리 및 시간 등에 대한 참조를 볼 수 있습니다. '지리적'요소를 무시하고 순수한 것으로 사용할 수 있습니다. 클러스터 러.
최소 및 최대 목표 수량이있는 초기 비어있는 입력 클러스터 세트를 각각 제공합니다. 클러스터 러는 휴리스틱 기반 최적화 알고리즘 (스왑, 이동 등)을 사용하여 입력 클러스터에 포인트를 할당합니다. 최적화에서는 먼저 각 클러스터를 최소 및 최대 수량 범위 내로 유지하는 우선 순위를 정한 다음 클러스터의 모든 지점과 클러스터의 중심점 사이의 거리를 최소화하므로 클러스터는 공간적으로 응집력이 있습니다.
이 인터페이스를 사용하여 솔버에 점 사이의 메트릭 함수 (즉, 거리 함수)를 제공합니다.
이 메트릭은 실제로 여행 기반 지리적 문제를 위해 설계 되었기 때문에 거리와 '시간'을 모두 반환하도록 구성되어 있지만 임의의 군집 문제의 경우 '시간'을 0으로 설정하고 거리를 사용중인 실제 메트릭으로 설정하면됩니다. 전철기.
이 수업에서 문제를 설정했습니다.
포인트는 '고객'이고 수량은 1입니다. 고객 클래스에서 TravelMatrix가 리턴 한 '거리'필드에서 메트릭 거리를 리턴한다고 가정하고 costPerUnitTime = 0 및 costPerUnitDistance = 1을 설정했는지 확인하십시오.
솔버를 실행하는 예제는 다음을 참조하십시오.
나는 정규화 된 정보 극대화 (및 그 참조)에 의한 최근의 차별 클러스터링을 제안 한다. 특히, 섹션 2에서는 클래스 균형 및 클러스터 가정에 대해 설명합니다.
최근에 나는 매우 큰 데이터 세트가 아닌 이것을 필요로했습니다. 내 대답은 실행 시간이 비교적 길지만 지역 최적으로 수렴합니다.
def eqsc(X, K=None, G=None):
"equal-size clustering based on data exchanges between pairs of clusters"
from scipy.spatial.distance import pdist, squareform
from matplotlib import pyplot as plt
from matplotlib import animation as ani
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection
def error(K, m, D):
"""return average distances between data in one cluster, averaged over all clusters"""
E = 0
for k in range(K):
i = numpy.where(m == k)[0] # indeces of datapoints belonging to class k
E += numpy.mean(D[numpy.meshgrid(i,i)])
return E / K
numpy.random.seed(0) # repeatability
N, n = X.shape
if G is None and K is not None:
G = N // K # group size
elif K is None and G is not None:
K = N // G # number of clusters
else:
raise Exception('must specify either K or G')
D = squareform(pdist(X)) # distance matrix
m = numpy.random.permutation(N) % K # initial membership
E = error(K, m, D)
# visualization
#FFMpegWriter = ani.writers['ffmpeg']
#writer = FFMpegWriter(fps=15)
#fig = plt.figure()
#with writer.saving(fig, "ec.mp4", 100):
t = 1
while True:
E_p = E
for a in range(N): # systematically
for b in range(a):
m[a], m[b] = m[b], m[a] # exchange membership
E_t = error(K, m, D)
if E_t < E:
E = E_t
print("{}: {}<->{} E={}".format(t, a, b, E))
#plt.clf()
#for i in range(N):
#plt.text(X[i,0], X[i,1], m[i])
#writer.grab_frame()
else:
m[a], m[b] = m[b], m[a] # put them back
if E_p == E:
break
t += 1
fig, ax = plt.subplots()
patches = []
for k in range(K):
i = numpy.where(m == k)[0] # indeces of datapoints belonging to class k
x = X[i]
patches.append(Polygon(x[:,:2], True)) # how to draw this clock-wise?
u = numpy.mean(x, 0)
plt.text(u[0], u[1], k)
p = PatchCollection(patches, alpha=0.5)
ax.add_collection(p)
plt.show()
if __name__ == "__main__":
N, n = 100, 2
X = numpy.random.rand(N, n)
eqsc(X, G=3)