Comment réduire la dimensionnalité dans R

28

J'ai une matrice où a (i, j) me dit combien de fois j'ai consulté individuellement la page j. Il y a 27 000 personnes et 95 000 pages. J'aimerais avoir une poignée de "dimensions" ou "aspects" dans l'espace des pages qui correspondraient à des ensembles de pages qui sont souvent vues ensemble. Mon objectif ultime est de pouvoir ensuite calculer la fréquence à laquelle chaque personne a consulté des pages qui tombent dans la dimension 1, la dimension 2, etc.

J'ai lu la documentation R sur l' analyse des composants principaux et la décomposition d'une valeur unique et j'ai exécuté ces commandes, mais je ne sais pas comment procéder.

Comment puis-je utiliser la réduction de dimensionnalité pour ce faire? Ou est-ce vraiment un problème de clustering et je devrais plutôt étudier les algorithmes de clustering?

Merci beaucoup pour tout aperçu ~ l

laramichaels
la source

Réponses:

10

Supposons que mat_pages [] contient des pages dans les colonnes (que vous souhaitez regrouper) et des individus dans les lignes. Vous pouvez regrouper des pages en fonction de données individuelles dans Rby à l'aide de la commande suivante:

  pc <- prcomp(x=mat_pages,center=TRUE,scale=TRUE)

La matrice des chargements est la matrice des vecteurs propres de la décomposition SVD des données. Ils donnent le poids relatif de chaque PAGE dans le calcul des scores. Les charges avec des valeurs absolues plus grandes ont plus d'influence dans la détermination du score de la composante principale correspondante.

Cependant, je dois également souligner la courte venue de l'utilisation de PCA pour regrouper les pages. La raison en est que les chargements donnent des poids plus importants aux PAGES avec une variation plus élevée, indépendamment du fait que cette variation soit en fait à cause du contenu de la PAGE ou d'une autre raison (peut être une variation technique ou individuelle). Les chargements ne reflètent pas nécessairement les vraies différences entre les groupes, ce qui (peut-être) votre principal intérêt. MAIS, ce regroupement reflète vraiment les différences dans le groupe sous l'hypothèse que toutes les pages ont la même variance (je ne sais pas si c'est une hypothèse valide).

Si vous disposez d'une puissante infrastructure informatique (ce qui peut être possible compte tenu de la taille de vos données), l'utilisation de modèles hiérarchiques peut être une bonne idée. Dans R, cela peut être fait en utilisant le package lme4.


Que faire après avoir obtenu les scores?

Il s'agit d'une suggestion grossière et l'analyse dépend grandement de l'apparence des données. En outre, je suppose que ce processus serait hautement irréalisable pour regrouper les données de magnitude dont vous disposez.

pc.col <- paste("page", 1:27000, sep=".")

pdf("principle-components.pdf")
plot(pc$x[,1:2]) ## Just look at the 1st two loadings (as you can see the groupings in a plane)
dev.off()

J'espère que cela peut vous donner une image de la façon dont les données sont regroupées.

Attention: ce n'est pas ce que je recommanderais.


Ma recommandation:

