zoukankan      html  css  js  c++  java
  • 【ML142】奇异分解(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随机函数,具体实现见三的代码实现。

    二、UV的矩阵的含义:

    假设原始矩阵为: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个奇异值。

  • 相关阅读:
    史上最全最强SpringMVC详细示例实战教程
    使用Mapper专用的MyBatis Generator插件
    list集合为空或为null的区别
    Hibernate三大类查询总结
    mybatis深入理解之 # 与 $ 区别以及 sql 预编译
    Hibernate 中Criteria Query查询详解【转】
    mybatis example使用 and和or联合查询(转)
    mybatis中的mapper接口文件以及example类的实例函数以及详解
    iOS安全攻防之越狱设备检测
    iOS安全攻防之阻止GDB依附
  • 原文地址:https://www.cnblogs.com/yifanrensheng/p/11832377.html
Copyright © 2011-2022 走看看