Untitled

 avatar
unknown
python
2 years ago
1.4 kB
5
Indexable
def objective(X, y, cen):
    n = len(X)
    obj = 0
    for i in range(n):
        #obj += np.linalg.norm(X[i]-cen[y[i]])
        obj += (X[i] - cen[y[i]])**2
    return np.sum(obj)

def find_clusters(X, n_clusters, rseed=2):
    # 1. Randomly choose clusters
    rng = np.random.RandomState(rseed)
    i = rng.permutation(X.shape[0])[:n_clusters]
    centers = X[i]
    #print(centers)
    i = 0
    while True:
        print("Loop no: ", i)
        i+=1
        # 2a. Assign labels based on closest center
        #labels = pairwise_distances_argmin(X, centers,metric='euclidean')
        labels = pairwise_distances(X, centers, metric='euclidean').argmin(axis=1)
        print("Pairwise cosine start")
        t1 = datetime.now()
        #labels = pairwise_distances(X, centers, metric='cosine').argmax(axis=1)
        print("Pairwise cosine end")
        t2 = datetime.now()
        print(labels)
        
        # 2b. Find new centers from means of points
        new_centers = np.array([X[labels == i].mean(0)
                                for i in range(n_clusters)])
        print(new_centers)
        
        print(t2-t1)
        # 2c. Check for convergence
        if np.all(centers == new_centers):
            break
        centers = new_centers
    ob = objective(X, labels, new_centers)
    print(centers)
    print(ob)
    
    return centers, labels
Editor is loading...