각 클러스터의 포인트 수가 동일한 클러스터링 절차?


25

점이 있습니다. . . , x n }X={x1,...,xn} 에서 하고 포인트를 클러스터링하여 다음과 같이합니다.Rp

  1. 각 군집에는 동일한 수의 요소가 포함 됩니다. (클러스터 수가 나눈다 고 가정합니다 .)Xn

  2. 각 군집은 평균 의 군집과 같은 의미에서 "공간적으로 응집력이 있습니다" .k

이 중 하나를 만족시키는 많은 클러스터링 절차를 생각하기는 쉽지만 누구나 한 번에 두 가지를 모두 얻는 방법을 알고 있습니까?


2
클러스터 크기도 지정되어 있습니까? 그런 다음 언급했듯이 문제는 해결할 수없는 것 같습니다. 다음과 같은 경우에 고려 : X = { - 1 , 0.99 , 1 , 1.01 } . 2 개의 군집을 원하는 경우 크기가 다르거 나 "공간적으로 응집력이없는"것을 얻을 수 있습니다. 또는 "가능한 한 공간적으로 응집력있는"것과 같은 것을 원하십니까? 최대 클러스터 내 거리를 최소화하는 것입니까? 다른 해결책은 n의 제수 를 클러스터 크기로 허용 하는 것이지만 항상 n 의 사소한 해가 있습니다. n=4,p=1X={1,0.99,1,1.01}nn 크기가 1 클러스터에1
Erik P.

1
좋은 지적. 이상적으로는 동일한 카디널리티 제약 조건을 만족시키면서 "가능한 한 공간적으로 응집력있는"것을 원합니다. 그러나 여기에 다른 트레이드 오프를 만드는 절차에 대해서도 관심이 있습니다.
Durrett가 아닙니다

Quantiles로 데이터를 분할하면 충분합니까? 값이 서로에 대해 단조롭지 않은 경우, 어떻게 '공간적으로 응집력있는'지 볼 수 없습니다.
celenius

4
제한된 클러스터링에 대한 최근의 연구가있었습니다. 구글은 google.com/search?q=constrained+k-means .
whuber

테스트되지 않은 아이디어는 하나뿐입니다. 군집화에서는 소위 Silhouette 통계가 자주 사용됩니다. 객체가 얼마나 잘 클러스터링되어 있고 등록 할 수있는 가장 가까운 다른 이웃 클러스터가 무엇인지 보여줍니다. 따라서 K-MEANS 또는 다른 클러스터 n으로 다른 분류를 시작할 수 있습니다. 그런 다음 통계에 따라 잘 분류되지 않은 객체를 동일한 n 을 얻을 때까지 n 이 작은 가장 가까운 이웃 클러스터로 이동하십시오 . 반복을 기대합니다. 일부 객체 이동, 통계 재 계산, 일부 객체 이동 등은 절충 프로세스입니다.
ttnphns

답변:


6

2 단계 접근 방식을 제안합니다.

  1. 하드 또는 퍼지 K- 평균을 사용하는 등의 클러스터 센터의 초기 추정치를 얻습니다.

  2. Global Nearest Neighbor 할당을 사용하여 점을 군집 중심과 연관 시키십시오 : 각 점과 각 군집 중심 사이의 거리 행렬을 계산하고 (적당한 거리 만 계산하면 문제를 조금 더 작게 만들 수 있습니다), 각 군집 중심을 X 번 복제하고 선형을 푸십시오 과제 문제 . 각 클러스터 센터에 대해 정확히 X가 데이터 포인트와 일치하므로 전체적으로 데이터 포인트와 클러스터 센터 사이의 거리가 최소화됩니다.

2 단계 후에 클러스터 센터를 업데이트하고 2 단계를 반복하여 기본적으로 클러스터 당 고정 된 수의 포인트로 K- 평균을 실행할 수 있습니다. 그래도 처음에 좋은 추측을하는 것이 좋습니다.


4

이 k- 평균 변형을 시도하십시오.

초기화 :

  • k무작위로 데이터 세트에서 센터를 선택 하거나 kmeans ++ 전략을 사용하여 더 나은
  • 각 점에 대해 가장 가까운 군집 중심까지의 거리를 계산하고 이에 대한 힙을 작성하십시오.
  • 클러스터가 이미 가득 차지 않은 경우 힙에서 포인트를 가져와 가장 가까운 클러스터에 할당합니다. 그렇다면 가장 가까운 다음 클러스터 센터를 계산하고 힙에 다시 삽입하십시오.

결국, 클러스터 당 +1 개의 동일한 수의 객체에 대한 요구 사항을 충족하는 분할이 있어야합니다 (마지막 몇 개의 클러스터에도 올바른 수의 객체 m가 있어야 ceil합니다 . 첫 번째 클러스터에는 객체 가 있어야 하며 나머지는 정확히 floor객체입니다).

반복 단계 :

요구 사항 : "스왑 제안"(다른 클러스터에있는 오브젝트)이있는 각 클러스터에 대한 목록.

E 단계 : 일반 k- 평균으로 업데이트 된 군집 중심 계산

M 단계 : 모든 포인트를 반복합니다 (단일 또는 모든 배치에서)

