如何轻松干掉svd(矩阵奇异值分解),用代码说话

    svd我认识我机器学习里面最扯淡的玩意了。尼玛。老实说,好多机器学习的书老是在扯svd有多高端,然后看了netflix电影推荐大赛,哇塞,冠军队就是用svd+做的。然后狠狠的下载了所有他们的论文,硬是没看明白。后来居然对svd有恐惧感。感觉这个玩意好高端似的。你看他啊,它能提高预测精度,它好像是万能的,能降维,什么比赛有事没事都要扯扯svd。后来看Kaggle上的比赛,有个walmat仓储量预测大赛,也是对数据先用svd预处理。

    回去下载了好多svd论文看,搞了好久都没搞明白。他们都是说自己如何使用svd的。但是到底svd是个啥玩意,讲的就玄乎了。

   他把一个大的矩阵分解成了一些小矩阵相乘,如这博客里讲的:http://blog.csdn.net/wangran51/article/details/7408414

::::-------------------------分割线----------我所不喜欢的-------------------------------------------

  奇异值分解

上面讨论了方阵的分解,但是在LSA中,我们是要对Term-Document矩阵进行分解,很显然这个矩阵不是方阵。这时需要奇异值分解对Term-Document进行分解。奇异值分解的推理使用到了上面所讲的方阵的分解。

假设C是M x N矩阵,U是M x M矩阵,其中U的列为CCT的正交特征向量,V为N x N矩阵,其中V的列为CTC的正交特征向量,再假设r为C矩阵的秩,则存在奇异值分解:

其中CCT和CTC的特征值相同,为

Σ为M X N,其中,其余位置数值为0,的值按大小降序排列。以下是Σ的完整数学定义:

σi称为矩阵C的奇异值。

用C乘以其转置矩阵CT得:

上式正是在上节中讨论过的对称矩阵的分解。

奇异值分解的图形表示:

从图中可以看到Σ虽然为M x N矩阵,但从第N+1行到M行全为零,因此可以表示成N x N矩阵,又由于右式为矩阵相乘,因此U可以表示为M x N矩阵,VT可以表示为N x N矩阵

-------------------------分割线----------我找了好多资料,都是这样讲的。尼玛---------------------------------------------

我看这些玩意,我总感觉好高端啊,一个矩阵他就是把他分解成了这么多小矩阵,而且还保证这些小矩阵的乘积等于原来的矩阵。真是奇妙。这样要我用代码实现,怎么实现。

然后找了不少博客,都在瞎鸡巴扯svd可以放在推荐系统啦,U矩阵就是用户的特性啦,V矩阵就是电影的特性啦,好牛逼高端的,还可以用在自然语言处理中。

然并卵。一头雾水。

我想告诉大家。svd是一个任何大学本科生都会做的事情,你知道他干了什么吗?

下面 我给你们先轻松讲述,随后奉上python版代码:

当一个矩阵是方阵的时候,他是可以做特征分解的。就是线性代数里面老考的那玩意。拿个方阵你来求特征值特征向量啦,当他有n个线性无关的特征向量的时候,这个方阵就可以相似对角化为一个对角矩阵,如果

他的线性无关的特征向量少于n.他就只能规范化为约当块(jadom 块)。

那么,问题来了,什么是svd?

当一个矩阵A不是方阵的时候,你就不能将它对角化,但是:

A和A的转置特征值特征向量是一样的。这就有的玩了。我先求A*A的转置。假设求出来的矩阵是W,它绝对是一个方阵。那么好了,我求这个方阵的特征向量,然后对它做特征分解,将它化为一个对角矩阵。

那么A的特征值其实就是S特征值开根号。当然嘛。|A|就是等于特征值相乘的,|S|就是|A|的平方。而A和A的转置特征向量相同。那不就求出了svd分解里的对角阵么。

接下来求那写用户属性特征向量和电影属性特征向量。其实就是求S的特征向量,然后做点矩阵乘法就可以了。留点悬念,请看代码:

时间: 2024-12-31 22:53:34

如何轻松干掉svd(矩阵奇异值分解),用代码说话的相关文章

Ubuntu下C++基于eigen库SVD矩阵奇异值分解效率分析

在优化求解问题中,经常要用到矩阵奇异值的SVD分解. 奇异值分解 (singularvalue decomposition,SVD)是一种可靠地正交矩阵分解法,它比QR分解法要花上近十倍的计算时间. 使用SVD分解法的用途是解最小平方误差法和数据压缩. 在Ubuntu下基于eigen C++库测试了eigen SVD算法的性能,即SVD求解最小二乘/伪逆,代码如下: //compile: g++ test_svd.cpp #include <iostream> #include <Eig

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected] 前言: 上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的.在上篇文章中便是基于特征值分解的一种解释.特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计

【甘道夫】MapReduce实现矩阵乘法--实现代码

之前写了一篇分析MapReduce实现矩阵乘法算法的文章:[甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序执行,今天编写了实现代码供大家参考. 编程环境: java version "1.7.0_40" Eclipse Kepler Windows7 x64 Ubuntu 12.04 LTS Hadoop2.2.0 Vmware 9.0.0 build-812388 输入数据: A矩阵存放地址:hdfs://singlehadoop:8020/wordsp

CUDA 矩阵相乘完整代码

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <stdlib.h>#include <time.h>#include "cublas_v2.h" #define BLOCK_SIZE 16 cudaError_t multiCuda(float *c, float *a, flo

WCF 代理 是怎么工作的?用代码说话

1.WCF生成代理的方式 2.WCF代理原理 第一个问题引用 一篇Robin's博文[WCF生成客户端对象方式解析] 讲述了创建客户端服务对象的方法 1.代理构造法 a.开启服务后,添加服务引用 b.知道元数据地址,通过svcutli.exe生成代理类和配置文件 c.从服务契约DLL中导出元数据,然后更具本地的元数据文件生成代理类和配置文件 d.知道元数据地址,自己编写代码生成(使用ServiceContractGenerator类等),生成代理类和配置文件 2.通道工厂(ChannelFact

js 也来 - 【拉勾专场】抛弃简历!让代码说话!

前些日子谢亮兄弟丢了一个链接在群里,我当时看了下,觉得这种装逼题目没什么意思,因为每种语言都有不同的实现方法,你怎么能说你的方法一定比其他语言的好,所以要好的思路 + 好的语言特性运用才能让代码升华. 题目如下:<[拉勾专场]抛弃简历!让代码说话!> ? FizzBuzzWhizz 你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课.游戏的规则是: 1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3.5.7. 2. 让所有学生拍成一队,然后按顺序

(转)机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用

版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected] 前言: 上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的.在上篇文章中便是基于特征值分解的一种解释.特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有

强大的矩阵奇异值分解(SVD)及其应用

版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系 前言: 上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的.在上篇文章中便是基于特征值分解的一种解释.特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景.奇异值分解是一个有着

机器学习中的数学-强大的矩阵奇异值分解(SVD)及其应用《5》

版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected] 前言: 上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的.在上篇文章中便是基于特征值分解的一种解释.特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有