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 (таким образом - диагональный гауссовский используется как генератор вашей нормы).
Когда вы говорите, добавляя вес, как вы это понимаете? k-mean использует вычисление расстояния, чтобы попытаться выяснить, как «похоже» все функции двух экземпляров. Вы говорите, что хотите, чтобы «близость» переполняла появление определенных слов? И наоборот, означает ли это, что вы хотите, чтобы они перегружали «расстояние» между твитами, если у них есть эти слова, а другие нет? Кроме того, ваши данные нормализованы каким-то образом? – flyingmeatball
@flyingmeatball, например, я хочу взять как функцию «@sasha», потому что это общее слово в корпусе (появляется более чем в 30% твитов) и потому, что это имя пользователя (это токен, начинающийся с «@»,). Но кроме того, я не хочу пропускать функции, которые не являются именами пользователей. Конвейер для моих данных - CountVectorizer -> K-Means – fuxes
Мне довелось столкнуться с чем-то подобным с 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