0

Я использую Scikit-learn для кластеризации тела твитов (только текст) о #oscars.Как изменить вес функции для кластеризации K-Means?

Было бы очень полезно, если бы имя пользователя, такое как @LeonardoDiCaprio или хэштегов, как #redcarpet, можно считать более значимым в препросах.

Я хотел бы знать, можно ли добавить больше веса к общим именам пользователей и хэштегам для более важных функций.

+0

Когда вы говорите, добавляя вес, как вы это понимаете? k-mean использует вычисление расстояния, чтобы попытаться выяснить, как «похоже» все функции двух экземпляров. Вы говорите, что хотите, чтобы «близость» переполняла появление определенных слов? И наоборот, означает ли это, что вы хотите, чтобы они перегружали «расстояние» между твитами, если у них есть эти слова, а другие нет? Кроме того, ваши данные нормализованы каким-то образом? – flyingmeatball

+0

@flyingmeatball, например, я хочу взять как функцию «@sasha», потому что это общее слово в корпусе (появляется более чем в 30% твитов) и потому, что это имя пользователя (это токен, начинающийся с «@»,). Но кроме того, я не хочу пропускать функции, которые не являются именами пользователей. Конвейер для моих данных - CountVectorizer -> K-Means – fuxes

+0

Мне довелось столкнуться с чем-то подобным с SGDClassifier. Он имеет параметр sample_weight, заданный его методу подгонки. Возможно, K-означает что-то подобное. Взгляните: http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_weighted_samples.html#example-linear-model-plot-sgd-weighted-samples-py – Shovalt

ответ

5

K-средства хорошо определены только для евклидовых пространств, где расстояние между вектором А и В выражается в

|| A - B || = sqrt(SUM_i (A_i - B_i)^2) 

, таким образом, если вы хотите, чтобы «вес» особенность, вы хотели бы что-то вроде

|| A - B ||_W = sqrt(SUM_i w_i(A_i - B_i)^2) 

, что приведет к тому, что функция i станет гораздо более важной (если w_i> 1) - таким образом, вы получите более крупный штраф за разное значение (в сумме слов/набора слов), это просто означает, что если два документа имеют разное количество этого конкретного слова, они предполагают чтобы быть намного больше, чем те, которые отличаются от другого набора слов).

Итак, как вы можете обеспечить его соблюдение? Ну, основные математики - это все, что вам нужно! Вы можете легко увидеть, что

|| A - B ||_W = || sqrt(W)*A - sqrt(W)*B || 

других слова - вы берете свою tfidf трансформатор (или что вы используете для отображения текста на постоянный вектор размера), проверьте, какие функции отвечают за слова, которые вы заинтересованы, вы создайте вектор из них (с размером, равным количеству измерений) и увеличьте значения для слов, о которых вы заботитесь (например, 10x), и возьмите квадратный корень из этой вещи. Затем вы просто предварительно обрабатываете все свои данные, умножая «точную» на широковещательную передачу (np.multiply) этим весовым вектором. Это все, что вам нужно, теперь ваши слова будут более важными в этой четко определенной форме. С математической точки зрения это вводит расстояние Махаланобиса вместо евклидова, при этом ковариационная матрица равна w * I (таким образом - диагональный гауссовский используется как генератор вашей нормы).

+0

хорошо сказано - @fuxes может потребоваться пробная версия и ошибка, чтобы выяснить, какую ценность использовать для умножения «ценных» условий. Как правило, у вас будет определенная степень того, более или менее точна ли ваша модель с различными обновлениями веса, и вы можете сравнить свою общую производительность с набором тестов. – flyingmeatball