
def matrix_factorization(R, K, steps=200, learning_rate=0.01, r_lambda = 0.01): # MF 또는 행렬 분해
num_users, num_items = R.shape
# P와 Q 매트릭스의 크기를 지정하고 정규분포를 가진 랜덤한 값으로 입력합니다.
np.random.seed(1)
P = np.random.normal(scale=1./K, size=(num_users, K))
Q = np.random.normal(scale=1./K, size=(num_items, K))
break_count = 0
# R > 0 인 행 위치, 열 위치, 값을 non_zeros 리스트 객체에 저장.
non_zeros = [ (i, j, R[i,j]) for i in range(num_users) for j in range(num_items) if R[i,j] > 0 ]
# P와 Q 매트릭스를 계속 업데이트(확률적 경사하강법)
for step in tqdm_notebook(range(steps)):
for i, j, r in non_zeros:
# 실제 값과 예측 값의 차이인 오류 값 구함
eij = r - np.dot(P[i, :], Q[j, :].T)
# Regularization을 반영한 SGD 업데이트 공식 적용
P[i,:] = P[i,:] + learning_rate*(eij * Q[j, :] - r_lambda*P[i,:])
Q[j,:] = Q[j,:] + learning_rate*(eij * P[i, :] - r_lambda*Q[j,:])
rmse = get_rmse(R, P, Q, non_zeros)
if (step % 10) == 0 :
print("### iteration step : ", step," rmse : ", rmse)
return P, Q
'PYTHON > machine_learning' 카테고리의 다른 글
| RandomForest 다중 출력 알고리즘 (0) | 2024.03.25 |
|---|---|
| Precision, Recall, F1 Score (0) | 2022.11.02 |
| 행렬 전치 (0) | 2022.02.08 |
| 코사인 유사도 (0) | 2022.02.08 |
| 가중평균 (0) | 2022.02.08 |