94 Demonstração do Princípio de Filtragem Colaborativa do Algoritmo de Recomendação R

1 Preparação inicial

Limpar dados, renomear nomes de colunas

######### Ranking Douban ##############
######### CF baseado no usuário ############## #

Sys.setlocale(category = “LC_ALL”, locale = “Chinês”)

Limpar

rm(lista=ls())

biblioteca (regras)

##Construir
dados da matriz do modelo <- read.csv('testCF.csv',header = FALSE)
##Adicionar nomes de colunas names
(data) <- c("uid","iid","pref")

Use o índice de dados em vez do nome original, o Índice correspondente e a pontuação são combinados para encontrar a posição correspondente na matriz a ser preenchida

contar usuários

user <- unique(data KaTeX parse error: Esperado 'EOF', obteve '#' na posição 6: uid) #̲#Conte o número de produtos (transforme usuários e produtos para... iid))
uidx <- match( data KaTeX parse error : Esperado 'EOF', obteve '#' na posição 12: uid, user) #̲Index iidx <-… iid, item) #Index
##Define storage matrix
M <- matrix(0, length(user) ,length (item))
i <- cbind(uidx, iidx, pref=data$pref) # Combina o Índice e a pontuação correspondentes para encontrar a posição correspondente na matriz a ser preenchida

insira a descrição da imagem aqui
dimnames(M)[[2]] <- item
##retorna o valor da matriz
M

insira a descrição da imagem aqui

2 Algoritmo de Similaridade

Algoritmo de similaridade de distância euclidiana

linha <- nrow(M) #matriz de
similaridade do usuário

s <- matriz(0,linha,linha)

for(z1 in 1:row){
  for(z2 in 1:row){
    if(z1 < z2){
      ##可计算的列
      num <- intersect(which(M[z1,]!=0),which(M[z2,]!=0)) #在这里计算每一行和下一行,同时不为零的列
      
      sum <- 0
      for(z3 in num){
        sum <- sum+(M[z1,][z3] - M[z2,][z3])^2 #欧几里德距离的公式计算每一个产品和其他产品的相似度
      }
      
      s[z2,z1] <- length(num)/(1+sqrt(sum)) #求倒数,表示相关性,加1是为了防止0的出现
      
      ##对算法的阈值进行限制
      if(s[z2,z1] > 1) s[z2,z1] <- 1
      if(s[z2,z1] < -1) s[z2,z1] <- -1      
    }
  }
}

ts <- t(s) ##Matriz triangular completa
w <- which(superior.tri(ts))
s[w] <- ts[w]
s ##Retorna a matriz de similaridade do usuário
s1<-s

insira a descrição da imagem aqui

3 Algoritmo do vizinho mais próximo do usuário

##Algoritmo do vizinho do usuário
Neighbor_num <- 2 ##Pegue a linha dos dois maiores vizinhos
<- nrow(s1)
neighbor <- matrix(0,row,Neighbor_num)
for(z1 in 1:row){ for(z2 in 1:Neighbor_num) ){ m <- which.max(s1[,z1]) # Encontra a linha com maior similaridade entre cada usuário (o número de clientes) neighbor[z1,][z2] <- m #This Preencha a posição em a tabela de usuário adjacente s1[,z1][m]=0 #Defina o valor máximo como 0 para encontrar o valor máximo no segundo loop } } vizinho







insira a descrição da imagem aqui

4 Algoritmos de Recomendação

Na recomendação, encontre o primeiro usuário mais parecido com o usuário 1 (os dois mais parecidos são o usuário 4 e o usuário 5), primeiro pegue o usuário 4. E pegue o filme que o usuário 1 não viu, mas o usuário 4 assistiu ( interseção pegue a interseção).

núm_linha <- ncol(vizinho)
núm_coluna <- ncol(M)
rcm <- matriz(0, núm_linha, núm_coluna)

ruid=1 #Encontra o usuário 1 primeiro
N1 <- vizinho[ruid,]
for(z1 in 1:length(N1)){ num <- intersect(which(M[ruid,]==0),which(M[N1 [z1],]!=0)) #Encontre o primeiro usuário que é mais parecido com o usuário 1 na recomendação (os dois mais parecidos são o usuário 4 e o usuário 5), primeiro pegue o usuário 4. E pegue o usuário 1 que não tem visto, mas os filmes assistidos pelo usuário 4 (intersept). for(z2 in num){ rcm[z1,z2] = M[N1[z1],z2]*s[ruid,N1[z1]] #Classificação do usuário 4 para o 4º produto × similaridade do usuário 4 e do usuário 1 de } }




##输出推荐矩阵
sum <- colSums(rcm)
s2 <- matrix(0,2,col_num)
for(z1 in 1:length(N1)){
  num <- intersect(which(colSums(rcm)!=0),which(M[N1[z1],]!=0))
  for(z2 in num){
    s2[1,][z2] <- s2[1,][z2]+s[ruid,N1[z1]] # 计算推荐矩阵中分母的部分
    s2[2,][z2] <- s2[2,][z2]+1 #防止出现0的情况
  }
} 
m
s2[,which(s2[2,]==1)]=10000 #防止只有一个用户与之相似的情况出现,避免了一个人多个账号产生的极高相似度的错误推荐。
s2 <- s2[-2,]

r2 <- matrix(0,n,2)
rr <- sum/s2
item <- dimnames(M)[[2]] #在dimnames(M)list 中取名字
str(dimnames(M))

for(z1 in 1:n){
  w <- which.max(rr)
  if(rr[w]>0.5){
    r2[z1,1] <- item[which.max(rr)]
    r2[z1,2] <- as.double(rr[w])
    rr[w]=0
  }
}
r2

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_44498127/article/details/124437459
Recomendado
Clasificación