#python #machine-learning #scikit-learn #statistics #gaussian
Вопрос:
Как вы видите на изображении, кластеризация, по-видимому, вообще не связана с предоставленными данными. У меня есть 34 точки данных. В чем может быть причина этого?
установка K GMM с различными компонентами:
def calculate_zones(self): mini_data = [] for id, enter_x, enter_y, enter_time, exit_x, exit_y, exit_time in self.data: mini_data.append([enter_x, enter_y]) mini_data.append([exit_x, exit_y]) K = range(2, 4) for k in K: # Set the model and its parameters self.gms.append( GaussianMixture(n_components=k, n_init=20, covariance_type='spherical', init_params='kmeans').fit( mini_data))
маскировка изображения на основе результатов GMM:
def display_zones(self): video = cv2.VideoCapture(self.video_path) if not video.isOpened(): print("Cannot open stream") exit() _, frame = video.read() mask = [] colors = random_color(11) for model in self.gms: curr_mask = np.zeros_like(frame) mask.append(curr_mask) row_index = 0 for pixel_row in frame: column_index = 0 for _ in pixel_row: prediction = model.predict_proba([[row_index, column_index]]) best_proba = 0 counter = 0 for one_prediction in prediction[0]: if one_prediction gt; prediction[0][best_proba]: best_proba = counter counter = 1 curr_mask[row_index][column_index] = colors[best_proba] column_index = 1 row_index = 1
Ответ №1:
Прежде всего, вы должны соответствовать одному GMM на класс. GM-это неконтролируемый вероятностный алгоритм, поэтому вы не можете предоставить .fit()
функции несколько классов и ожидать, что она будет различать классы изначально (если ваша цель не состоит в том, чтобы сопоставить области вместе, тогда этот подход подойдет).
Во-вторых, вы тренируете свою модель, используя данные, отформатированные как:
mini_data = [] for id, enter_x, enter_y, enter_time, exit_x, exit_y, exit_time in self.data: mini_data.append([enter_x, enter_y]) mini_data.append([exit_x, exit_y])
Но затем получить прогнозы с помощью:
for _ in pixel_row: prediction = model.predict_proba([[row_index, column_index]])
Разве входные данные для вашей функции [[column_index, row_index]]
не должны соответствовать [x,y]
формату ваших данных о поездах?
Комментарии:
1. ваше второе замечание верно, я переключился между row_index и colum_index. Но что касается первого пункта, насколько я понимаю, GMM с BIC и EM, вместе они могут оценить количество классов и сгруппировать их, я строю средние значения и ковариацию, и результаты выглядят довольно хорошо. почему вы считаете, что у каждого класса должен быть один GMM? смысл неконтролируемого в том, что вы не знаете, сколько у вас занятий…
2. Да, именно так. Итак, если вы хотите выполнить кластеризацию и найти, к какому кластеру принадлежит точка данных (без присмотра), то это нормально, так как, надеюсь, каждый кластер должен в основном состоять из одного класса. Однако, если вы хотите охарактеризовать свои классы, вам необходимо разделить свои GMM по классам. Когда вы выполняете функцию predict_proba() для новых данных из каждого GMM, ваша наибольшая вероятность будет представлять правильный класс GMM.
3. Хорошо, я понимаю, в случае, если класс имеет несколько кластеров, я должен дать каждому классу GMM, но в моем случае у меня нет классов в этом смысле, я просто ищу кластеры. Не могли бы вы отредактировать свой ответ и объяснить, что класс может иметь несколько кластеров. Потому что поначалу это меня смущает.
4. тогда я могу принять ваш ответ 🙂
5. Все действительно зависит от ваших данных. Если вы сгруппируете рост и вес в зависимости от пола, то вы ожидаете, что будет корреляция между тем, что женщины ниже/легче, а мужчины наоборот. Однако будут кластеры, содержащие более 1 класса, потому что это, очевидно, не супер дискретное разделение классов. Таким образом, кластеры не могут быть четко обозначены как один класс, потому что нет такого четкого разделения данных.