机器学习实战精读--------奇异值分解(svd)

author author     2022-09-17     466

关键词:

奇异值分解(SVD):是一种强大的降维工具,通过利用SVD来逼近矩阵并从中提取重要特征,通过保留矩阵80%~ 90%的能量,就能得到重要的特征并去掉噪声

SVD分解会降低程序的速度,大型系统中SVD每天运行一次或者频率更低,并且还要离线进行。

隐性语义索引(LST):试图绕过自然语言理解,用统计的办法得到相同的目标

隐性语义分析(LSA):LSA的基本思想就是把高维的文档降到低维空间,那个空间被称为潜在语义空间

协同过滤:通过将用户和其它用户的数据进行对比来实现推荐。

协同过滤的缺点

① 用户对商品的评价非常稀疏,这样基于用户评价得到的用户间的相似性可能不准确(稀疏性问题)

② 随着用户和商品的增多,系统的性能会越来越低

⑤ 如果从来没有用户对一个商品进行评价,则这个商品就不可能被推荐(最初评价问题)

如何选择是基于物品的相似度还是基于用户的相似度?

基于数目小的

冷启动的解决方法:把推荐看做是搜索问题。

协同过滤的核心:相似度计算。

#coding:utf-8
from numpy import *
from numpy import linalg as la

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]]
    
#相似度=1/(1+距离)
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进行的。

#余弦相似度,计算两个向量夹角的余弦值,夹角为90度,相似度为0;如果两个向量方向相同,相似度为1.0
def cosSim(inA,inB):
    num = float(inA.T*inB)
    denom = la.norm(inA)*la.norm(inB)
    return 0.5+0.5*(num/denom)
#计算给定相似度计算方法下,用户对物品的估计评分值
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]
        if userRating == 0: continue
        overLap = nonzero(logical_and(dataMat[:,item].A>0,                                       dataMat[:,j].A>0))[0]
        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
#    
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
#产生最高的N个推荐结果
def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):
    unratedItems = nonzero(dataMat[user,:].A==0)[1]#find unrated items 
    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]

#打印矩阵
def printMat(inMat, thresh=0.8):
    for i in range(32):
        for k in range(32):
            if float(inMat[i,k]) > thresh:
                print 1,        #元素大于阀值打印1,否则打印0
            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)
    print "****original matrix******"
    printMat(myMat, thresh)
    U,Sigma,VT = la.svd(myMat)
    SigRecon = mat(zeros((numSV, numSV)))
    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

if __name__ == ‘__main__‘:
    imgCompress(2)

脚本执行输出:

****original matrix******

0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 

****reconstructed matrix using 2 singular values******


本文出自 “付炜超” 博客,谢绝转载!

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

https://www.cnblogs.com/donaldlee2008/p/5237100.html前言:   上一次写了关于PCA与LDA的文章,PCA的实现一般有两种,一种是用特征值分解去实现的,一种是用奇异值分解去实现的。在上篇文章中便是基于特征值分解的一种解释。... 查看详情

奇异值分解(svd)与在降维中的应用

  奇异值分解(SingularValueDecomposition,SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理做一个总... 查看详情

(转)机器学习之svd分解

一、SVD奇异值分解的定义  假设是一个的矩阵,如果存在一个分解:其中为的酉矩阵,为的半正定对角矩阵,为的共轭转置矩阵,且为的酉矩阵。这样的分解称为的奇异值分解,对角线上的元素称为奇异值,称为左奇异矩... 查看详情

常见机器学习算法原理+实践系列2(svd)

SVD奇异值分解利用SingularValueDecomposition奇异值分解,我们能够用小得多的数据集来表示原始数据集,可以理解为了去除噪音以及冗余信息。假设A是一个m*n的矩阵,通过SVD分解可以把A分解为以下三个矩阵:其中U为m*m矩阵,里面的... 查看详情

奇异值分解(svd)原理与在降维中的应用

...  奇异值分解(SingularValueDecomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的原理... 查看详情

机器学习的数学基础-特征分解与奇异值分解

 特征分解             奇异值分解(SingularValueDecomposition,SVD)   查看详情

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

转载自点击打开链接感谢版权声明:   本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com,本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gmail.com。也可以加我的微博: @leftnotea... 查看详情

5.6tensorflow2实现奇异值分解(svd)——python实战(下篇)(代码片段)

文章目录奇异值计算算法tensorflow2实现奇异值分解与矩阵近似F-范数矩阵的最优近似矩阵的外积展开式tensorflow2实现参考资料importtensorflowastfprint("TensorFlowversion:",tf.__version__)TensorFlowversion:2.8.05.6tensorflow2实现奇异值分解 查看详情

奇异值分解(svd)原理及应用(代码片段)

...与特征值基础知识:  特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈... 查看详情

奇异值分解(svd)

简介SVD(SingularValueDecomposition)记录一下学习奇异值分解中的小知识点,具体参考线代黄书和《统计学习方法》由先前的知识我们得知对角化在许多应用中很重要,然而,并非所有矩阵都有分解式A=PDP−1A=PDP^-1A=P... 查看详情

机器学习:降维工具-svd(代码片段)

SVD(SingularValueDecomposition,奇异值分解)是一种强大的降维工具??很多情况下,数据的一小段携带了大部分信息,其他要么是噪声,要么就是毫不相关的信息,SVD是矩阵分解的一种,可以把SVD看成是从噪声数据中抽取相关特征??优... 查看详情

SVD、奇异值分解后矩阵值增加

...【发布时间】:2016-01-1007:45:02【问题描述】:我正在尝试学习用于图像处理的SVD...比如压缩。我的方法:使用ImageIO将图像作为BufferedImage...获取RGB值并使用它们来获取等效的灰度值(位于0-255之间)并将其存储在double[][]数 查看详情

机器学习实战基础(二十三):sklearn中的降维算法pca和svdpca与svd之pca中的svd(代码片段)

 PCA中的SVD1PCA中的SVD哪里来?细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,PCA和SVD涉及了大量的矩阵计算,两者都是运... 查看详情

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

机器学习中的矩阵方法04:SVD分解 前面我们讲了QR分解有一些优良的特性,但是QR分解仅仅是对矩阵的行进行操作(左乘一个酉矩阵),可以得到列空间。这一小节的SVD分解则是将行与列同等看待,既左乘酉矩阵,又右乘酉矩... 查看详情

机器学习——降维(主成分分析pca线性判别分析lda奇异值分解svd局部线性嵌入lle)

机器学习——降维(主成分分析PCA、线性判别分析LDA、奇异值分解SVD、局部线性嵌入LLE)以下资料并非本人原创,因为觉得石头写的好,所以才转发备忘(主成分分析(PCA)原理总结)[https://mp.weixin.qq.com/s/XuXK4inb9Yi-4ELCe_i0EA]来源:?... 查看详情

降维-奇异值分解svd

...,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。   在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做featurereduction的PCA,做数据压缩(以图... 查看详情

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

转载自点击打开链接感谢版权声明:   本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com,本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gmail.com。也可以加我的微博: @leftnotea... 查看详情

svd分解

...,可以看做对称方正在任意矩阵上的一种推广,该方法在机器学习的中占有重要地位。    首先讲解一下SVD的理论,然后用python实现SVD,并应用于图像压缩。--------------------- 作者:夕阳下江堤上的男孩 来源... 查看详情