У меня есть набор данных, состоящий из ~ 200 массивов частот 99x20, где сумма каждого столбца равна единице. Я построил их с помощью тепловых карт, например . Каждый массив довольно разрежен, только около 1-7 / 20 значений на 99 позиций отличны от нуля.
Однако я хотел бы сгруппировать эти выборки с точки зрения того, насколько похожи их частотные профили (минимальное евклидово расстояние или что-то в этом роде). Я организовал каждый массив 99x20 в массив 1980x1 и собрал их в массив наблюдения 200x1980.
Прежде чем найти кластеры, я попробовал отбелить данные с помощью scipy.cluster.vq.whiten
. whiten
нормализует каждый столбец по его дисперсии, но из-за того, как я выровнял свои массивы данных, у меня есть несколько (8) столбцов со всеми нулевыми частотами, поэтому дисперсия равна нулю. Следовательно, белый массив имеет бесконечные значения, и определение центроида не выполняется (или дает ~ 200 центроидов).
Мой вопрос: как мне решить эту проблему? Пока я пробовал
- Не отбеливайте данные. Это приводит к тому, что k-means при каждом запуске дает разные центроиды (что несколько ожидаемо), несмотря на значительное увеличение ключевого слова
iter
. - Транспонирование массивов перед их выравниванием. Столбцы с нулевой дисперсией просто сдвигаются.
Можно ли просто удалить некоторые из этих столбцов с нулевой дисперсией? Может ли это каким-либо образом повлиять на кластеризацию?
РЕДАКТИРОВАТЬ: Я также пробовал использовать свою собственную функцию отбеливания, которая просто делает
for i in range(arr.shape[1]):
if np.abs(arr[:,i].std()) < 1e-8: continue
arr[:,i] /= arr[:,i].std()
Кажется, это работает, но я не уверен, что это каким-либо образом влияет на кластеризацию.
Спасибо
if arr[:,i].std() == 0
должно бытьif abs(arr[:,i].std()) < epsilon
, где эпсилон - очень маленькое значение, например 0,0000001. В противном случае вы можете получить ошибки округления, из-за которых 0 значение с плавающей запятой будет отображаться как ненулевое. Для данной проблемы это всегда может работать нормально, но в целом описанный выше способ является лучшим способом выполнения плавающих проверок «равенства». - person Pyrce   schedule 21.03.2013