机器学习Python实现 SVD 分解

这篇文章主要是结合机器学习实战将推荐算法和SVD进行相应的结合

任何一个矩阵都可以分解为SVD的形式

其实SVD意义就是利用特征空间的转换进行数据的映射,后面将专门介绍SVD的基础概念,先给出python,这里先给出一个简单的矩阵,表示用户和物品之间的关系

这里我自己有个疑惑?

对这样一个DATA = U(Z)Vt

这里的U和V真正的几何含义  :  书上的含义是U将物品映射到了新的特征空间, V的转置  将 用户映射到了新的特征空间

下面是代码实现,同时SVD还可以用于降维,降维的操作就是通过保留值比较的奇异值

# -*- coding: cp936 -*-
'''
Created on Mar 8, 2011

@author: Peter
'''
from numpy import *
from numpy import linalg as la #用到别名

#这里主要结合推荐系统介绍SVD,所以这里的数据都可以看成是用户对物品的一个打分
def loadExData():
    return[[0, 0, 0, 2, 2],
           [0, 0, 0, 3, 3],
           [0, 0, 0, 1, 1],
           [1, 1, 1, 0, 0],
           [2, 2, 2, 0, 0],
           [5, 5, 5, 0, 0],
           [1, 1, 1, 0, 0]]

def loadExData2():
    return[[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],
           [0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],
           [0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],
           [3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],
           [5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],
           [0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],
           [4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],
           [0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],
           [0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],
           [0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],
           [1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]]

def ecludSim(inA,inB):
    return 1.0/(1.0 + la.norm(inA - inB))  #计算向量的第二范式,相当于直接计算了欧式距离

def pearsSim(inA,inB):
    if len(inA) < 3 : return 1.0
    return 0.5+0.5*corrcoef(inA, inB, rowvar = 0)[0][1] #corrcoef直接计算皮尔逊相关系数

def cosSim(inA,inB):
    num = float(inA.T*inB)
    denom = la.norm(inA)*la.norm(inB)
    return 0.5+0.5*(num/denom)  #计算余弦相似度

#协同过滤算法
#dataMat 用户数据 user 用户 simMeas 相似度计算方式 item 物品
def standEst(dataMat, user, simMeas, item):
    n = shape(dataMat)[1] #计算列的数量,物品的数量
    simTotal = 0.0; ratSimTotal = 0.0
    for j in range(n):
        userRating = dataMat[user,j]
        print(dataMat[user,j])
        if userRating == 0: continue  #如果用户u没有对物品j进行打分,那么这个判断就可以跳过了
        overLap = nonzero(logical_and(dataMat[:,item].A>0,                                       dataMat[:,j].A>0))[0]    #找到对物品 j 和item都打过分的用户
        if len(overLap) == 0: similarity = 0
        else: similarity = simMeas(dataMat[overLap,item], dataMat[overLap,j])     #利用相似度计算两个物品之间的相似度

        print 'the %d and %d similarity is: %f' % (item, j, similarity)
        simTotal += similarity
        ratSimTotal += similarity * userRating  #待推荐物品与用户打过分的物品之间的相似度*用户对物品的打分
    if simTotal == 0: return 0
    else: return ratSimTotal/simTotal

#利用SVD进行分解,但是这里是直接用的库里面的函数
    #如果自己实现一个SVD分解,我想就是和矩阵论里面的求解知识是一样的吧,但是可能在求特征值的过程中会比较痛苦
def svdEst(dataMat, user, simMeas, item):
    n = shape(dataMat)[1]
    simTotal = 0.0; ratSimTotal = 0.0
    U,Sigma,VT = la.svd(dataMat) #直接进行分解
    Sig4 = mat(eye(4)*Sigma[:4]) #arrange Sig4 into a diagonal matrix
    xformedItems = dataMat.T * U[:,:4] * Sig4.I  #create transformed items
    for j in range(n):
        userRating = dataMat[user,j]
        if userRating == 0 or j==item: continue
        similarity = simMeas(xformedItems[item,:].T,                             xformedItems[j,:].T)
        print 'the %d and %d similarity is: %f' % (item, j, similarity)
        simTotal += similarity
        ratSimTotal += similarity * userRating
    if simTotal == 0: return 0
    else: return ratSimTotal/simTotal

#真正的推荐函数,后面两个函数就是采用的相似度的计算方法和推荐用的方法
def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):
    unratedItems = nonzero(dataMat[user,:].A==0)[1]  #find unrated items  nonzero()[1]返回的是非零值所在的行数,返回的是一个元组   if len(unratedItems) == 0: return 'you rated everything'
    itemScores = []
    for item in unratedItems:
        estimatedScore = estMethod(dataMat, user, simMeas, item)
        itemScores.append((item, estimatedScore))
    return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N]

#扩展的例子,利用SVD进行图像的压缩
#将图像打印出来
def printMat(inMat, thresh=0.8):
    for i in range(32):
        for k in range(32):
            if float(inMat[i,k]) > thresh:
                print 1,
            else: print 0,
        print ''

#最后发现重构出来的数据图是差不多的
def imgCompress(numSV=3, thresh=0.8):
    myl = []
    for line in open('0_5.txt').readlines():
        newRow = []
        for i in range(32):
            newRow.append(int(line[i]))
        myl.append(newRow)
    myMat = mat(myl)   #将数据读入了myMat当中

    print "****original matrix******"
    printMat(myMat, thresh)
    U,Sigma,VT = la.svd(myMat)
    SigRecon = mat(zeros((numSV, numSV)))   #构建一个3*3的空矩阵
    for k in range(numSV):#construct diagonal matrix from vector
        SigRecon[k,k] = Sigma[k]
    reconMat = U[:,:numSV]*SigRecon*VT[:numSV,:]
    print "****reconstructed matrix using %d singular values******" % numSV
    printMat(reconMat, thresh)

