def similarity(data):
m = np.shape(data)[0]
w = np.mat(np.zeros((m, m)))
for i in range(m):
for j in range(i, m):
if j != i:
w[i, j] = cos_sim(data[i, ], data[j, ])
w[j, i] = w[i, j]
else:
w[i, j] = 0
return w
複製代碼
求top N的商品是什麼:github
def top_k(predict, k):
top_recom = []
len_result = len(predict)
if k >= len_result:
top_recom = predict
else:
for i in range(k):
top_recom.append(predict[i])
return top_recom
複製代碼
基於用戶的協同過濾:算法
def user_based_recommend(data, w, user):
m, n = np.shape(data)
interaction = data[user, ]
not_inter = []
for i in range(n):
if interaction[0, i] == 0:
not_inter.append(i)
predict = {}
for x in not_inter:
item = np.copy(data[:, x])
for i in range(m):
if item[i, 0] != 0:
if x not in predict:
predict[x] = w[user, i] * item[i, 0]
else:
predict[x] = predict[x] + w[user, i] * item[i, 0]
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
複製代碼
def item_based_recommend(data, w, user):
m, n = np.shape(data)
interation = data[:, user]
not_inter = []
for i in range(n):
if interation[0, i] == 0:
not_inter.append(i)
predict = {}
for x in not_inter:
item = np.copy(interation)
for j in range(m):
if item[0, j] != 0:
if x not in predict:
predict[x] = w[x, j] * item[0, j]
else:
predict[x] = predict[x] + w[x, j] * item[0, j]
return sorted(predict.items(), key=lambda d:d[1], reverse=True)
複製代碼
因此更新方式:$$Q = Q + n*[(P^TR) - (P^TPQ)]$$要作的就是設計一個n,使得乘上以後能夠抵消前面的Q便可。,帶進去以後:$$Q = Q \frac{(P^TR)}{(P^TPQ)} \ P = P \frac{(RQ^T)}{PQQ^T}$$使用KL離散也是同樣的。 ####代碼實現app
def train(V, r, maxCycles, e):
m, n = np.shape(V)
W = np.mat(np.random.random((m, r)))
H = np.mat(np.mat(np.random.random((r, n))))
for step in range(maxCycles):
V_pre = W * H
E = V - V_pre
err = 0.0
for i in range(m):
for j in range(n):
err += E[i, j] * E[i, j]
if err < e:
breakif step % 1000 == 0:
print("\Interator: ", step, " Loss: ", err)
a = W.T * V
b = W.T * W * H
for i in range(r):
for j in range(n):
if b[i, j] != 0:
H[i, j] = H[i, j] * a[i, j] / b[i, j]
c = V * H.T
d = W * H * H.T
for i in range(m):
for j in range(r):
if d[i, j] != 0:
W[i, j] = W[i, j] * c[i, j] / d[i, j]
return W, H
複製代碼