Как настроить начальный Cente в OpenCV Python с помощью cv2.KMEANS_USE_INITIAL_LABELS - PullRequest
0 голосов
/ 28 сентября 2018

как установить вектор bestLabel в python, каков будет размер bestLabel, если он имеет две позиции из выборок.

compactness,label,center=cv2.kmeans(samples,K,bestLabel,criteria,10,cv2.KMEANS_USE_INITIAL_LABELS)

Я изо всех сил пытаюсь дать свои начальные средства kmeans.Мои образцы составляют массив 70х2, включая 70 образцов с 2 функциями.К = 2.Пожалуйста, дайте мне пример Python генерации BestLabel.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Вы должны предоставить начальные центроиды, которые вы хотите, и начальные метки для каждого образца.

import cv2
import numpy as np


def main():

    seed = 1
    nclusters = 2

    np.random.seed(seed) # Get always same random numpys
    data = np.random.random(size=(100, 100)).astype(np.float32)
    centers = np.array([[75], [125]])
    labels = np.random.randint(nclusters,
                               size=(data.shape[0], data.shape[1]),
                               dtype=np.int32)


    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 1.0)

    reshaped_data = np.reshape(data, data.shape[0] * data.shape[1])
    reshaped_labels = np.reshape(labels, (labels.shape[0] * labels.shape[1], 1))

    _, new_labels, center = cv2.kmeans(data=reshaped_data,
                                       K=nclusters,
                                       bestLabels=reshaped_labels,
                                       criteria=criteria,
                                       attempts=10,
                                       flags=cv2.KMEANS_USE_INITIAL_LABELS,
                                       centers=centers)


if __name__ == "__main__":

    main()
0 голосов
/ 28 сентября 2018

Я прочитал документацию .Я не нашел возможность инициализировать центориды вектором.Существует два возможных способа установки начальных центроидов:

  • cv2.KMEANS_RANDOM_CENTERS: быстро, но метки будут отличаться друг от друга при каждой кластеризации
  • cv2.KMEANS_PP_CENTERS: дает одинаковые результаты для одного и того же вводано медленно

Вот пример запуска kmeans в python с использованием opencv.

import numpy as np
import cv2
from matplotlib import pyplot as plt

X = np.random.randint(25,50,(25,2))
Y = np.random.randint(60,85,(25,2))
Z = np.vstack((X,Y))

# convert to np.float32
Z = np.float32(Z)

# define criteria and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret,label,center=cv2.kmeans(Z,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

# Now separate the data, Note the flatten()
A = Z[label.ravel()==0]
B = Z[label.ravel()==1]

# Plot the data
plt.scatter(A[:,0],A[:,1])
plt.scatter(B[:,0],B[:,1],c = 'r')
plt.scatter(center[:,0],center[:,1],s = 80,c = 'y', marker = 's')
plt.xlabel('Height'),plt.ylabel('Weight')
plt.show()

Если вам нужно установить начальные центориды, вы можете использовать библиотеку sklearn.Документация здесь .

...