【ML-14-2】奇异分解(SVD) 案例--用户与商家稀疏矩阵
一、稀疏矩阵(sparse matrix):
1.1 介绍:
矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素的分布没有规律,通常认为矩阵中非零元素的总数比上矩阵所有元素总数的值小于等于0.05时,则称该矩阵为稀疏矩阵。因此本文中的数字为50*200=10000,有效数据应该在10000*0.05=500。
1.2 数据构建:
本文模拟50位用户对200名用户进行评价,评价数量只有500个(满足稀疏性要求)。
评价分数:使用随机函数,取值从1-5随机。
500样本数由来:使用随机函数确定50*200的随机坐标。
构造方式:使用python的sparse.coo_matrix
spr_A=sparse.coo_matrix((data, (row, col)), shape=(50, 200)).toarray()
通过以上步骤即构建50*100随机函数,具体实现见三的代码实现。
二、U和V的矩阵的含义:
假设原始矩阵为:A,分解后的矩阵为A=U*S*V
2.2 题目解释:U表示user-to-concept的相似矩阵,每个列向量表示用于的评分高低的特征。V表示shop-to-concept的相似矩阵,转置后每个行向量表示商家本身服务质量。
三、代码
# Author:yifan from scipy import sparse import numpy as np import xlwt from numpy import linalg as la col=[0]*500 row=[0]*500 data=[0]*500 for i in range(500): row[i]=np.random.randint(0,50) col[i]=np.random.randint(0,200) #返回值的范围为【0,200)的整数,200不可取,因为是矩阵的index最大为199 data[i]=np.random.randint(1,6) #返回值的范围为【1,5】的整数,作为评分 # print(max(col)) spr_A=sparse.coo_matrix((data, (row, col)), shape=(50, 200)).toarray() #构造50*200的矩阵 # print(spr_A) # 创建工作薄,并保存上述矩阵 f = xlwt.Workbook() sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True) # 创建sheet for c in range(200): for r in range(50): sheet1.write(r,c,int(spr_A[r,c])) #注意要使用int(spr_A[r,c]),直接使用spr_A[r,c]会报错 f.save('D:/excelText.xls') print(spr_A.shape) #SVD变换: u,s,v = la.svd(spr_A,full_matrices=0,compute_uv=1) #还原原始的矩阵,发现四OK的 # A=np.dot(u,np.diag(s)) # print(np.dot(A,v)) print("左奇异值:") print(u,u.shape) print("奇异值:") print(s,s.shape) print("右奇异值:") print(v,v.shape)
语法注解:
函数:np.linalg.svd(a,full_matrices=1,compute_uv=1)。
参数:
a是一个形如(M,N)矩阵
full_matrices的取值是为0或者1,默认值为1,这时u的大小为(M,M),v的大小为(N,N) 。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。
compute_uv的取值是为0或者1,默认值为1,表示计算u,s,v。为0的时候只计算s。
返回值:
总共有三个返回值u,s,v
u大小为(M,M),s大小为(M,N),v大小为(N,N)。
A = u*s*v
其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。