현재 클러스터보다 가까운 모든 클러스터 센터를 객체 / 가장 가까운 클러스터 센터로 계산 다른 클러스터 인 경우 :

  • 다른 클러스터가 현재 클러스터보다 작은 경우 새 클러스터로 이동하십시오.
  • 다른 클러스터 (또는 더 낮은 거리의 클러스터)에서 스왑 제안이있는 경우 두 요소 클러스터 지정을 바꾸십시오 (오퍼가 둘 이상인 경우 가장 크게 개선 된 것을 선택하십시오).
  • 그렇지 않으면 다른 클러스터에 대한 스왑 제안을 표시하십시오.

군집 크기는 변하지 않고 유지되며 (+-천장 / 바닥 차이), 개체가 추정을 향상시키는 한 한 군집에서 다른 군집으로 만 이동합니다. 따라서 k- 평균과 같은 시점에 수렴해야합니다. 그래도 조금 느릴 수 있습니다 (예 : 반복 횟수가 더 많음).

이것이 이전에 게시 또는 구현되었는지는 알 수 없습니다. 그것은 내가 시도하는 것입니다 (k-means를 시도한다면 훨씬 더 나은 클러스터링 알고리즘이 있습니다).

ELKI 에서 k-means 구현을 시작하는 것이 좋습니다. 이미 이미 k-means ++를 포함하여 세 가지 다른 초기화를 지원하는 것으로 보이며 저자는 다양한 공통 전략을 모두 다루기 위해 다른 반복 전략을 원한다고 말했습니다. 모듈 방식의 변형 (예 : Lloyd, MacQueen 등).


2
ELKI에는 자습서 및 자습서 "확장"모듈에 비슷한 방법이 포함되어 있습니다 . elki.dbs.ifi.lmu.de/wiki/Tutorial/SameSizeKMeans
Erich Schubert

3

이것은 최적화 문제입니다. 우리는이 문제를 해결하는 오픈 소스 Java 라이브러리를 가지고 있습니다 (클러스터 당 수량이 설정 범위 사이에 있어야 함). 그래도 총 포인트 수는 최대 수천이어야합니다. 5000 또는 10000을 넘지 않아야합니다.

도서관은 여기 있습니다 :

https://github.com/PGWelch/territorium/tree/master/territorium.core

라이브러리 자체는 지리적 / GIS 유형 문제에 맞게 설정되므로 X 및 Y, 위도 및 경도, 고객, 거리 및 시간 등에 대한 참조를 볼 수 있습니다. '지리적'요소를 무시하고 순수한 것으로 사용할 수 있습니다. 클러스터 러.

최소 및 최대 목표 수량이있는 초기 비어있는 입력 클러스터 세트를 각각 제공합니다. 클러스터 러는 휴리스틱 기반 최적화 알고리즘 (스왑, 이동 등)을 사용하여 입력 클러스터에 포인트를 할당합니다. 최적화에서는 먼저 각 클러스터를 최소 및 최대 수량 범위 내로 유지하는 우선 순위를 정한 다음 클러스터의 모든 지점과 클러스터의 중심점 사이의 거리를 최소화하므로 클러스터는 공간적으로 응집력이 있습니다.

이 인터페이스를 사용하여 솔버에 점 사이의 메트릭 함수 (즉, 거리 함수)를 제공합니다.

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/TravelMatrix.java

이 메트릭은 실제로 여행 기반 지리적 문제를 위해 설계 되었기 때문에 거리와 '시간'을 모두 반환하도록 구성되어 있지만 임의의 군집 문제의 경우 '시간'을 0으로 설정하고 거리를 사용중인 실제 메트릭으로 설정하면됩니다. 전철기.

이 수업에서 문제를 설정했습니다.

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Problem.java

포인트는 '고객'이고 수량은 1입니다. 고객 클래스에서 TravelMatrix가 리턴 한 '거리'필드에서 메트릭 거리를 리턴한다고 가정하고 costPerUnitTime = 0 및 costPerUnitDistance = 1을 설정했는지 확인하십시오.

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/main/java/com/opendoorlogistics/territorium/problem/Customer.java

솔버를 실행하는 예제는 다음을 참조하십시오.

https://github.com/PGWelch/territorium/blob/master/territorium.core/src/test/java/com/opendoorlogistics/territorium/TestSolver.java



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)

1
이 기여에 감사드립니다, @ user2341646. 이 솔루션의 정의, 작동 방식 및 솔루션 인 이유를 설명하는 설명을 추가 하시겠습니까?
gung-모니 티 복원

승인. 기본적으로 알고리즘은 임의의 멤버쉽 할당으로 시작하지만 클러스터에 G 멤버에 가깝고 K 개의 클러스터가 있습니다. 우리는 모든 군집에 대해 평균화 된 한 군집의 데이터 간 평균 거리를 측정하는 오류 함수를 정의합니다. 모든 데이터 쌍을 체계적으로 살펴보면이 두 데이터의 멤버쉽을 교환하면 오류가 더 낮은 지 알 수 있습니다. 그럴 경우 가능한 가장 낮은 오류를 업데이트하고, 그렇지 않으면 멤버십 스위치를 실행 취소합니다. 한 번의 패스 전체에 더 이상 움직임이 없을 때까지이 작업을 수행합니다.
Alexander Kain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.