例如:32*32=1024 => 32*2+2*1+32*2=130(2*1表示去掉了除对角线的0), 几乎获得了10倍的压缩比。
'''打印矩阵 由于矩阵保护了浮点数,因此定义浅色和深色,遍历所有矩阵元素,当元素大于阀值时打印1,否则打印0 ''' 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('') '''实现图像压缩,允许基于任意给定的奇异值数目来重构图像 Args: numSV Sigma长度 thresh 判断的阈值 ''' def imgCompress(numSV=3, thresh=0.8): # 构建一个列表 myMat = imgLoadData('./0_5.txt') print("****original matrix****") # 对原始图像进行SVD分解并重构图像e printMat(myMat, thresh) # 通过Sigma 重新构成SigRecom来实现 # Sigma是一个对角矩阵,因此需要建立一个全0矩阵,然后将前面的那些奇异值填充到对角线上。 U, Sigma, VT = la.svd(myMat) # SigRecon = mat(zeros((numSV, numSV))) # for k in range(numSV): # SigRecon[k, k] = Sigma[k] # 分析插入的 Sigma 长度 # analyse_data(Sigma, 20) SigRecon = mat(eye(numSV) * Sigma[: numSV]) reconMat = U[:, :numSV] * SigRecon * VT[:numSV, :] print("****reconstructed matrix using %d singular values *****" % numSV) printMat(reconMat, thresh) 参考文献奇异值分解
中文维基百科
GitHub
图书:《机器学习实战》
图书:《自然语言处理理论与实战》
强大的矩阵奇异值分解(SVD)及其应用
奇异值分解 SVD 的数学解释
完整代码下载源码请进【机器学习和自然语言QQ群:436303759】文件下载: