Есть ли способ использовать найденные последовательные шаблоны в качестве входных данных для алгоритма кластеризации?

Я делаю проект по категоризации пользователей на основе их моделей серфинга на сайте.

Для этого мне нужно найти шаблоны в данных, а затем сгруппировать их, но кластеризация представляет собой проблему, поскольку испробованные мной алгоритмы кластеризации (k-means, агломеративный и DBSCAN) не позволяют использовать списки в качестве входных данных.

У меня есть списки с посещенными страницами, разделенными сеансом.

Пример:

data = [[1, 2, 5],
        [2, 4],
        [2, 3],
        [1, 2, 4],
        [1, 3],
        [2, 3],
        [1, 3],
        [7, 8, 9],
        [9, 8, 7],
        [1, 2, 3, 5],
        [1, 2, 3]]

Каждый список представляет сеанс с посещенными страницами. Каждое число представляет собой часть URL-адреса.

Пример:

1 = '/home'
2 = '/blog'
3 = '/about-us'
...

Я пропускаю данные через скрипт интеллектуального анализа шаблонов.

Код:

import pyfpgrowth # pip install pyfpgrowth

data = [[1, 2, 5],
        [2, 4],
        [2, 3],
        [1, 2, 4],
        [1, 3],
        [2, 3],
        [1, 3],
        [7, 8, 9],
        [9, 8, 7],
        [1, 2, 3, 5],
        [1, 2, 3]]

patterns = pyfpgrowth.find_frequent_patterns(data, 2)
print(patterns)

rules = pyfpgrowth.generate_association_rules(patterns, 0.7)
print(rules)

Результат:

# print(patterns)

{(1,): 6,
 (1, 2): 4,
 (1, 2, 3): 2,
 (1, 2, 5): 2,
 (1, 3): 4,
 (1, 5): 2,
 (2,): 7,
 (2, 3): 4,
 (2, 4): 2,
 (2, 5): 2,
 (4,): 2,
 (5,): 2,
 (7,): 2,
 (8,): 2,
 (9,): 2}

# print(rules)

{(1, 5): ((2,), 1.0),
 (2, 5): ((1,), 1.0),
 (4,): ((2,), 1.0),
 (5,): ((1, 2), 1.0)}

Согласно документу, следующим шагом будет использование найденных шаблонов. в качестве входных данных для алгоритма кластеризации (стр. 118, глава 4.3), но, насколько мне известно, алгоритмы кластеризации не принимают списки (с переменной длиной) в качестве входных данных.

Я пробовал это, но это не сработало.

Код:

from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=4, random_state=0).fit(patterns)

test = [1, 8, 2]

print(kmeans.predict(test))

Что мне нужно сделать, чтобы алгоритм k-means мог предсказать группу, к которой принадлежит шаблон серфинга, или есть другой алгоритм, который больше подходит для этого?

Заранее спасибо!


person Ben Blanc    schedule 07.05.2019    source источник


Ответы (1)


И HAC, и DBSCAN можно использовать со списками.

Вам просто нужно вычислить матрицу расстояний самостоятельно, потому что вы, очевидно, не можете использовать евклидово расстояние для этих данных. Вместо. Например, можно рассмотреть Жаккара.

K-средние не могут быть использованы. Ему нужны непрерывные данные в R^d.

person Has QUIT--Anony-Mousse    schedule 07.05.2019
comment
Спасибо за ответ, я попробую это. - person Ben Blanc; 08.05.2019
comment
Я пробовал как Hyrarchical Agglomerative clustering, так и DBSCAN. Не принимают списки в виде приведенного выше примера. Можете ли вы предложить поместить данные в правильный формат для использования в упомянутых выше методах кластеризации? - person Ben Blanc; 08.05.2019
comment
Как я уже писал, вам нужно составить матрицу подобия и предоставить ее в качестве входных данных для HAC или DBSCAN. Например, вычислите матрицу коэффициентов Жаккара. - person Has QUIT--Anony-Mousse; 08.05.2019
comment
Я сделал матрицу подобия, передал ее упомянутым моделям кластеризации, и это сработало! Я также попробовал это с матрицей евклидова расстояния, которая также работала. Была ли причина, по которой вы думали, что евклидово расстояние не сработает? Возможно, второй вопрос: как алгоритм кластеризации узнает, как кластеризоваться на основе этой матрицы? Это совсем не похоже на мой исходный набор данных. У вас есть предложения по тестированию, правильно ли он кластеризуется? - person Ben Blanc; 10.05.2019
comment
Как вы создали матрицу евклидовых расстояний? Это расстояние определено на R ^ p, и я не понимаю, как ваши данные могут быть таким векторным пространством. - person Has QUIT--Anony-Mousse; 11.05.2019
comment
Я создал фрейм данных со столбцами, которые представляют собой шаблоны, найденные с помощью PrefixSpan в моих данных, и для каждой строки (сеанса) 1 и 0, если столбец является подпоследовательностью текущего сеанса. Я использовал этот кадр данных для вычисления матрицы расстояний способом жаккарда, а также для евклидова способа. - person Ben Blanc; 13.05.2019
comment
импортировать панды как pd из scipy.spatial.distance импортировать евклидово, pdist, квадратную форму определения сходства_func (u, v): вернуть 1/(1 + евклидово (u, v)) dists = pdist (df_data, Similarity_func) df_euclid = pd.DataFrame (квадратная форма (расстояния), столбцы = df_data.index, индекс = df_data.index) печать (df_euclid) - person Ben Blanc; 13.05.2019
comment
Предыдущий комментарий — это код, используемый для вычисления матрицы расстояний евклидовым способом. Я получил это из этого сообщения: stackoverflow.com/questions/35758612/ - person Ben Blanc; 13.05.2019
comment
Этот подход, который вы выбрали, добавляет очень странную предвзятость, основанную на шаблонах, найденных prefixspan. Я тоже не сторонник фиктивного кодирования. Я бы предпочел использовать настоящего Жаккара на съемках. Обычно лучше использовать что-то объяснимое. - person Has QUIT--Anony-Mousse; 13.05.2019
comment
Что вы имеете в виду, когда говорите, что лучше использовать настоящего Жаккара на съемках? Причина, по которой я делаю это так, как описано ранее, заключается в том, что я получаю ошибки, говорящие о том, что модель кластеризации не принимает ввод, где столбцы не такие длинные, как строки. Кластеризация на основе матрицы жаккарда моего фрейма данных с частыми шаблонами в качестве функций не удалась. Я установил его на 10 кластеров, но все, казалось, принадлежало кластеру 0. Кластеризация на основе евклидовой матрицы моего фрейма данных с частыми шаблонами в качестве функций прошла хорошо. 10 кластеров, и данные были сгруппированы в 10 групп. - person Ben Blanc; 14.05.2019
comment
Используя метод k-средних, легко получить плохой результат... Убедитесь, что все параметры заданы правильно. Если у вас есть правильная матрица расстояний, она будет A) иметь одинаковую длину, поэтому ошибка не может возникнуть и B) она по определению все равно является квадратной матрицей, и когда она настроена на использование расстояния, а не (!) матрицы данных, он должен проверить, что он квадратный. - person Has QUIT--Anony-Mousse; 14.05.2019
comment
Кластеризация, которую я имел в виду в своем предыдущем комментарии, была иерархической агломерационной кластеризацией (также пробовал ее на DBSCAN). Ни один из них не дал хороших результатов с жаккардом, но с евклидом, похоже, все хорошо. - person Ben Blanc; 15.05.2019