特征降維 實例


0_5.txt

00000000000000110000000000000000
00000000000011111100000000000000
00000000000111111110000000000000
00000000001111111111000000000000
00000000111111111111100000000000
00000001111111111111110000000000
00000000111111111111111000000000
00000000111111100001111100000000
00000001111111000001111100000000
00000011111100000000111100000000
00000011111100000000111110000000
00000011111100000000011110000000
00000011111100000000011110000000
00000001111110000000001111000000
00000011111110000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000001111100000000011111000000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000011111000000
00000000111110000000111111000000
00000000111111000001111110000000
00000000011111111111111110000000
00000000001111111111111110000000
00000000001111111111111110000000
00000000000111111111111000000000
00000000000011111111110000000000
00000000000000111111000000000000

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

@author: Peter
'''

from numpy import *
from numpy import linalg as la

#輸入數據:用戶-菜餚
#行:用戶,列:菜餚
#數字表示用戶對菜餚的喜好評分1-5,0表示未品嘗該菜
def loadExData0():
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 loadExData():
return[[4, 4, 0, 2, 2],
[4, 0, 0, 3, 3],
[4, 0, 0, 1, 1],
[1, 1, 1, 2, 0],
[2, 2, 2, 0, 0],
[1, 1, 1, 0, 0],
[5, 5, 5, 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 loadExData1():
return[[2, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0],
[3, 3, 4, 0, 3, 0, 0, 2, 2, 0, 0],
[5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0],
[4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4],
[0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0],
[0, 0, 0, 3, 0, 0, 0, 0, 4, 5, 0],
[1, 1, 2, 1, 1, 2, 1, 0, 4, 5, 0]]


#基於歐氏距離的相似度:1/(1+歐氏距離)
def ecludSim(inA,inB): #A,B兩個樣本向量
#庫函數la.norm()計算歐式距離
return 1.0/(1.0 + la.norm(inA - inB))

#基於皮爾森相關系數的相似度:0.5+0.5*corrcoef()
def pearsSim(inA,inB):
if len(inA) < 3 : return 1.0
#corrcoef()返回的是2*2的對稱矩陣,索引[0][1]或者[1][0]都行
#並將值范圍[-1,1]歸一化到[0,1]
return 0.5+0.5*corrcoef(inA, inB, rowvar = 0)[0][1]

#基於余弦夾角的相似度
def cosSim(inA,inB):
num = float(inA.T*inB)
denom = la.norm(inA)*la.norm(inB)
#將余弦夾角值[-1,1]歸一化到[0,1]
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):
#用戶user對j物品評分
userRating = dataMat[user,j]
#(1)若未對物品j評分,即userRating=0,不處理
if userRating == 0: continue
#(2)若對物品j評分:
#統計對物品item和物品j都評分的用戶編號
overLap = nonzero(logical_and(dataMat[:,item].A>0, \
dataMat[:,j].A>0))[0]
#(2.1)若沒有用戶同時對物品item和j評分,則兩物品間相似度為0
if len(overLap) == 0: similarity = 0
#(2.2)若有用戶同時對物品item和j評分,抽取出來,計算相似度
else: similarity = simMeas(dataMat[overLap,item],dataMat[overLap,j])
print 'the %d and %d similarity is: %f' % (item, j, similarity)
#相似度求和
simTotal += similarity
#預測用戶user對物品item評分總和
ratSimTotal += similarity * userRating
if simTotal == 0: return 0
#歸一化預測評分
else: return ratSimTotal/simTotal

#基於SVD的評分估計
#輸入:dataMat 用戶數據
#user:用戶編號(行)
#simMeas:相似度計算函數
#item:物品編號(列),用戶待預測的物品
def svdEst(dataMat, user, simMeas, item):
#物品數
n = shape(dataMat)[1]
simTotal = 0.0; ratSimTotal = 0.0
#SVD分解
U,Sigma,VT = la.svd(dataMat)
#構建對角矩陣,取前3個奇異值
#3個額外算出來的,確保總能量>90%
Sig3 = mat(eye(3)*Sigma[:3])
#SVD降維,重構低維空間的物品#.I求逆
xformedItems = dataMat.T * U[:,:3] * Sig3.I
#遍歷所有物品
for j in range(n):
#用戶user對j物品評分
userRating = dataMat[user,j]
#若未對物品j評分,即userRating=0,不處理
if userRating == 0 or j==item: continue
#在低維空間計算物品j與物品item的相似度
similarity = simMeas(xformedItems[item,:].T,\
xformedItems[j,:].T)
print 'the %d and %d similarity is: %f' % (item, j, similarity)
#相似度求和
simTotal += similarity
#預測用戶user對物品item評分總和
ratSimTotal += similarity * userRating
if simTotal == 0: return 0
#歸一化預測評分
else: return ratSimTotal/simTotal

#基於物品相似度的推薦
#dataMat: 數據
#user: 用戶編號
# N: 選擇預測評分最高的N個結果
#simMeas: 相似度計算方法
#estMethod:用戶對物品的預測估分方法
def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=standEst):
#找沒有被用戶user評分的物品
unratedItems = nonzero(dataMat[user,:].A==0)[1]
#若都評分則退出,不需要再推薦
if len(unratedItems) == 0: return 'you rated everything'
itemScores = []
#遍歷未評分的物品
for item in unratedItems:
#預測用戶user對為評分物品item的估分
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):
#閾值>0.8,輸出1.
if float(inMat[i,k]) > thresh:
print 1,
#閾值<0.8,輸出0.
else: print 0,
print ''

#*****圖像壓縮
def imgCompress(numSV=3, thresh=0.8):
myl = []
#讀.txt文件,轉換為矩陣存儲到myMat中
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)
#SVD分解
U,Sigma,VT = la.svd(myMat)
#初始化numSV*numSV的零矩陣SigRecon
SigRecon = mat(zeros((numSV, numSV)))
#Sigma對角線前numSV個值重構對角矩陣SigRecon
for k in range(numSV):
SigRecon[k,k] = Sigma[k]
#重構后的圖像矩陣
reconMat = U[:,:numSV]*SigRecon*VT[:numSV,:]
print "****reconstructed matrix using %d singular values******" % numSV
#輸出閾值處理后的重構圖像
printMat(reconMat, thresh)

if __name__=="__main__":
imgCompress(2)
# #(1)*****測試奇異值分解的結果:
# data=[[1,1,1,0,0],
# [2,2,2,0,0],
# [1,1,1,0,0],
# [5,5,5,0,0],
# [1,1,0,2,2],
# [0,0,0,3,3],
# [0,0,0,1,1]]
# U,sigma,VT=linalg.svd(data)
# print'sigma=',sigma
# print'U=',U
# print'VT=',VT
# # #低秩重構,取前3個奇異值
# sigma3=mat([[sigma[0],0,0],[0,sigma[1],0],[0,0,sigma[2]]])
# recondata=U[:,:3]*sigma3*VT[:3,:]
# print'recondata='
# print recondata

## #(2)*****基於物品相似度的推薦,未用到SVD
## data=loadExData()
## #data=loadExData2() #用的是loadExData2()
## data=mat(data)
## itemscores=recommend(data,5) #對用戶2推薦
## print 'recommend result:'
## print itemscores

# #(3)*****svd 查看能量分布
# data=loadExData2()
# u,sigma,vT=linalg.svd(mat(data))
# print 'sigma=', sigma
# sigma2=sigma**2
# print 'all energy=',sum(sigma2)#總能量
# print '90% of all energy=',sum(sigma2)*0.9 #總能量的90%
# #sigma_len=len(sigma) #奇異值個數
# # for i in range(sigma_len)
# print 'energy of the first 2 Singular value=',sum(sigma2[:2])#前幾個奇異值能量求和
# print 'energy of the first 3 Singular value=',sum(sigma2[:3])
#
#
# ##(4)*****基於svd推薦:
# data=loadExData2()
# data=mat(data)
# itemscores=recommend(data,1,estMethod=svdEst) #對用戶1推薦,余弦夾角
# #對用戶1推薦,皮爾遜系數
# #itemscores=svdRec.recommend(data,1,estMethod=svdRec.svdEst,simMeas=svdRec.pearsSim)
# print 'recommend result:'
# print itemscores
#-*- coding: utf-8 -*-
from numpy import*
from numpy import linalg as la

import svdRec

#圖像SVD壓縮
svdRec.imgCompress(2)

###*****SVD的調用,及sigma輸出格式,如何取對角矩陣
##data=[[1, 1, 1, 0, 0],
## [2, 2, 2, 0, 0],
## [1, 1, 1, 0, 0],
## [5, 5, 5, 0, 0],
## [1, 1, 0, 2, 2],
## [0, 0, 0, 3, 3],
## [0, 0, 0, 1, 1]]
##
##u,sigma,vT=linalg.svd(data)
##print sigma
##sig3=mat([[sigma[0],0,0],[0,sigma[1],0],[0,0,sigma[2]]])
##recondata=u[:,:3]*sig3*vT[:3,:]
##print 'recondata=',recondata

##
###*****基於物品相似度的推薦,未用到SVD
##data=svdRec.loadExData() #用的是loadExData()
###data=svdRec.loadExData2() #用的是loadExData2()
##data=mat(data)
##itemscores=svdRec.recommend(data,2) #對用戶2推薦
##print 'recommend result:'
##print itemscores



###*****svd 查看能量分布
##data=svdRec.loadExData2()
##u,sigma,vT=linalg.svd(mat(data))
##print 'sigma=', sigma
##sigma2=sigma**2
##print 'all energy=',sum(sigma2)#總能量
##print '90% of all energy=',sum(sigma2)*0.9 #總能量的90%
##print 'energy of the first 2 Singular value=',sum(sigma2[:2])#前幾個奇異值能量求和
##print 'energy of the first 3 Singular value=',sum(sigma2[:3])
##

####*****基於svd推薦:
##data=svdRec.loadExData2()
##data=mat(data)
##itemscores=svdRec.recommend(data,1,estMethod=svdRec.svdEst) #對用戶1推薦,余弦夾角
###對用戶1推薦,皮爾遜系數
###itemscores=svdRec.recommend(data,1,estMethod=svdRec.svdEst,simMeas=svdRec.pearsSim)
##print 'recommend result:'
##print itemscores

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com