базовая кластеризация с r

Я новичок в R и анализе данных. Я пытаюсь создать простую пользовательскую систему рекомендаций для веб-сайта. Итак, в качестве входной информации у меня есть user/session-id,item-id,item-price, на которые нажимали пользователи.

c165c2ee-81cf-48cf-ba3f-83b70204c00c    161785  124.0
a886fdd5-7cee-4152-b1b7-77a2702687b0    643339  42.0
5e5fd670-b104-445b-a36d-b3798cd43279    131332  38.0
888d736f-99bc-49ca-969d-057e7d4bb8d1    1032763 39.0

Я хотел бы применить кластерный анализ к этим данным.

Если я попытаюсь применить кластеризацию k-средних к своим данным:

> q <- kmeans(dat, centers=25)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning message:
In kmeans(dat, centers = 25) : NAs introduced by coercion

Если я попытаюсь применить иерархическую кластеризацию к данным:

> m <- as.matrix(dat)
> d <- dist(m)   # find distance matrix
Warning message:
In dist(m) : NAs introduced by coercion

Кажется, что «NA, введенные принуждением», происходят, поскольку первый столбец не является числом. Итак, я попытался запустить код против dat[-1], но результат тот же.

Что я упускаю или делаю неправильно?

Заранее большое спасибо.

=== ОБНОВЛЕНИЕ №1 ===

Вывод по ул и фактору:

> str(dat)
'data.frame':   14634 obs. of  3 variables:
 $ V3 : Factor w/ 10062 levels "000880bf-6cb7-4c4a-9a9d-1c0a975b52ba",..: 7548 6585 3670 5336 9181 6429 62 410 7386 9409 ...
 $ V8 : Factor w/ 5561 levels "1000120","1000910",..: 835 3996 443 65 1289 2084 582 695 3666 4787 ...
 $ V12: Factor w/ 395 levels "100.0","101.0",..: 25 278 249 256 352 249 1 88 361 1 ...

> dat[,1] = factor(dat[,1])
> str(dat)
'data.frame':   14634 obs. of  3 variables:
 $ V3 : Factor w/ 10062 levels "000880bf-6cb7-4c4a-9a9d-1c0a975b52ba",..: 7548 6585 3670 5336 9181 6429 62 410 7386 9409 ...
 $ V8 : Factor w/ 5561 levels "1000120","1000910",..: 835 3996 443 65 1289 2084 582 695 3666 4787 ...
 $ V12: Factor w/ 395 levels "100.0","101.0",..: 25 278 249 256 352 249 1 88 361 1 ...

> dd <- dist(dat)
Warning message:
In dist(dat) : NAs introduced by coercion
> hc <- hclust(dd)                # apply hirarchical clustering
Error in hclust(dd) : NA/NaN/Inf in foreign function call (arg 11)

=== ОБНОВЛЕНИЕ #2 ===

Я не хотел бы удалять первый столбец, так как может быть несколько кликов для одного и того же пользователя, что я считаю важным для анализа.


person kikulikov    schedule 21.04.2014    source источник
comment
Можете ли вы сделать str(dat), чтобы другие столбцы были числами? Оба dist() и kmeans() возвращают ошибку о ваших числовых значениях.   -  person ilir    schedule 21.04.2014


Ответы (4)


Похоже, вы хотите сохранить первый столбец (хотя 10 062 уровня для 14 634 наблюдений — это довольно много). Способ преобразования коэффициента в числовое значение — функция model.matrix. Перед преобразованием коэффициента:

data(iris)
head(iris)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

После model.matrix:

head(model.matrix(~.+0, data=iris))
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Speciessetosa Speciesversicolor Speciesvirginica
# 1          5.1         3.5          1.4         0.2             1                 0                0
# 2          4.9         3.0          1.4         0.2             1                 0                0
# 3          4.7         3.2          1.3         0.2             1                 0                0
# 4          4.6         3.1          1.5         0.2             1                 0                0
# 5          5.0         3.6          1.4         0.2             1                 0                0
# 6          5.4         3.9          1.7         0.4             1                 0                0

Как видите, он расширяет ваши значения фактора. Таким образом, вы можете запустить кластеризацию k-средних для расширенной версии ваших данных:

kmeans(model.matrix(~.+0, data=iris), centers=3)
# K-means clustering with 3 clusters of sizes 49, 50, 51
# 
# Cluster means:
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Speciessetosa Speciesversicolor Speciesvirginica
# 1     6.622449    2.983673     5.573469    2.032653             0         0.0000000       1.00000000
# 2     5.006000    3.428000     1.462000    0.246000             1         0.0000000       0.00000000
# 3     5.915686    2.764706     4.264706    1.333333             0         0.9803922       0.01960784
# ...
person josliber♦    schedule 21.04.2014
comment
Благодарю. Не могли бы вы объяснить, что делает ~.+0? Я понимаю результат этого. Я имею в виду, что означает каждый символ в этой операции. - person kikulikov; 22.04.2014
comment
Если бы вы использовали lm для выполнения регрессии и использовали формулу y~.+0, вы бы предсказали y, используя все остальные переменные, без члена пересечения (. означает все другие переменные, а +0 означает отсутствие пересечения). Мы хотим отформатировать наш фрейм данных, используя все переменные, но без термина перехвата, поэтому мы просто опускаем y и получаем ~.+0. - person josliber♦; 22.04.2014

Попробуйте dat[,1] = factor(dat[,1]). Я думаю, что NA из идентификатора сеанса (первый столбец), который не является числом. factor заставит индексировать идентификатор сеанса.

person xosp7tom    schedule 21.04.2014
comment
Я бы вообще удалил столбец, так как он не несет полезной информации для кластеризации в этом формате (и, вероятно, имеет слишком много уровней). - person ilir; 21.04.2014
comment
Я согласен с информацией только из этой переменной, поскольку индексированное число из фактора будет просто случайным числом. Однако, наряду с другими переменными, этот индекс может быть полезен. Например, может быть несколько кликов от одного пользователя. Так что я бы оставил это как его работу. - person xosp7tom; 21.04.2014
comment
@xosp7tom спасибо. Да, я не хотел бы удалять первый столбец по той причине, которую вы упомянули. К сожалению, это не помогло. Я добавил вывод R к своему исходному вопросу. - person kikulikov; 22.04.2014

k-mean работает только для непрерывных данных.

У вас есть два столбца id, которые нельзя использовать для кластеризации; они сделают ваш результат бессмысленным.

Но даже тогда я сомневаюсь, что алгоритм k-средних подходит для решения вашей задачи. Сначала вам нужно понять свои данные, затем предварительно обработать и преобразовать их в соответствующее представление.

Не ждите решения с помощью кнопки. Таких нет/работает.

person Has QUIT--Anony-Mousse    schedule 22.04.2014

Не используйте столбец SPECIE

km‹- kmeans(радужная оболочка[,1:4],3)

km

Кластеризация K-средних с 3 кластерами размеров 50, 38, 62

Кластер означает:

  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     6.850000    3.073684     5.742105    2.071053
3     5.901613    2.748387     4.393548    1.433871

Вектор кластеризации:

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3
[59] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2 2 2 3 3 2
[117] 2 2 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2 2 3

Внутри кластера сумма квадратов по кластеру:

[1] 15.15100 23.87947 39.82097

(между_СС / всего_СС = 88,4 %)

person Mamen    schedule 17.04.2016
comment
в столбце нет видов!! - person MLavoie; 17.04.2016