基于svd矩阵分解的推荐算法推荐网课平台(根据网速,功能以及用户的喜好推荐)包括ui界面

背景

由于新型冠状肺炎疫情所致,为了保证学生学业进度,国家教育部提出“停课不停学”的要求。于是,各地教育部门详细地制定了关于线上教学的方案,线上教学成为广大学生与老师最受欢迎与信赖的上课方式。然而,线上教学也面临诸多问题,如上课方式的选择,有的线上教学软件只能展示课件而不能直播,或者只有直播没有实时互动答题等。
实现效果:
在这里插入图片描述
当前环境不理想时,会提醒切换其他软件:
在这里插入图片描述

推荐过程

根据调研得出现有软件的功能,但是平台的在线带宽使用情况是0-1之间的数模拟。

def SoftwareFiction():
    # 行:钉钉、腾讯会议、雨课堂、学在西电、QQ
    #列:0 1 2
    return [[1, 1, 1, 1, 0],
            [1, 1, 0, 0, 1],
            [0, 0, 1, 1, 0]]
    # return mat(SoftwareFiction())
def softwarepv():
    softwarepv = random.rand(5)
    print(softwarepv)
    return softwarepv

定义欧几里德距离、皮尔逊相关系数和余弦相似度

# 欧几里德距离 这里返回结果已处理 0,1   0最大相似,1最小相似   欧氏距离转换为2范数计算

def ecludSim(inA, inB):
    return 1.0 / (1.0 + la.norm(inA - inB))


# 皮尔逊相关系数 numpy的corrcoef函数计算
def pearsSim(inA, inB):
    if (len(inA) < 3):
        return 1.0
    return 0.5 + 0.5 * corrcoef(inA, inB, rowvar=0)[0][1]  # 使用0.5+0.5*x 将-1,1 转为 0,1


# 余玄相似度 根据公式带入即可,其中分母为2范数计算,linalg的norm可计算范数
def cosSim(inA, inB):
    num = float(inA.T * inB)
    denom = la.norm(inA) * la.norm(inB)
    return 0.5 + 0.5 * (num / denom)  # 同样操作转换 0,1

使用svd简化数据

def cal_qiyizhi(dataMat,sigma):
    # U, sigma, VT = linalg.svd(dataMat)
    sigma = sigma ** 2  # 对奇异值求平方
    cnt = sum(sigma)  # 所有奇异值的和
    #print(cnt)
    value = cnt * 0.9  # 90%奇异值能量
    for i in range(shape(dataMat)[1]):
        cnt2 = sum(sigma[:i])
        if cnt2 > value:
            break
        else:
            continue
    return i

def svdEst(dataMat, user, simMeas, item):
    n = shape(dataMat)[1]
    simTotal = 0.0; ratSimTotal = 0.0
    U,Sigma,VT = la.svd(dataMat)
    v = cal_qiyizhi(dataMat,Sigma)
    # print(U)
    # print(Sigma)
    # print(VT)
    #print("=============")
    Sig3 = mat(eye(v)*Sigma[:v])  #将奇异值向量转换为奇异值矩阵
    #print(type(dataMat))
    xformedItems = dataMat.T * U[:,:v] * Sig3.I  # 降维方法 通过U矩阵将物品转换到低维空间中 (商品数行x选用奇异值列)
    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
    else:
        return ratSimTotal/simTotal

给出推荐商品评分

def recommend(dataMat, user, N=1, simMeas<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值