Des problèmes comme ceux-ci surviennent fréquemment en génomique. Dans votre cas, les pages correspondent aux gènes et les individus aux patients (fondamentalement, les individus ont la même signification qu'en génomique)

Vous souhaitez regrouper les pages en fonction des données.

Vous pouvez utiliser un grand nombre de packages de clustering dans R et ont été indiqués dans d'autres réponses. Un problème fondamental avec les packages est comme hclust est de savoir comment déterminer le nombre de clusters. Certains de mes préférés sont:

  • pvclust (vous donne des clusters et donne également une valeur p pour chaque cluster. En utilisant la valeur p, vous pouvez déterminer les clusters statistiquement significatifs. Problème : nécessite beaucoup de puissance de calcul et je ne suis pas sûr si cela fonctionnera avec les données de votre Taille)
  • hopach (vous donne le nombre estimé de clusters et les clusters)
  • il existe d'autres packages disponibles dans Bioconductor, veuillez les consulter dans la vue des tâches.

Vous pouvez également utiliser des algos de clustering comme k-means etc. Je suis sûr d'avoir vu un fil dans ce forum sur le clustering. Les réponses étaient très détaillées. Tal Galili m'a demandé si je me souviens bien.

suncoolsu
la source
@suncoolsu: merci beaucoup! Je viens de suivre vos conseils et de lancer prcomp. J'ai également stocké la matrice de charges qu'il a produite. Mais comment utiliser cette matrice pour regrouper les pages?
laramichaels du
Bonjour Laramichaels, veuillez trouver ma réponse ci-dessous.
suncoolsu
@suncoolsu: Je fais face à un problème similaire, mais je veux "regrouper" les individus qui ont la même "dynamique" (en fait, j'ai un grand nombre de séries temporelles par régions et je veux les modéliser). Je pensais utiliser pam avec la distance de corrélation (1-rho). Est-ce une façon recommandée? Pourriez-vous s'il vous plaît suggérer quelques pistes à explorer?
teucer
@Musa .. Pouvez-vous être un peu plus clair. Je ne pense pas comprendre la "dynamique" que vous avez mentionnée. Certainement pam est OK pour le clustering. Mais vous pouvez également essayer les packages R pvclust et hopach comme mentionné par moi. De plus, les cartes SOM (cartes auto-organisées) sont une manière différente de considérer le clustering. Veuillez consulter le livre de Ripley et Venable (2002) - MASS pour plus de détails. Le livre propose un traitement approfondi du clustering.
suncoolsu
@suncoolsu: Désolé pour la mauvaise formulation! J'ai 200 séries temporelles que je veux modéliser (c'est-à-dire simuler). Je pense que je peux regrouper des séries temporelles "similaires" (c'est-à-dire avoir le même comportement dans le temps: l'approche directe consiste à utiliser la corrélation) et simuler uniquement les séries temporelles de cluster ...
teucer
4

C'est certainement un problème de clustering. Consultez le clusterpackage Rs pour obtenir un aperçu des options d'algorithme ( pamet ce agnessont les meilleures options pour commencer; elles représentent deux flux principaux dans le clustering - centroïdes et hiérarchiques ).
Le principal problème pour utiliser le clustering sur vos données est de définir une bonne mesure de similitude entre les pages; la plus simple consiste à utiliser la distance de Manhattan; un peu plus complexe pour compter le nombre de téléspectateurs communs et le normaliser avec, disons, la moyenne du nombre de téléspectateurs de la première et de la deuxième page - cela devrait réduire les effets de popularité.

EDIT: Ok, maintenant j'ai vu la taille des données ... cela fera probablement exploser R, car il a besoin d'un triangle de matrice pour stocker les distances. Consultez ce rapport pour des solutions possibles.(nombre de pages)×(nombre de pages)

jan-glx
la source
J'ai voté pour votre réponse. Pourriez-vous cependant fournir les nouveaux liens pour le rapport dans la dernière phrase. L'ancien est mort.
discipulus
1
Je crains que cela ne soit perdu pour toujours ... Généralement, il s'agissait d'implémentations de méthodes de clustering qui ne construisent pas explicitement une matrice de similarité entre elles mais enquêtent sur les objets à la demande.
1

La réduction de dimensionnalité consiste essentiellement à appliquer un algorithme de clustering aux attributs (colonnes). En raison de la assez grande dimensionnalité de votre ensemble de données, vous pouvez essayer d'utiliser SOM (carte auto-organisée / filet Kohonen) pour créer une carte pour des individus ou des pages. Vous pouvez alors voir si les motifs sont significatifs (interprétables).


la source
1

Si vous faites de l'ACP, mon conseil serait de sélectionner brièvement d'autres composants que les deux premiers. Une fois que vous avez l' prcompobjet pc(voir l'article de suncoolsu), vous pouvez plot(pc)voir la quantité de variance attribuée aux différents composants principaux. Vous pouvez également visualiser facilement plusieurs ( en général trois ou quatre) d'entre eux avec pairs(pc$x[,1:3])ou, en utilisant lattice, splom(pc$x[,1:3]).

Laurent
la source