| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
参考书籍:《机器学习实战》 
 
 
- import numpy as np
 
 - from numpy import linalg as la
 
  
- def loadExData():
 
 -     return[[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]]
 
 -     
 
 - def loadExData2():
 
 -     return[[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]]
 
  
- def eulidSim(inA, inB): #欧式距离
 
 -     return 1 / (1 + la.norm(inA - inB))
 
  
- def pearsSim(inA, inB):
 
 -     if len(inA) < 3:
 
 -         return 1#??
 
 -     return 1 / (1 + la.norm(inA - inB))
 
  
- def cosSim(inA, inB):
 
 -     num = float(inA.T * inB)
 
 -     denom = la.norm(inA) * la.norm(inB)
 
 -     return 0.5 + 0.5*(num / denom)
 
  
- #基于物品相似度的推荐系统
 
 - def standEst(dataMat, user, simMeas, item):
 
 -     n = np.shape(dataMat)[1]
 
 -     simTotal = 0
 
 -     ratSimTotal = 0
 
 -     for j in range(n):
 
 -         userRating = dataMat[user, j]
 
 -         if userRating == 0 or j==item:
 
 -             continue
 
 -         #https://blog.csdn.net/jningwei/article/details/78651535
 
 -         overLap = np.nonzero(np.logical_and(dataMat[:, item] > 0, 
 
 -                                          dataMat[:, j] > 0))[0]#必须都有评分记录
 
 -         if len(overLap) == 0:
 
 -             similarity = 0
 
 -         else:
 
 -             similarity = simMeas(dataMat[overLap, item],
 
 -                                  dataMat[overLap, j])
 
 -             simTotal += similarity
 
 -             ratSimTotal += similarity * userRating
 
 -     if simTotal == 0:
 
 -         return 0
 
 -     return ratSimTotal / simTotal
 
  
- def svdEst(dataMat, user, simMeas, item):
 
 -     n = np.shape(dataMat)[1]
 
 -     simTotal = 0.0; ratSimTotal = 0.0
 
 -     U,Sigma,VT = la.svd(dataMat)
 
 -     Sig4 = np.mat(np.eye(4)*Sigma[:4]) 
 
 -     xformedItems = dataMat.T * U[:,:4] * Sig4.I 
 
 -     for j in range(n):
 
 -         userRating = dataMat[user,j]
 
 -         if userRating == 0 or j==item: 
 
 -             continue
 
 -         similarity = simMeas(xformedItems[item,:].T,\
 
 -                              xformedItems[j,:].T)
 
 -         simTotal += similarity
 
 -         ratSimTotal += similarity * userRating
 
 -     if simTotal == 0: 
 
 -         return 0
 
 -     return ratSimTotal/simTotal
 
 -     
 
 -     
 
 - def recommend(dataMat, user, N = 3, simMeas = cosSim, estMethod = standEst):
 
 -     unratedItems = np.nonzero(dataMat[user,:] == 0)[1]
 
 -     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]
 
 -  
 
  
- if __name__ == '__main__':
 
 -        myMat = np.mat(loadExData())
 
 -        myMat[0, 1] = myMat[0, 0] = myMat[1, 0] = myMat[2, 0] = 4
 
 -        myMat[3, 3] = 2
 
 -        res1 = recommend(myMat, 2)
 
 -        res2 =recommend(myMat, 2, estMethod = svdEst)
 
  复制代码 |   
 
 
 
 |