通过结果可以看到,降维前和降维后的图片基本都是相似的

时间: 2024-10-17 08:38:15

机器学习Python实现 SVD 分解的相关文章

python的svd分解

今天看书,发现svd公式,在网上查阅了一下资料,主要用到如下的两句:主要是两条语句:from numpy import *;U,Sigma,VT=linalg.svd([[1,1],[7,7]]); 用到的实例(李航<统计学习方法>第15章奇异值分解): from numpy import *A = array([[1,0,0,0],[0,0,0,4],[0,3,0,0],[0,0,0,0],[2,0,0,0]])U,sigma,V = linalg.svd(A)Uarray([[ 0. ,

机器学习中的矩阵方法04:SVD 分解

机器学习中的矩阵方法04:SVD 分解 前面我们讲了 QR 分解有一些优良的特性,但是 QR 分解仅仅是对矩阵的行进行操作(左乘一个酉矩阵),可以得到列空间.这一小节的 SVD 分解则是将行与列同等看待,既左乘酉矩阵,又右乘酉矩阵,可以得出更有意思的信息.奇异值分解( SVD, Singular Value Decomposition ) 在计算矩阵的伪逆( pseudoinverse ),最小二乘法最优解,矩阵近似,确定矩阵的列向量空间,秩以及线性系统的解集空间都有应用. 1. SVD 的形式

用Python做SVD文档聚类---奇异值分解----文档相似性----LSI(潜在语义分析)

转载请注明出处:电子科技大学EClab——落叶花开http://www.cnblogs.com/nlp-yekai/p/3848528.html SVD,即奇异值分解,在自然语言处理中,用来做潜在语义分析即LSI,或者LSA.最早见文章 An introduction to latent semantic analysis SVD的有关资料,从很多大牛的博客中整理了一下,然后自己写了个python版本,放上来,跟大家分享- 关于SVD的讲解,参考博客 本文由LeftNotEasy发布于http:

矩阵的SVD分解

转自 http://blog.csdn.net/zhongkejingwang/article/details/43053513(实在受不了CSDN的广告) 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充的,特别是关于矩阵和映射之间的对应关系.前段时间看了国外的一篇文章,叫A Singularly Valuable Decomposition The SVD of a Matrix,觉得分析的特别好,把矩阵和空间关系对应了起来.本文就参考了该文并结合矩阵的相关知识把SVD

机器学习---python环境搭建

一 安装python2.7 去https://www.python.org/downloads/ 下载,然后点击安装,记得记住你的安装路径,然后去设置环境变量,这些自行百度一下就好了. 由于2.7没有pip ,所以最好装下.这是下载地址 https://pypi.python.org/pypi/pip#downloads.下载好之后点击开始,搜索 CMD .输入 python setup.py install 你在cmd里面输入pip会显示这个,这表示pip也没有设置环境变量,你只要去你pyth

机器学习实战之SVD

1. 奇异值分解 SVD(singular value decomposition) 1.1 SVD评价 优点: 简化数据, 去除噪声和冗余信息, 提高算法的结果 缺点: 数据的转换可能难以理解 1.2 SVD应用 (1) 隐性语义索引(latent semantic indexing, LSI)/隐性语义分析(latent semantic analysis, LSA) 在LSI中, 一个矩阵由文档和词语组成的.在该矩阵上应用SVD可以构建多个奇异值, 这些奇异值代表文档中的概念或主题, 可以

SVD分解的理解

对称阵A 相应的,其对应的映射也分解为三个映射.现在假设有x向量,用A将其变换到A的列空间中,那么首先由U'先对x做变换: 由于正交阵" U的逆=U' ",对于两个空间来讲,新空间下的" 基E' 坐标 x' ,原空间E 坐标x "有如下关系 EX=E'X' ===> X=E'X' ===> X'=(E'的逆)x ==> x向量在新的"基"下的新坐标  (E的转置)X: 1.那么对于上式UTx先可以理解为:将x用A的所有特征向量表

SVD分解 求解超定方程组

做平差的时候,需要解误差方程组,而 有的书本上说解线性的误差方程组,并不需要初值. 在查阅了测量平差书本之后,书里描述,一般是需要参数的初始值的. 这就产生了疑问. 因为非线性方程的线性化之后,舍掉了二次项之后的值,会造成平差模型的弱化.因此在进行非线性方程的平差过程中,一般是对改正值进行一个迭代计算,使其精化. 而线性化之后的各参数的系数中,包含了其他的未知参数,因此在计算的过程之中,必须使用初值. 原本就是线性方程组的平差模型,也可以直接使用SVD分解来解误差方程组. 1.解最小二乘超定方程

Mathmatica SVD分解

mathmathica初识. Mathmatica 进行SVD分解,利用Help帮助获取SVD分解的函数SingularValueDecomposition[] 导入数据:G= Import["D:\\mathmatica\17.txt","Table"],此时以二维数组格式将数据储存之G数组中. 进行SVD分解: [U,S,Vt] = SingularValueDecomposition[G]; 以矩阵格式输出数组: MatirxForm[U]; MatrixFo