from numpy import *
from numpy import linalg as la
import pandas as pd
import pdb
import numpy as np
def loadData():
M = [[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],
[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],
[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],
[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],
[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],
[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],
[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],
[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],
[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0],
[2, 1, 0, 2, 0, 5, 3, 0, 1, 0, 1]]
return(np.mat(M))
def euclidSim(inA,inB):
return 1.0/(1.0 + la.norm(inA - inB))
def pearsonSim(inA,inB):
if len(inA) < 3 : return 1.0
return 0.5+0.5*corrcoef(inA, inB, rowvar = 0)[0][1]
def cosineSim(inA,inB):
num = float(inA.T*inB)
denom = la.norm(inA)*la.norm(inB)
return 0.5+0.5*(num/denom)
A = np.array([2,3,0,1,0,4,-5])
B = np.array([0,1,2,-4,2,0,3])
A = mat(A)
B = mat(B)
print(euclidSim(A.T,B.T))
print(cosineSim(A.T,B.T))
print(pearsonSim(A.T,B.T))
def standEst(dataMat, user, simMeas, item):
n = shape(dataMat)[1]
simTotal = 0.0; ratSimTotal = 0.0
for j in range(n):
userRating = dataMat[user,j]
if userRating == 0:
continue
overLap = nonzero(logical_and(dataMat[:,item]>0, dataMat[:,j]>0))[0]
if len(overLap) == 0:
similarity = 0
else:
similarity = simMeas(dataMat[overLap,item], dataMat[overLap,j])
#print('the %d and %d similarity is: %f' % (item, j, similarity))
simTotal += similarity
ratSimTotal += similarity * userRating
if simTotal == 0: return 0
else: return ratSimTotal/simTotal
def svdEst(dataMat, user, simMeas, item):
n = shape(dataMat)[1]
simTotal = 0.0; ratSimTotal = 0.0
data=mat(dataMat)
U,Sigma,VT = la.svd(data)
Sig4 = mat(eye(4)*Sigma[:4]) #arrange Sig4 into a diagonal matrix
xformedItems = data.T * U[:,:4] * Sig4.I #create transformed items
for j in range(n):
userRating = data[user,j]
if userRating == 0 or j==item: continue
similarity = simMeas(xformedItems[item,:].T, xformedItems[j,:].T)
#print('the %d and %d similarity is: %f' % (item, j, similarity))
simTotal += similarity
ratSimTotal += similarity * userRating
if simTotal == 0: return 0
else: return ratSimTotal/simTotal
def recommend(dataMat, user, N=3, simMeas=cosineSim, estMethod=standEst):
unratedItems = nonzero(dataMat[user,:].A==0)[1] #find unrated items
if len(unratedItems) == 0: return 'you rated everything'
itemScores = []
for item in unratedItems:
estimatedScore = estMethod(dataMat, user, simMeas, item)
itemScores.append((item, estimatedScore))
return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]
data = loadData()
print(data)
D=mat(data)
U,Sigma,VT = la.svd(D)
Sig4 = mat(eye(4)*Sigma[:4]) #arrange Sig4 into a diagonal matrix
xItems = data.T * U[:,:4] * Sig4.I #create transformed items
print(xItems)
user = 4
recommendations = recommend(data, user, N=4, simMeas=cosineSim, estMethod=standEst)
print(recommendations)
print("Recommended Items for User", user, ":\n")
for i, p in recommendations:
print("Item ", i, "with predicted rating: ", p, "\n")
user = 4
recommendations = recommend(data, user, N=4, simMeas=cosineSim, estMethod=svdEst)
print(recommendations)
print("Recommended Items for User", user, ":\n")
for i, p in recommendations:
print("Item ", i, "with predicted rating: ", p, "\n")