Saya melakukan klasifikasi biner dari kumpulan data berlabel sebagian. Saya memiliki perkiraan yang andal untuk angka 1-nya, tetapi bukan angka 0-nya.

Dari dokumentasi sklearn KMeans :

init : {‘k-means++’, ‘random’ or an ndarray}
Method for initialization, defaults to ‘k-means++’:   
If an ndarray is passed, it should be of shape (n_clusters, n_features) and gives the initial centers.

Saya ingin melewati ndarray, tetapi saya hanya memiliki 1 centroid yang andal, bukan 2.

Apakah ada cara untuk memaksimalkan entropi antara centroid K-1 dan Kth? Atau, apakah ada cara untuk menginisialisasi centroid K-1 secara manual dan menggunakan K++ untuk sisanya?

================================================== =====

Pertanyaan-pertanyaan Terkait:

Ini berusaha untuk mendefinisikan K centroid dengan n -1 fitur. (Saya ingin mendefinisikan k-1 centroid dengan n fitur).

Berikut adalah deskripsi tentang apa Saya ingin, tetapi itu ditafsirkan sebagai bug oleh salah satu pengembang, dan "mudah diimplementasikan[dapat]"

1
Sean Carter 20 November 2020, 02:21

1 menjawab

Jawaban Terbaik

Saya cukup yakin ini berfungsi sebagaimana dimaksud, tetapi tolong perbaiki saya jika Anda menemukan kesalahan. (dikumpulkan dari geeks untuk geeks):


import sys

def distance(p1, p2): 
    return np.sum((p1 - p2)**2)


def find_remaining_centroid(data, known_centroids, k = 1): 
    ''' 
    initialized the centroids for K-means++ 
    inputs: 
        data - Numpy array containing the feature space
        known_centroid - Numpy array containing the location of one or multiple known centroids
        k - remaining centroids to be found
    '''
    n_points = data.shape[0]

    # Initialize centroids list
    if known_centroids.ndim > 1:
        centroids = [cent for cent in known_centroids]
    
    else:
        centroids = [np.array(known_centroids)]

    # Perform casting if necessary
    if isinstance(data, pd.DataFrame):
        data = np.array(data)
        
    # Add a randomly selected data point to the list  
    centroids.append(data[np.random.randint( 
            n_points), :])
    
    # Compute remaining k-1 centroids
    for c_id in range(k - 1):
        ## initialize a list to store distances of data 
        ## points from nearest centroid 
        dist = np.empty(n_points)

        for i in range(n_points):
            point = data[i, :] 
            d = sys.maxsize 

            ## compute distance of 'point' from each of the previously 
            ## selected centroid and store the minimum distance 
            for j in range(len(centroids)): 
                temp_dist = distance(point, centroids[j]) 
                d = min(d, temp_dist) 

            dist[i] = d

        ## select data point with maximum distance as our next centroid 
        next_centroid = data[np.argmax(dist), :] 
        centroids.append(next_centroid) 

        # Reinitialize distance array for next centroid
        dist = np.empty(n_points)
    

    
    return centroids[-k:]

Penggunaannya:

# For finding a third centroid:
third_centroid = find_remaining_centroid(X_train, np.array([presence_seed, absence_seed]), k = 1)

# For finding the second centroid:
second_centroid = find_remaining_centroid(X_train, presence_seed, k = 1)

Di mana kehadiran_seed dan absen_seed adalah lokasi centroid yang diketahui.

0
Sean Carter 20 November 2020, 20:14