奇异分解(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个奇异值。

原文地址:https://www.cnblogs.com/yifanrensheng/p/11832377.html

时间: 2024-10-09 00:19:51

奇异分解(SVD) 案例--用户与商家稀疏矩阵的相关文章

奇异分解(SVD)理论介绍

一.前言 奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,主要应用如下: 信息检索(LSA:隐性语义索引,LSA:隐性语义分析),分解后的奇异值代表了文章的主题或者概念,信息检索的时候同义词,或者说同一主题下的词会映射为同一主题,这样就可以提高搜索效率 数据压缩:通过奇异值分解,选择能量较大的前N个奇异值来代替所有的数据信息,这样可以降低噪声,节省空间. 推荐系统:主要是降噪,矩阵变换至低维空间(分解后还原的矩阵元素值作为原本

cookie技术案例-用户浏览商品的记录

1引言 你点击了桌面上的Chrome图标,一个浏览器窗口出现了,输入网址就可以在Internet世界愉快玩耍.这一切是怎么实现的呢?Chromium这个多进程的程序是如何启动各个进程的呢?浏览器主进程(界面进程)启动了哪些线程?如何启动的呢?这些问题一直萦绕在心头,一起来看看源代码吧.本文主要针对Chromium for Mac的源代码,其它操作系统大同小异. 2背景知识 浏览器作为一个应用程序,是以进程的形式运行在操作系统上的.首先,Chromium是一个多进程的应用程序,我们需要了解Chro

Java 之 request 案例——用户登录

用户登录案例需求: 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,db1数据库中user表 3.使用JdbcTemplate技术封装JDBC 4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您 5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误 分析示意图: 开发步骤: 1.创建 JavaEE项目,创建 login.html 页面,创建durid.pro

[javaEE] 三层架构案例-用户模块(二)

使用junit测试框架,测试查找用户和添加用户功能 com.tsh.test.xmlUserDaoTest package com.tsh.test; import org.junit.Test; import com.tsh.dao.XmlUserDao; import com.tsh.domain.User; /** * 测试用例 * @author taoshihan * */ public class xmlUserDaoTest { @Test public void testFind

[javaEE] 三层架构案例-用户模块(一)

用户注册登录注销 Servlet+JSP+javaBean+dom4j 分层结构: com.tsh.web com.tsh.service com.tsh.dao com.tsh.domain com.tsh.util com.tsh.test com.tsh.exception com.tsh.factory 使用的包: dom4j jstl beanutils junit users.xml-----------模拟数据库 config.properties------------主配置文件

python案例-用户登录

要求: •输入用户名密码 •认证成功后显示欢迎信息 •输错三次后锁定 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 """ 5 用户登陆功能实例 6 1.获取db文件中所有的用户信息 7 2.比较用户信息 8 如果用户名不存在,则直接退出 9 如果用户名存在 10 检测密码,如果密码存在,则提示登陆成功,并将登陆错误次数重置为 0 ,修改内存中的字典中记录的登陆错误次数.(并写入文件) 11 如果密码不存在 12 修

Java基础知识强化之集合框架笔记37:用户登录注册案例

1. 登录注册案例分析图解: 2. 用户登录案例 详细分析 和 分包实现: (1)用户登录案例详细分析(面向对象思想) 按照如下的操作,可以让我们更符合面向对象思想: • 有哪些类呢?                 用户类                 测试类       • 每个类有哪些东西呢?                 用户类: 成员变量:用户名,密码                            构造方法:无参构造                            成

SVD神秘值分解

SVD分解 SVD分解是LSA的数学基础,本文是我的LSA学习笔记的一部分,之所以单独拿出来,是由于SVD能够说是LSA的基础,要理解LSA必须了解SVD,因此将LSA笔记的SVD一节单独作为一篇文章.本节讨论SVD分解相关数学问题,一个分为3个部分,第一部分讨论线性代数中的一些基础知识,第二部分讨论SVD矩阵分解,第三部分讨论低阶近似.本节讨论的矩阵都是实数矩阵. 基础知识 1. 矩阵的秩:矩阵的秩是矩阵中线性无关的行或列的个数 2. 对角矩阵:对角矩阵是除对角线外全部元素都为零的方阵 3.

[机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用

本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统. 1.SVD详解 SVD(singular value decomposition),翻译成中文就是奇异值分解.SVD的用处有很多,比如:LSA(隐性语义分析).推荐系统.特征压缩(或称数据降维).SVD可以理解为:将一个比较复杂的矩阵用更小更简单的3个子矩阵的相乘来表示,这3个小矩阵描述了大矩阵重要的特性. 1.1奇异值分解的几何意义(因公式输入比较麻烦