第14章 利用SVD簡化資料

2021-08-20 19:03:05 字數 4161 閱讀 1016

優點:簡化資料,去除雜訊,提高演算法的結果

缺點:資料的轉換可能難以理解

適用資料型別:數值型資料

隱性語義索引(latent semantic indexing,lsi)/隱性語義分析(latent semantic analysis,lsa)

推薦系統

協同過濾(collaborative filtering):通過將使用者和其他使用者的資料進行對比來實現推薦。

(協同過濾中並不關心物品的描述屬性,而是嚴格地按照許多使用者的觀點來計算相似度):

將相似度的範圍歸一化到0-1,越接近0,相似度越低。越接近1,相似度越高。

歐式距離:

相似度 = 1/(1+距離)

#相似度計算:假定ina和inb都是列向量

#基於歐式距離:euclidean distance

#歐式距離是二正規化,可以使用norm來實現

def euclidsim(ina, inb):

return 1.0 / (1.0 + la.norm(ina - inb))

皮爾遜相關係數(pearson correlation):corrcoef()[[-1,1]---->0.5 + 0.5 * corrcoef()

#皮爾遜相關係數(-1,1):歸一化到(0,1)

def pearssim(ina, inb):

if len(ina) < 3 :#此時兩個向量完全相關

return 0

return 0.5 + 0.5 * corrcoef(ina, inb, rowvar = 0)[0][1]

余弦相似度(cosine similarity):通過求範數得到linalg.norm()

#余弦相似度(-1,1),歸一化到(0,1)

def cossim(ina, inb):

num = float(ina.t * inb)

denom = la.norm(ina) * la.norm(inb)

return 0.5 + 0.5 * (num / denom)

具體過程:(1) 尋找使用者沒有評級的菜餚,即在使用者-物品矩陣中的0值。

(2) 在使用者沒有評級的所有物品中,對每個物品預計乙個可能的評級分數。這就是說,我們認為使用者可能會對物品的打分

(3)對這些物品的評分從高到低進行排序,返回前n個物品。

思想:

根據使用者編號,和欲評級的菜餚編號。依次遍歷使用者對所有物品的評級。若沒有評級,則跳過。

反之,找到對欲評級物品和此時物品同**級的使用者評級資料,計算兩者間的相似度,並乘以該使用者對當前物品的評級。

將結果進行累積,並除以相似度總和作為該使用者對欲評級物品的乙個估計評級。

示例:

比如現在使用者號為1,找到其未評級的菜餚編號為1,2。

首先對1號物品進行評級估計。

依次遍歷該使用者對物品的評級。

使用者對0號物品有評級資料,則找到同時對0號和1號有評級的使用者評級資料,並計算相似度a,乘以使用者對0號物品的評級,即a*4

使用者對1號物品,跳過

使用者對2號物品無評級資料,跳過

使用者對3號物品有評級,同前面第三行操作,得到b*3

使用者對4號物品有評級,同上操作,得到c*3

遍歷完成。

得到對1號物品的評級估計為:(a*4 + b*3 + c*3)/(a + b + c)

然後對2號物品進行相同的操作,得到評級估計。

最後得到該使用者對所有未嘗過菜餚的評級估計,根據評級結果進行排序,得到評級分數較高的n個菜餚,進行推薦。

**:

'''

函式功能:計算在給定相似度計算方法的前提下,使用者對某一物品的估計評分值

輸入:資料集,使用者編號(從0開始),計算相似度方法,物品編號(從0開始)

輸出:該使用者對該物品的評級分數的預計

'''def standest(datamat, user, simmeas, item):

n = shape(datamat)[1]#獲得資料的列數,即物品個數

simtotal = 0.0#初始化相似度和

ratsimtotal = 0.0#初始化相似度*評分

datamat = mat(datamat)

#遍歷該使用者對應的所有物品:若該使用者對某個物品未評分,則跳過。反之,則找到對當前物品和欲評級物品同**級的資料,計算相似度

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]

#datamat[:,item].a轉換為陣列

#datamat[:,item].a>0,陣列中對應位置元素大於0(有評級),則為ture。反之為false

#logical_and:邏輯與(兩者同為1,與結果為1):同時對兩個物品評級為1,反之為0

#nonzero():返回非零元素的索引值。返回兩個矩陣:(array([0, 3, 4, 5, 6], dtype=int64), array([0, 0, 0, 0, 0], dtype=int64))

#表示相應維度上非零元素所在的行和列索引。

#nonzero()[0]表示非零元素所在行索引陣列

if len(overlap) == 0: #若沒有使用者同時對這兩件物品進行評級,則相似度為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 recommend(datamat, user, n=3, simmeas = cossim, estmethod = standest):

datamat = mat(datamat)

unrateditems = nonzero(datamat[user,:].a == 0)[1]#獲取該使用者未評級的物品編號

if len(unrateditems) == 0:#若所有物品均已評級

return 'you rated everything'

itemscores = #存放物品編號及對應的估計評級

#遍歷未被評級的物品,依次呼叫估計方法,獲得估計評級

for item in unrateditems:

estimatedscore = estmethod(datamat, user, simmeas, item)

#按照估計評級進行降序排列,並返回前n個物品編號,作為對該使用者未嘗過菜餚的推薦

return sorted(itemscores, key = lambda j:j[1], reverse = true)[:n]

奇異值分解 SVD 機器學習實戰第14章)

svd 奇異值分解 優點 簡化資料,去除雜訊點,提高演算法的結果 缺點 資料的轉換可能難以理解 適用於資料型別 數值型。通過svd對資料的處理,我們可以使用小得多的資料集來表示原始資料集,從有雜訊的資料中抽取相關特徵,這樣做實際上是去除了雜訊和冗餘資訊,以此達到了優化資料 提高結果的目的。最早的sv...

簡化資料 奇異值分解 SVD

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!author wepon blog 奇異值分解 singular value decomposition 簡稱svd,線性代數中矩陣分解的方法。假如有乙個矩陣a,對它進行奇異值分解,可以得到三個矩陣 這三個矩陣的大小 矩陣sigma 即上圖u和v中...

簡化資料 奇異值分解 SVD

author wepon blog 奇異值分解 singular value decomposition 簡稱svd,線性代數中矩陣分解的方法。假如有乙個矩陣a,對它進行奇異值分解,可以得到三個矩陣 這三個矩陣的大小 矩陣sigma 即上圖u和v中間的矩陣 除了對角元素不為0,其他元素都為0,並且對...