糖逗 发表于 2020-11-19 21:18:34

Python实现SVD

参考书籍:《机器学习实战》


import numpy as np
from numpy import linalg as la

def loadExData():
    return[,
         ,
         ,
         ,
         ,
         ,
         ]
   
def loadExData2():
    return[,
         ,
         ,
         ,
         ,
         ,
         ,
         ,
         ,
         ,
         ]

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)
    simTotal = 0
    ratSimTotal = 0
    for j in range(n):
      userRating = dataMat
      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))#必须都有评分记录
      if len(overLap) == 0:
            similarity = 0
      else:
            similarity = simMeas(dataMat,
                                 dataMat)
            simTotal += similarity
            ratSimTotal += similarity * userRating
    if simTotal == 0:
      return 0
    return ratSimTotal / simTotal

def svdEst(dataMat, user, simMeas, item):
    n = np.shape(dataMat)
    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
      if userRating == 0 or j==item:
            continue
      similarity = simMeas(xformedItems.T,\
                           xformedItems.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 == 0)
    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, reverse = True)[:N]


if __name__ == '__main__':
       myMat = np.mat(loadExData())
       myMat = myMat = myMat = myMat = 4
       myMat = 2
       res1 = recommend(myMat, 2)
       res2 =recommend(myMat, 2, estMethod = svdEst)

糖逗 发表于 2020-11-19 21:19:12

{:10_335:}
页: [1]
查看完整版本: Python实现SVD