统计学习方法第十五章作业:SVD矩阵分解 代码实现 及其在推荐的应用和矩阵压缩意义
SVD矩陣分解
import numpy as npclass SVD:def __init__(self,x):self.x = np.array(x)def get_r_rv(self,x):x = np.array(x)s_matrix = x.T.dot(x)r_list, r_v = np.linalg.eig(s_matrix)return r_list,r_vdef get_matrix_rank(self):return np.linalg.matrix_rank(self.x)def get_V_M(self,x):r_list, r_v = self.get_r_rv(x)index_rank = np.argsort(-r_list)r_list = r_list[index_rank]r_list_ = r_list[r_list > 0]r_max = len(r_list_)V = r_v[:,index_rank]m = np.zeros((r_max,r_max))U = np.zeros((self.x.shape[0],r_max))for i in range(r_max):m[i][i] = np.sqrt(r_list_[i])U[:,i] = (np.dot(self.x, V[:, i]) / np.sqrt(r_list_[i])).TV = V[:, :r_max]return V,m,Udef svd(self,way='norm',k=None):V,m,U= self.get_V_M(self.x)if way == 'norm':return V,m,Uif way == 'truncated':r = self.get_matrix_rank()if k < r and k > 0:return V[:, :k], m[:k, :k], U[:, :k]else:return V, m, Udef main():x = np.array([[0,20,5,0,0],[10,0,0,3,0],[0,0,0,0,1],[0,0,0,1,0]])svd = SVD(x)V, m, U = svd.svd()print(V)print(m)print(U)x = np.array([[0,20,5,0,0],[10,0,0,3,0],[0,0,0,0,1],[0,0,0,1,0]])svd = SVD(x)V, m, U = svd.svd(way='truncated',k=2)print(V)print(m)print(U)if __name__ == '__main__':main()#------result-------------- [[ 0. 0.95709203 0. 0.28978415][ 0.9701425 0. 0. 0. ][ 0.24253563 0. 0. 0. ][ 0. 0.28978415 0. -0.95709203][ 0. 0. 1. 0. ]][[20.61552813 0. 0. 0. ][ 0. 10.44429362 0. 0. ][ 0. 0. 1. 0. ][ 0. 0. 0. 0.95746064]][[ 1. 0. 0. 0. ][ 0. 0.99961501 0. 0.02774569][ 0. 0. 1. 0. ][ 0. 0.02774569 0. -0.99961501]][[0. 0.95709203][0.9701425 0. ][0.24253563 0. ][0. 0.28978415][0. 0. ]][[20.61552813 0. ][ 0. 10.44429362]][[1. 0. ][0. 0.99961501][0. 0. ][0. 0.02774569]]結果解釋
所分解的矩陣是各個消費者對各個網頁的URL點擊次數
[[0,20,5,0,0],
[10,0,0,3,0],
[0,0,0,0,1],
[0,0,0,1,0]]
分解結果:
V:
[[ 0. 0.95709203 0. 0.28978415]
[ 0.9701425 0. 0. 0. ]
[ 0.24253563 0. 0. 0. ]
[ 0. 0.28978415 0. -0.95709203]
[ 0. 0. 1. 0. ]]
可以視作各個URL在不同特征維度上的特征值(4個維度)
如URL1的第二個特征較強,URL2的第一個特征較強
U:
[[ 1. 0. 0. 0. ]
[ 0. 0.99961501 0. 0.02774569]
[ 0. 0. 1. 0. ]
[ 0. 0.02774569 0. -0.99961501]]
可以看作用戶對URL各個特征維度的偏好
如果用戶1對特征1強的URL更加喜歡 因此查詢V表發現URL2的特征1維度強
可以解釋用戶1對URL2的點擊高達20次之多
同理用戶2對特征2偏好較強,查詢V表發現URL1的特征2較強,
可以解釋用戶2對URL1的點擊高達10次之多
m:
[[20.61552813 0. 0. 0. ]
[ 0. 10.44429362 0. 0. ]
[ 0. 0. 1. 0. ]
[ 0. 0. 0. 0.95746064]]
可以視作各個URL特征的決定性作用或重要性,可以發現URL的前兩個特征的重要性明顯高于其他兩個特征
因此我們對SVD分解結果進行截斷得到結果:
V:
[[0. 0.95709203]
[0.9701425 0. ]
[0.24253563 0. ]
[0. 0.28978415]
[0. 0. ]]
U:
[[1. 0. ]
[0. 0.99961501]
[0. 0. ]
[0. 0.02774569]]
僅通過V,U兩個矩陣我們就可以獲得原用戶點擊URL矩陣的絕大多數信息,具有較強的解釋性。這也是SVD矩陣分解的壓縮的性質。
但至于URL的各個特征具體是指什么,這里無法體現,僅能表示用戶偏好與URL屬性之間的關系,可以用于推薦算法。
總結
以上是生活随笔為你收集整理的统计学习方法第十五章作业:SVD矩阵分解 代码实现 及其在推荐的应用和矩阵压缩意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计学习方法第十四章作业:聚类—层次聚类
- 下一篇: 【强化学习】多臂老虎机——E_greed