So finden Sie Ähnlichkeiten zwischen verschiedenen Faktoren in einem Datensatz

8

Einführung

Angenommen, ich habe einen Datensatz mit unterschiedlichen Beobachtungen verschiedener Personen und möchte Personen zusammenfassen, um zu wissen, welche Person der anderen am nächsten ist. Ich möchte auch ein Maß dafür haben, wie nahe sie beieinander sind und welche statistische Signifikanz sie haben.

Daten

       eat_rate drink_rate   sleep_rate    play_rate  name   game
1  0.0542192259 0.13041721 5.013682e-03 1.023533e-06  Paul Rayman
4  0.0688171511 0.01050611 6.178833e-03 3.238838e-07  Paul  Mario
6  0.0928997660 0.01828468 9.321211e-03 3.525951e-07  Jenn  Mario
7  0.0001631273 0.02212345 7.061524e-05 1.531270e-07  Jean   FIFA
8  0.0028735509 0.05414688 1.341689e-03 4.533366e-07  Mark   FIFA
10 0.0034844717 0.09152440 4.589990e-04 5.802708e-07  Mark Rayman
11 0.0340738956 0.03384180 1.636508e-02 1.354973e-07  Mark   FIFA
12 0.0266112679 0.20002020 3.380704e-02 4.533366e-07  Mark  Sonic
14 0.0046597056 0.01848672 5.472681e-04 4.034696e-07  Paul   FIFA
15 0.0202715299 0.16365289 2.994086e-02 4.044770e-07 Lucas   SSBM

Reproduzieren Sie es:

structure(list(eat_rate = c(0.0542192259374624, 0.0688171511010916, 
0.0928997659570807, 0.000163127341146237, 0.00287355085557602, 
0.00348447171120939, 0.0340738956099744, 0.0266112679045701, 
0.00465970561072008, 0.0202715299408583), drink_rate = c(0.130417213859986, 
0.0105061117284574, 0.0182846752197192, 0.0221234468128094, 0.0541468835235882, 
0.0915243964036772, 0.0338418022022427, 0.200020204061016, 0.0184867158298818, 
0.163652894231741), sleep_rate = c(0.00501368170182717, 0.00617883308323771, 
0.00932121105128431, 7.06152352370024e-05, 0.00134168946950305, 
0.000458999029040516, 0.0163650807661753, 0.0338070438697149, 
0.000547268073086768, 0.029940859740489), play_rate = c(1.02353325645595e-06, 
3.23883801132467e-07, 3.52595117873603e-07, 1.53127022619393e-07, 
4.53336580123204e-07, 5.80270822557701e-07, 1.35497266725713e-07, 
4.53336580123204e-07, 4.03469556309652e-07, 4.04476970932148e-07
), name = structure(c(5L, 5L, 2L, 1L, 4L, 4L, 4L, 4L, 5L, 3L), .Label = c("Jean", 
"Jenn", "Lucas", "Mark", "Paul"), class = "factor"), game = structure(c(3L, 
2L, 2L, 1L, 1L, 3L, 1L, 4L, 1L, 5L), .Label = c("FIFA", "Mario", 
"Rayman", "Sonic", "SSBM"), class = "factor")), .Names = c("eat_rate", 
"drink_rate", "sleep_rate", "play_rate", "name", "game"), row.names = c(1L, 
4L, 6L, 7L, 8L, 10L, 11L, 12L, 14L, 15L), class = "data.frame")

Frage

Wie kann ich bei einem Datensatz als Fellow (mit fortlaufenden und kategorialen Merkmalen) feststellen, ob eine durch einen Namen identifizierte Person (eine kategoriale Antwort) stärker mit einer anderen Person korreliert?

zipp
quelle

Antworten:

6

Eine Möglichkeit besteht darin, Ihre quantitativen Werte (Spielen, Essen, Trinken, Schlafen) so zu normalisieren, dass sie alle den gleichen Bereich haben (z. B. 0 -> 1), und dann jedem Spiel eine eigene "Dimension" zuzuweisen, die den Wert 0 oder annimmt 1. Verwandeln Sie jede Zeile in einen Vektor und normalisieren Sie die Länge auf 1. Jetzt können Sie das innere Produkt der normalisierten Vektoren von zwei beliebigen Personen als Maß für die Ähnlichkeit vergleichen. So etwas wird im Text Mining ziemlich oft verwendet


