Выборка точек данных из модели гауссовой смеси python

#python #scikit-learn #data-science #gaussian #mixture-model

#python #scikit-learn #наука о данных #гауссовский #модель смеси

Вопрос:

Я действительно новичок в python и GMM. Недавно я изучил GMM и пытаюсь реализовать коды из здесь

Я столкнулся с некоторыми проблемами при запуске метода gmm.sample():

 gmm16 = GaussianMixture(n_components=16, covariance_type='full', random_state=0)    
Xnew = gmm16.sample(400,random_state=42)
plt.scatter(Xnew[:, 0], Xnew[:, 1])
  

ошибка показывает:

 TypeError: sample() got an unexpected keyword argument 'random_state'
  

Я проверил последний документ и выяснил, что метод sample должен содержать только n, что указывает на количество выборок для генерации. Но когда я удаляю ‘random_state = 42’, появляется новая ошибка:

коды:

 Xnew = gmm16.sample(400)
plt.scatter(Xnew[:, 0], Xnew[:, 1])
  

ошибка:

 TypeError: tuple indices must be integers or slices, not tuple
  

Кто-нибудь сталкивался с этой проблемой при реализации кодов от Джейка Вандерпласа? Как я мог это исправить?

Мой Jupyter:

Версия сервера notebook: 5.7.4

Python 3.7.1 (по умолчанию, 14 декабря 2018, 13:28:58)

Введите «авторское право», «кредиты» или «лицензия» для получения дополнительной информации

IPython 7.2.0 — улучшенный интерактивный Python. Введите ‘?’ для получения справки.

Ответ №1:

Вы получаете, TypeError потому что sample метод возвращает tuple , смотрите здесь.

Это должно выполнить свою работу:

 Xnew, Ynew = gmm16.sample(400)  # if Ynew is valuable
plt.scatter(Xnew[:, 0], Xnew[:, 1])
  

или

 Xnew, _ = gmm16.sample(400)  # if Ynew isn't valuable
plt.scatter(Xnew[:, 0], Xnew[:, 1])
  

Ответ №2:

Ваша проблема заключается в том, как вы загружаете данные на точечный график. В частности, у вас есть массив numpy внутри кортежа, и способ индексации неверен. Попробуйте это.

 plt.scatter(Xnew[0][:,0], Xnew[0][:,1])
  

По сути, мы имеем то, что первая индексация Xnew[0] будет указывать на элемент в нужном вам кортеже (массив numpy), а вторая будет нарезать его так, как вам нужно. [:,1] Здесь мы берем все строки и второй столбец.