背景
由于新型冠状肺炎疫情所致,为了保证学生学业进度,国家教育部提出“停课不停学”的要求。于是,各地教育部门详细地制定了关于线上教学的方案,线上教学成为广大学生与老师最受欢迎与信赖的上课方式。然而,线上教学也面临诸多问题,如上课方式的选择,有的线上教学软件只能展示课件而不能直播,或者只有直播没有实时互动答题等。
实现效果:
当前环境不理想时,会提醒切换其他软件:
推荐过程
根据调研得出现有软件的功能,但是平台的在线带宽使用情况是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<