Модель гауссовой смеси (GMM) дает результаты, не связанные с данными обучения

#python #machine-learning #scikit-learn #statistics #gaussian

Вопрос:

слева: точки входа и выхода, GMM с 2 компонентами, GMM с 3 компонентами

Как вы видите на изображении, кластеризация, по-видимому, вообще не связана с предоставленными данными. У меня есть 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 класса, потому что это, очевидно, не супер дискретное разделение классов. Таким образом, кластеры не могут быть четко обозначены как один класс, потому что нет такого четкого разделения данных.