s
# -*- coding: utf-8 -*-
from numpy import *
from numpy import linalg as la
def loadData():
a= [[0, 0, 0, 2, 2],
[0, 0, 0, 3, 3],
[0, 0, 0, 1, 1],
[1, 1, 1, 0, 0],
[2, 2, 2, 0, 0],
[5, 5, 5, 0, 0],
[1, 1, 1, 0, 0]]
return mat(a)
def ecludianSim(vecA,vecB):
return 1/(1+la.norm(vecA-vecB))
def cosSim(vecA,vecB):
upper=vecA*vecB
lower=float(la.norm(vecA)*la.norm(vecB))
return (1+upper/lower)/2
def recommend(dataMat,userID):
userRow=dataMat[userID,:]
notRatedIndexes=nonzero(userRow.A==0)
unRatedObjectScore={}
for i in notRatedIndexes[1]:#i为未评分物品
score=scoreCompute(userID, i,dataMat)
unRatedObjectScore[i]=score
return unRatedObjectScore
def scoreCompute(userID,i,dataMat):
simTotal=0.0
allTotal=0.0
for c in range(dataMat.shape[1]):
if (dataMat[userID,c]>0):
overlap=nonzero(logical_and( dataMat[:,i],dataMat[:,c]))[0] #logical_and 评判是否为0
if overlap==0:
sim=0
sim=ecludianSim(dataMat[overlap,i],dataMat[overlap,c])
simTotal+=sim
allTotal+=sim*dataMat[userID,c]
if simTotal==0: #没有相似的,全都回府
return 0
finalScore=allTotal/simTotal
return finalScore