2016-05-29 4 views
0

Я работаю с векторами словесных частот и проверял некоторые из различных мер измерения, доступных в Scikit Learns Pairwise Distances. Я бы хотел использовать эти расстояния для кластеризации и классификации.Оценка мер измерения расстояния

Обычно у меня есть матрица характеристик ~ 30 000 x 100. Моя идея заключалась в том, чтобы выбрать метрику расстояния, которая максимизирует попарные расстояния, пробегая попарные различия по одному и тому же набору данных с метриками расстояния available in Scipy (например, Евклида, Городблока и т. Д.) и для каждой метрики

  • преобразования расстояний, вычисленных для набора данных для zscores нормализации показателей по

  • получить диапазон этих zscores, т.е. распространение расстояний

  • используйте метрику расстояния, которая дает мне самый широкий диапазон расстояний, поскольку она, по-видимому, дает мне максимальное распространение по моему набору данных и большую дисперсию для работы. (См код ниже)

Мои вопросы:

  • делают ли такой подход имеет смысл?

  • Существуют ли другие процедуры оценки, которые следует попробовать? Я нашел эти документы (Gavin, Aggarwal, но они не применяются 100% здесь ...)

Любая помощь очень ценится!

Мой код:

matrix=np.random.uniform(0, .1, size=(10,300)) #test data set 

scipy_distances=['euclidean', 'minkowski', ...] #these are the distance metrics 

for d in scipy_distances: #iterate over distances 
    distmatrix=sklearn.metrics.pairwise.pairwise_distances(matrix, metric=d) 
    distzscores = scipy.stats.mstats.zscore(distmatrix, axis=0, ddof=1) 
    diststats=basicstatsmaker(distzscores) 
    range=np.ptp(distzscores, axis=0) 
    print "range of metric", d, np.ptp(range) 
+2

Этот подход будет или не будет иметь смысла в зависимости от того, чего вы пытаетесь достичь.Этот набор функций может работать лучше, чем другие, с набором алгоритмов классификации/кластеризации. Хотя другие функции могут хорошо работать с другими алгоритмами. Вам нужно иметь конечную метрику, которую вы пытаетесь оптимизировать, и на основе этого вы можете выбрать наиболее подходящие функции. Эта метрика конца - это то, как вы будете оценивать свои функции и алгоритмы. – saq7

ответ

1

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

class Dummy_dist: 

    def __init__(self): 
    self.cheat = True 

    def __call__(self, x, y): 
    if self.cheat: 
     self.cheat = False 
     return 1e60 
    else: 
     return 0 

dummy_dist = Dummy_dist() 

Это даст вам huuuuge распространение (даже с нормализацией z-балла). Конечно, это пример обмана, поскольку это не детерминированно, но я хотел показать основной контрпример, и, конечно, учитывая ваши данные, можно построить детерминированный аналог.

Итак, что вы должны делать? Ваша метрика должна рассматриваться как гиперпараметр вашего процесса. Вы не должны делить процесс создания кластеризации/классификации на две отдельные фазы: выбор расстояния, а затем изучение чего-то; но вы должны сделать это совместно, рассмотрите парку кластеризации/классификации + расстояния как единую модель, поэтому вместо работы с k-средствами вы будете работать с k-средствами + эвклидовыми, k -средствами + minkowsky и т. д. Это единственный подход, основанный на статистической поддержке. Вы не можете создать метод оценки «общей доброты» метрики, так как такого объекта нет, качество метрики может оцениваться только в конкретной задаче, которая включает в себя фиксацию каждого другого элемента (например, метод кластеризации/классификации, конкретный набор данных и т.д.). После того, как вы выполните такую ​​обширную исчерпывающую оценку, проверьте многие такие пары, на многих наборах данных вы можете утверждать, что данная метрика лучше всего работает в таком диапазоне задач.