Cách tìm sự tương đồng giữa các yếu tố khác nhau trong bộ dữ liệu


8

Giới thiệu

Giả sử tôi có một bộ dữ liệu quan sát khác nhau về những người khác nhau và tôi muốn nhóm mọi người lại với nhau để biết người nào thân nhất với người khác. Tôi cũng muốn có một thước đo để biết họ thân với nhau như thế nào và biết ý nghĩa thống kê.

Dữ liệu

       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

Tái sản xuất nó:

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")

Câu hỏi

Đưa ra một tập dữ liệu là đồng nghiệp (với tính năng liên tục và phân loại), làm thế nào tôi có thể biết nếu một người (một câu trả lời phân loại) được xác định bởi một tên có tương quan với người khác không?

Câu trả lời:


6

Một cách là bình thường hóa các giá trị định lượng của bạn (chơi, ăn, uống, ngủ) để tất cả chúng có cùng phạm vi (giả sử 0 -> 1), sau đó gán mỗi trò chơi cho "thứ nguyên" của riêng nó, lấy giá trị 0 hoặc 1. Biến mỗi hàng thành một vectơ và chuẩn hóa độ dài thành 1. Bây giờ, bạn có thể so sánh sản phẩm bên trong của bất kỳ vectơ chuẩn hóa nào của hai người như một thước đo tương tự. Một cái gì đó như thế này được sử dụng trong khai thác văn bản khá thường xuyên


Mã R cho Ma trận Tương tự

Giả sử bạn đã lưu khung dữ liệu của mình vào biến "D"

#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)

Cảm ơn câu trả lời. Bạn có phiền khi đưa ra một mã R để làm điều đó với ví dụ tôi đã đưa ra để có câu trả lời là hoàn hảo?
zipp

1
XXT

2

Mặc dù khoảng cách euclide bình thường hóa, bạn cũng có thể xem khoảng cách quả lê như một thước đo tương tự. Dưới đây là một mô tả gọn gàng: http://mines.humanoriented.com/groupes / 2010 / fall / csci568 / port portfolio_exports / spilip / pear.html


Vấn đề tôi gặp phải với Pearson là tôi không chắc chắn làm thế nào để tham gia dữ liệu của mình và quan tâm đến biến phân loại (có thể được thực hiện với biến giả như bey đề xuất nhưng không chắc nó sẽ hoạt động với nó)
zipp

0
  • Bạn có thể muốn bình thường hóa tất cả các biến liên tục thành một phạm vi (0-1)
  • Bình thường hóa các biến phân loại dưới dạng One Hot Enconder
  • Áp dụng các thuật toán Tương tự như thuật toán Tương quan / Khoảng cách Pearson như (Tương tự Euclide, Cosine)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.