2017-11-29 16 views
2
def closest_centroid(points, centroids): 
    """returns an array containing the index to the nearest centroid for each point""" 
    distances = np.sqrt(((points - centroids[:, np.newaxis])**2).sum(axis=2)) 
    return np.argmin(distances, axis=0) 

이 함수의 정확한 작동 원리를 설명 할 수 있습니까? 그래서이 Python 함수에서 어떤 일이 일어나는지 이해하려고 시도합니다.

31998888119  0.94  34 
23423423422  0.45  43 
.... 

그리고 : 저는 현재 보이는 points을 얻었다. points[2]0.94이고 points[3]가 제 항목 34있을 것이지만이 numpy 어레이에서 points[1] 장기 ID 것이다.

def initialize_centroids(points, k): 
    """returns k centroids from the initial points""" 
    centroids = points.copy() 
    np.random.shuffle(centroids) 
    return centroids[:k] 

지금 내가 처음 ID의 열 및 centroids (다시 한 번 첫 번째 열을 무시 무시 points의 값에서 유클리드 거리를 얻으려면 :

무게 중심이 특정 배열에서 그냥 무작위 선택이다). 정확히 distances = np.sqrt(((points - centroids[:, np.newaxis])**2).sum(axis=2)) 줄의 구문을 이해하지 못합니다. 새 축에 대한 해독이있는 동안 정확하게 세 번째 열을 기준으로 합산하는 이유는 무엇입니까? np.newaxis? 또한 어떤 축을 따라 np.argmin을 작동시켜야합니까?

답변

0

그것은 크기에 대해 생각하는 데 도움이됩니다. k=4이라고 가정하고 10 점이 있다면 points.shape = (10,3)입니다.

다음으로, centroids = initialize_centroids(points, 4) 차원 (4,3)을 가진 개체를 반환합니다.

는 이제 내부에서이 라인을 중단하자

distances = np.sqrt(((points - centroids[:, np.newaxis])**2).sum(axis=2))

  1. 우리는 각 지점에서 각각의 중심을 빼야합니다. pointscentroids는 2 차원이기 때문에, 각각 2 points - centroid 치수이다. 1 센트 로이드 만 있다면, 우리는 괜찮습니다. 그러나 우리는 4 centroid를 가지고 있습니다! 따라서 각 중심에 대해 points - centroids을 수행해야합니다. 따라서 우리는 이것을 저장하기 위해 다른 차원이 필요합니다. 따라서 np.newaxis이 추가되었습니다.

  2. 거리가 있기 때문에 사각형으로 표시하므로 네거티브를 양수로 변환하고 싶습니다 (또한 유클리드 거리를 최소화하기 때문에).

  3. 우리는 세 번째 열에 걸쳐 합산 아닙니다. 사실 우리는 점들과 중심점의 차이점을 각 중심점마다 합산합니다.

  4. np.argmin()은 최소 거리를 갖는 중심을 찾는다. 그래서 각각의 무게 중심에 대한 각 지점에 대해, (따라서 argmin 대신 min의) 최소 인덱스를 찾을 수 있습니다. 그 색인은 그 점에 할당 된 중심입니다.

    points = np.array([ 
    [ 1, 2, 4], 
    [ 1, 1, 3], 
    [ 1, 6, 2], 
    [ 6, 2, 3], 
    [ 7, 2, 3], 
    [ 1, 9, 6], 
    [ 6, 9, 1], 
    [ 3, 8, 6], 
    [ 10, 9, 6], 
    [ 0, 2, 0], 
    ]) 
    
    centroids = initialize_centroids(points, 4) 
    
    print(centroids) 
    array([[10, 9, 6], 
        [ 3, 8, 6], 
        [ 6, 2, 3], 
        [ 1, 1, 3]]) 
    
    distances = (pts - centroids[:, np.newaxis])**2 
    
    print(distances) 
    array([[[ 81, 49, 4], 
        [ 81, 64, 9], 
        [ 81, 9, 16], 
        [ 16, 49, 9], 
        [ 9, 49, 9], 
        [ 81, 0, 0], 
        [ 16, 0, 25], 
        [ 49, 1, 0], 
        [ 0, 0, 0], 
        [100, 49, 36]], 
    
        [[ 4, 36, 4], 
        [ 4, 49, 9], 
        [ 4, 4, 16], 
        [ 9, 36, 9], 
        [ 16, 36, 9], 
        [ 4, 1, 0], 
        [ 9, 1, 25], 
        [ 0, 0, 0], 
        [ 49, 1, 0], 
        [ 9, 36, 36]], 
    
        [[ 25, 0, 1], 
        [ 25, 1, 0], 
        [ 25, 16, 1], 
        [ 0, 0, 0], 
        [ 1, 0, 0], 
        [ 25, 49, 9], 
        [ 0, 49, 4], 
        [ 9, 36, 9], 
        [ 16, 49, 9], 
        [ 36, 0, 9]], 
    
        [[ 0, 1, 1], 
        [ 0, 0, 0], 
        [ 0, 25, 1], 
        [ 25, 1, 0], 
        [ 36, 1, 0], 
        [ 0, 64, 9], 
        [ 25, 64, 4], 
        [ 4, 49, 9], 
        [ 81, 64, 9], 
        [ 1, 1, 9]]]) 
    
    print(distances.sum(axis=2)) 
    array([[134, 154, 106, 74, 67, 81, 41, 50, 0, 185], 
        [ 44, 62, 24, 54, 61, 5, 35, 0, 50, 81], 
        [ 26, 26, 42, 0, 1, 83, 53, 54, 74, 45], 
        [ 2, 0, 26, 26, 37, 73, 93, 62, 154, 11]]) 
    
    # The minimum of the first 4 centroids is index 3. The minimum of the second 4 centroids is index 3 again. 
    
    print(np.argmin(distances.sum(axis=2), axis=0)) 
    array([3, 3, 1, 2, 2, 1, 1, 1, 0, 3]) 
    
    : 여기

은 일례이며