R Code für Ähnlichkeitsmatrix

Angenommen, Sie haben Ihren Datenrahmen in der Variablen "D" gespeichert.

#Get normalization factors for quantitative measures
maxvect<-apply(D[,1:4],MARGIN=2,FUN=max)
minvect<-apply(D[,1:4],MARGIN=2,FUN=min)
rangevect<-maxvect-minvect
#Normalize quantative factors
D_matrix <- as.matrix(D[,1:4])
NormDMatrix<-matrix(nrow=10,ncol=4)
colnames(NormDMatrix)<-colnames(D_matrix)
for (i in 1:4) NormDMatrix[,i]<-(D_matrix[,i]-minvect[i]*rep(1,10))/rangevect[i]
gamenames<-unique(D[,"game"])
#Create dimension matrix for games
Ngames<-length(gamenames)
GameMatrix<-matrix(nrow=10,ncol=Ngames)
for (i in 1:Ngames) GameMatrix[,i]<-as.numeric(D[,"game"]==gamenames[i])
colnames(GameMatrix)<-gamenames
#combine game matrix with normalized quantative matrix
People<-D[,"name"]
RowVectors<-cbind(GameMatrix,NormDMatrix)
#normalize each row vector to length of 1 and then store as a data frame with person names
NormRowVectors<-t(apply(RowVectors,MARGIN=1,FUN=function(x) x/sqrt(sum(x*x))))
dfNorm<-data.frame(People,NormRowVectors)

#create person vectors via addition of appropriate row vectors
PersonMatrix<-array(dim=c(length(unique(People)),ncol(RowVectors)))
rownames(PersonMatrix)<-unique(People)
for (p in unique(People)){
  print(p)
  MatchIndex<-(dfNorm[,1]==p)*seq(1,nrow(NormRowVectors))
  MatchIndex<-MatchIndex[MatchIndex>0]
  nclm<-length(MatchIndex)
  SubMatrix<-matrix(NormRowVectors[MatchIndex,],nrow=length(MatchIndex),ncol=dim(NormRowVectors)[2])
  CSUMS<-colSums(SubMatrix)
  NormSum<-sqrt(sum(CSUMS*CSUMS))
  PersonMatrix[p,]<-CSUMS/NormSum
}
colnames(PersonMatrix)<-colnames(NormRowVectors)
#Calculate matrix of dot products
Similarity<-(PersonMatrix)%*%t(PersonMatrix)

quelle
Danke für die Antwort. Würde es Ihnen etwas ausmachen, einen R-Code für das Beispiel zu geben, das ich gegeben habe, damit die Antwort perfekt ist?
Zipp
1
@zipp hier gehts. Ich ließ es die normalisierten Vektoren berechnen, ich erstellte auch einen normalisierten Vektor für jede Person, indem ich die Vektorsumme der Zeilen normalisierte, die dieser Person entsprechen. Schließlich nehme ich das Punktprodukt jeder Person gegen jede andere Person unter Verwendung der FormelXXT
2

Trotz normalisierter euklidischer Entfernung können Sie auch die Pearson-Entfernung als Ähnlichkeitsmaß betrachten. Hier ist eine übersichtliche Beschreibung: http://mines.humanoriented.com/classes/2010/fall/csci568/portfolio_exports/sphilip/pear.html

Thomas Pazur
quelle
Das Problem, das ich mit dem Pearson habe, ist, dass ich nicht sicher bin, wie ich meine Daten verbinden und mich um kategoriale Variablen kümmern soll (möglicherweise könnte dies mit einer Dummy-Variablen geschehen, wie von Bey vorgeschlagen, aber nicht sicher, ob es damit funktionieren würde)
zipp
0
  • Möglicherweise möchten Sie alle stetigen Variablen in einem Bereich normalisieren (0-1).
  • Normalisieren Sie die kategorialen Variablen als One Hot Enconder
  • Anwenden von Ähnlichkeitsalgorithmen wie Pearson Korrelations- / Distanzalgorithmen wie (Euklidische, Kosinusähnlichkeit)
Shravan Shetty
quelle