Прогнозирование значений с помощью алгоритма кластеризации k-средних - PullRequest
4 голосов
/ 19 ноября 2011

Я возился с машинным обучением и написал реализацию алгоритма K Means на Python.Он берет двумерные данные и организует их в кластеры.Каждая точка данных также имеет значение класса 0 или 1.

Что меня смущает в алгоритме, так это то, как я могу использовать его для прогнозирования некоторых значений для другого набора двумерных данных, который неиметь 0 или 1, но вместо этого неизвестно.Следует ли мне усреднять для каждого кластера точки в нем либо в 0, либо в 1, а если неизвестная точка находится ближе всего к этому кластеру, то эта неизвестная точка принимает усредненное значение?Или есть более умный метод?

Ура!

Ответы [ 4 ]

8 голосов
/ 19 ноября 2011

Чтобы назначить новую точку данных одному из набора кластеров, созданных с помощью k-средних, просто найдите ближайший к этой точке центроид .

Другими словами, те же самые шаги, которые вы использовали для итеративного назначения каждой точки в исходном наборе данных для одного из k кластеров. Единственное отличие здесь состоит в том, что центроиды, которые вы используете для этого вычисления, - это окончательный набор, т.е. значения для центроидов на последней итерации.

Вот одна реализация в python (w / NumPy):

>>> import numpy as NP
>>> # just made up values--based on your spec (2D data + 2 clusters)
>>> centroids
      array([[54, 85],
             [99, 78]])

>>> # randomly generate a new data point within the problem domain:
>>> new_data = NP.array([67, 78])

>>> # to assign a new data point to a cluster ID,
>>> # find its closest centroid:
>>> diff = centroids - new_data[0,:]  # NumPy broadcasting
>>> diff
      array([[-13,   7],
             [ 32,   0]])

>>> dist = NP.sqrt(NP.sum(diff**2, axis=-1))  # Euclidean distance
>>> dist
      array([ 14.76,  32.  ])

>>> closest_centroid = centroids[NP.argmin(dist),]
>>> closest_centroid
       array([54, 85])
1 голос
/ 30 октября 2017

Я знаю, что могу опоздать, но это мое общее решение вашей проблемы:

def predict(data, centroids):
    centroids, data = np.array(centroids), np.array(data)
    distances = []
    for unit in data:
        for center in centroids:
            distances.append(np.sum((unit - center) ** 2))                
    distances = np.reshape(distances, data.shape)
    closest_centroid = [np.argmin(dist) for dist in distances]
    print(closest_centroid)
1 голос
/ 19 ноября 2011

Если вы рассматриваете возможность присвоения значения на основе среднего значения в ближайшем кластере, вы говорите о некоторой форме «мягкого декодера», которая оценивает не только правильное значение координаты, но и ваш уровень доверия к оценке. , Альтернативой может быть «жесткий декодер», где допустимы только значения 0 и 1 (встречаются в наборе обучающих данных), а новая координата получит медиану значений в ближайшем кластере. Я предполагаю, что вы должны всегда назначать только известное действительное значение класса (0 или 1) для каждой координаты, а усреднение значений класса не является допустимым подходом.

0 голосов
/ 31 января 2018

Так я назначил метки для моего более близкого существующего центроида. Это может быть также полезно для реализации онлайн / инкрементной кластеризации, создания нового назначения для существующие кластеры, но с фиксированными центроидами. Будьте осторожны, потому что после (скажем, 5-10% новых точек, возможно, вы захотите пересчитать координаты центроида.

def Labs( dataset,centroids ):    
a = []
for i in range(len(dataset)):
    d = []
    for j in range(n):        
        dist = np.linalg.norm(dataset[(i),:]-centroids[(j),:])
        d.append(dist)
    assignment = np.argmin(d)
    a.append(assignment)
return pd.DataFrame(np.array(a) + 1,columns =['Lab'])

Надеюсь, это поможет

...