2014-03-06 3 views
0

각 행은R 데이터 프레임 변환 다음과 같이 내가 데이터 프레임을

userid artist  gender country 
001  nirvana  m   germany 
001  metallica m   germany 
002  slayer  m   usa 
003  nirvana  m   germany 
003  metallica m   germany 
...  ...   ...  ... 

지금 내가 전처리에 필요한 트랜잭션 (001 열반을 듣고, 또한 메탈리카에 귀를 기울 즉 사용자가 아니라 슬레이어)를 나타냅니다 이 항목 기반 권장 사항을 수행 할 수 있습니다. 어떻게 든 노래 요소

   nirvana  metallica  slayer 
nirvana     0.2   0 
metallica 0.24       0 
slayer  0    0    

이것은 추천 시스템을 구축하는 등 사람이 올바른 방향으로 날 지점 또는 나에게 내가 감사하겠습니다 방법을 제공 할 수있는 경우이다 사이의 코사인 유사도 매트릭스와 끝까지해야합니다.

+0

(http://stackoverflow.com/questions/14340275/how-to-compute-cosine-similarity-using-two-matrices) 하나의 방법 I에 결과 –

답변

1

방법

이 본 작업을 수행하는 단계를 포함한다 :

  1. 변형 데이터는 각 셀의 코사인 유사도 산출 노래/음악 데이터 프레임
  2. 생성
  3. 설정

는 변환

우리 나라는 독일이다 부분 집합을 얻기 위해 plyr 라이브러리를 사용하여 데이터 집합을 변환하기 (I 독일에만 관심이 있었다) 라이브러리 (plyr) data.germany < - (데이터 [데이터 $ 국가 %에서 % "독일"])

우리는 다음 주파수 테이블을 만들려면 우리는 단지 우리는 그 다음 1 곡이에 의해 말을 나타내는 이진 행렬을 채울 사용자가

germany.frequency<-as.data.frame((table(data.germany$user,data.germany$artist,dnn=c("user","artist")))) 

germany.frequency<-subset(germany.frequency,Freq>=1) 

을 듣고 노래를 원하는 사용자

germany.users <- as.matrix(unique(data.germany$user)) 
germany.artists <- as.matrix(unique(data.germany$artist)) 
holder <- matrix(NA, nrow=nrow(germany.users),ncol=nrow(germany.artists),dimnames=list((germany.users),(germany.artists))) 
holder[,] <- 0 
for(i in 1:nrow(holder)) { 
    for(j in 1:ncol(holder)) { 
    if(nrow(subset(germany.frequency, (user == rownames(holder)[i] & artist == colnames(holder)[j])))>0) 
    { holder[i,j]<-1 } 
    } 
} 

# Reorder the column names alphabetically 
data.germany<-(holder[,order(colnames(holder))]) 

이제 홀더 매트릭스를 읽게되었습니다. 주 : for 루프는 R에서 오랜 시간이 걸린다.

아이템 유사성

버리기 사용자 열에 기반하고 새로운 데이터 프레임

data.germany.ibs <- (data.germany[,!(names(data.germany) %in% c("user"))]) 

두 벡터 사이의 코사인 값을 계산하기위한 헬퍼 기능을 생성 할

getCosine <- function(x,y) 
{ 
    this.cosine <- sum(x*y)/(sqrt(sum(x*x)) * sqrt(sum(y*y))) 
    return(this.cosine) 
} 

만들기 자리 표시 자 데이터 프레임 목록 항목 대 항목

holder <- matrix(NA, nrow=ncol(data.germany.ibs),ncol=ncol(data.germany.ibs),dimnames=list(colnames(data.germany.ibs),colnames(data.germany.ibs))) 

data.germany.ibs.similarity <- as.data.frame(holder) 

코사인와 그 빈 공간을 기입 할 수있는 파일에 각

data.germany.neighbours <- matrix(NA, nrow=ncol(data.germany.ibs.similarity),ncol=11,dimnames=list(colnames(data.germany.ibs.similarity))) 

for(i in 1:ncol(data.germany.ibs)) 
{ 
    data.germany.neighbours[i,] <- (t(head(n=11,rownames(data.germany.ibs.similarity[order(data.germany.ibs.similarity[,i],decreasing=TRUE),][i])))) 
} 
에 대한

write.csv(data.germany.ibs.similarity,file="final-germany-similarity.csv") 

받기 상위 10 이웃을

for(i in 1:ncol(data.germany.ibs)) { 
    for(j in 1:ncol(data.germany.ibs)) { 
     data.germany.ibs.similarity[i,j]= getCosine(data.germany.ibs[i],data.germany.ibs[j]) 
} 

}

출력 유사성 결과를 유사성 ,515,

출력 이웃 파일 [여기]

write.csv(file="final-germany-item-neighbours.csv",x=data.germany.neighbours[,-1]) 
0

arules 패키지를 사용하고 userid와 아티스트를 전달하는 것이 좋습니다. 패키지에는 꽤 명확한 지침이 있습니다. 빠르고 간단하게 생성 된 규칙은 고품질입니다.

이 필요하고 항목 기반 CF가 필요하다고 가정하면 Recommender Lab 패키지를 사용해보십시오. 그것은 편재하는 것을 발견했지만 많은 문서가 없지만 도움이 될 수있는 사전 작성된 기능이 있습니다.

나는 대부분의 사람들이 추천 엔진과 협업 필터링을 동의어로 취급하지 않습니다.

+0

프로젝트를 위해 둘 다 사용해야합니다^_^ 이전에 추천 실험실을 보았습니다. 나는 내가 지금 내놓을 해결책을 해킹했다. – salemmarafi