利用SVD-推薦未嘗過的菜肴2

推薦未嘗過的菜肴-基于SVD的評分估計

實際上數據集要比我們上一篇展示的myMat要稀疏的多。

from numpy import linalg as la
from numpy import *
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]]

一、計算一下到底有多少個奇異值能達到總能量的90%(下一篇我們將用一個函數實現該功能)

U, Sigma, VT = la.svd(mat(loadExData2()))
Sigma
array([15.77075346, 11.40670395, 11.03044558,  4.84639758,  3.09292055,2.58097379,  1.00413543,  0.72817072,  0.43800353,  0.22082113,0.07367823])
總能量:
Sig2 = Sigma ** 2 
sum(Sig2)
541.9999999999995
總能量的90%:
sum(Sig2) * 0.9
487.7999999999996
計算前兩個元素所包含的能量:
sum(Sig2[:2])
378.8295595113579
該值低于總能量的90%,計算前三個元素所包含的能量:
sum(Sig2[:3])
500.5002891275793
該值高于總能量的90%,我們將一個11維的矩陣轉換成一個三維的矩陣,下面對轉換后的三維空間構造出一個相似度計算函數

二、相似度計算(歐式距離、皮爾遜相關系數、余弦相似度)

# 相似度計算
# 計算歐式距離
def ecludSim(inA, inB):return 1.0 / (1.0 + la.norm(inA - inB))# pearsim()函數會檢查是否存在3個或更多的點
# corrcoef直接計算皮爾遜相關系數,范圍[-1, 1],歸一化后[0, 1]
def pearsSim(inA, inB):# 如果不存在,該函數返回1.0,此時兩個向量完全相關if len(inA) < 3:return 1.0return 0.5 + 0.5 * corrcoef(inA, inB, rowvar=0)[0][1]# 計算余弦相似度,如果夾角為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)

三、基于SVD的評分估計

# 基于SVD的評分估計
# 在recommend()中,這個函數用于替換對standEst()的調用,該函數對給定用戶、給定物品構建了一個評分估計值
def svdEst(dataMat, user, simMeas, item):"""svdEst()Args:dataMat  訓練數據集user     用戶編號simMeas  相似度計算方法item     未評分的物品編號Returns:ratSimTotal / simTotal   評分(0~5之間的值)"""# 物品數目n = shape(dataMat)[1]# 對數據集進行SVD分解simTotal = 0.0ratSimTotal = 0.0# 奇異值分解# 在SVD分解之后,我們只利用包含了90%能量值的奇異值,這些奇異值會以Numpy數組的形式得以保存U, Sigma, VT = la.svd(dataMat)# 如果要進行矩陣運算,就必須要用這些奇異值構建出一個對角矩陣Sig4 = mat(eye(4) * Sigma[: 4])# 利用U矩陣將物品轉換到低維空間中,構建轉換后的物品xformedItems = dataMat.T * U[:, :4] * Sig4.I# 對于給定的用戶,for循環在用戶對應行的元素上進行遍歷# 這和standEst()函數中的for循環的目的一樣,只不過這里的相似度計算是在低維空間下進行的for j in range(n):userRating = dataMat[user, j]if userRating == 0 or j == item:continue# 相似度的計算方法也會作為一個參數傳遞給該函數similarity = simMeas(xformedItems[item, :].T, xformedItems[j, :].T)# 對相似度不斷累加求和simTotal += similarity# 對相似度及對應評分值的乘積求和ratSimTotal += similarity * userRatingif simTotal == 0:return 0else:# 計算估計評分return ratSimTotal/simTotal

四、排序獲取最后的推薦結果

# recommend()函數,就是推薦引擎,它默認調用 svdEst()函數,產生了最高的N個推薦結果
# 如果不指定N的大小,則默認值為3,該函數另外的參數該包括相似度計算方法和估計方法
def recommend(dataMat, user, N=3, simMeas=cosSim, estMethod=svdEst):"""recommend()Args:dataMat 訓練數據集user    用戶編號simMeas 相似度計算方法estMethod 使用的推薦算法Returns:返回最終N個推薦結果"""# 尋找未評級的物品# 對給定用戶建立一個未評分的物品列表unratedItems = nonzero(dataMat[user, :].A == 0)[1]# 如果不存在未評分物品,那么就退出函數if len(unratedItems) == 0:return 'you rated everything'# 物品的編號和評分值itemScores = []for item in unratedItems:# 獲取 item 該物品的評分estimatedScore = estMethod(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))# 按照評分得分,進行逆排序,獲取前N個未評級物品進行推薦return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[: N]
myMat = mat(loadExData2())
recommend(myMat, 1, simMeas=pearsSim)
[(4, 3.346952186702173), (9, 3.33537965732747), (6, 3.3071930278130366)]
這表明用戶1(從0開始計數,對應是矩陣第2行),對物品4的預測評分為3.34,對物品9預測評分為3.33,對物品6預測評分為3.30
試試另一種相似度
recommend(myMat, 1, simMeas=cosSim)
[(4, 3.344714938469228), (7, 3.3294020724526967), (9, 3.3281008763900686)]

?

轉載于:https://www.cnblogs.com/gezhuangzhuang/p/10205284.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449879.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449879.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449879.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在圖像中截取小圖并保存

實現以橫向步長step_row、縱向步長step_col&#xff0c;在一幅大圖上剪裁寬度為width、高度為height的小圖像&#xff0c;圖像命名形式為“數字(遞增)_大圖名”格式&#xff0c;將小圖保存在argv[6]的文件夾中。 #include <opencv2/opencv.hpp> #include <string> …

Linux 文件與目錄管理、ls、cd、pwd、mkdir、rmdir、cp、 rm

見&#xff1a;http://www.runoob.com/linux/linux-file-content-manage.html我們知道Linux的目錄結構為樹狀結構&#xff0c;最頂級的目錄為根目錄 /。 其他目錄通過掛載可以將它們添加到樹中&#xff0c;通過解除掛載可以移除它們。 在開始本教程前我們需要先知道什么是絕對路…

軟件設計的真諦

假設我們身邊的一切都是用制造材料加以描述的&#xff1a;“空調”不是“空調”&#xff0c;而是“由金屬和塑料做成的物體”&#xff1b;“書”不是“書”&#xff0c;而是“由纖維和墨做成的物體”。溝通時我們也不用“空調”和“書”這樣的詞匯&#xff0c;而是“金屬和塑料…

脫單特質

1.上進心 所有人都想過好日子&#xff0c;物質不行&#xff0c;一定要有上進心&#xff0c;可以做出未來給予 2.外在形象 注重打理外在形象&#xff0c;所有人都是愛美的 3.無法控制自己&#xff0c;同時不去了解女生 控制住自己&#xff0c;才有更多的時間去了解和思考女…

云棲社區云棲號(團隊博客)攻略【2018版】

云棲社區云棲號是什么&#xff1f; 這是一個為技術團隊打造的專區&#xff08;小站&#xff09;&#xff0c;團隊成員的技術文章將在這里匯總&#xff0c;可以幫助團隊沉淀優質技術內容、打造技術品牌和影響力等。 云棲號申請條件 點擊https://yq.aliyun.com/teams頁面右側的【…

1030 完美數列 (25 分)二分

1030 完美數列 &#xff08;25 分&#xff09;給定一個正整數數列&#xff0c;和正整數 p&#xff0c;設這個數列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;則稱這個數列是完美數列。 現在給定參數 p 和一些正整數&#xff0c;請你從中選擇盡可能…

兩性位置

男生不被女生當回事&#xff0c;在自己身上&#xff0c;需要從自身找原因 1.過度看重對方&#xff0c;會讓對方看輕自己 2。氣場比較弱&#xff0c;本身實力弱&#xff0c;會讓對方俯視自己 3.太過善良&#xff0c;一昧遷就&#xff0c;會導致自己失去生活重心&#xff0c;讓…

高質高效軟件開發組織能力模型

背景至今&#xff0c;我在Motorola網絡部工作超過了5年&#xff0c;所在的產品線也是采用統一軟件開發過程和敏捷思想(但不是SCRUM)來組織軟件開發活動的&#xff0c;但這5年多的工作經歷從未引起我象微博上對于SCRUM話題的激烈討論這樣的思考。原因之一可能是&#xff0c;公司…

python并發編程之多線程

多線程 線程 1.什么是線程 進程是一個執行空間 , 線程就是其中真正工作的單位 , 每一個進程至少有一個線程(如果我們把操作系統比喻為一個工廠 , 進程就是車間 , 線程就是流水線) 進程包含了運行該程序所需要所有資源 , 進程是一個資源單位 , 線程是CPU的最小執行單位 每一個進…

JavaScript幾個難點

1. 立即執行函數 立即執行函數&#xff0c;即Immediately Invoked Function Expression (IIFE)&#xff0c;正如它的名字&#xff0c;就是創建函數的同時立即執行。它沒有綁定任何事件&#xff0c;也無需等待任何異步操作&#xff1a; (function() { // 代碼 // ...})(); f…

真格量化學習

真格量化學習使用 期權的量化回測 引入必須的庫: from PoboAPI import * import datetime import time import numpy as np初始化參數設定 以50為例 def OnStart(context) :print("I\m starting...")#設定一個全局變量品種,本策略交易50ETF期權g

智能小程序檔案館——如何給“包”瘦身

上傳小程序代碼的時候包體積太大不知如何是好&#xff1f;小程序打開速度慢&#xff0c;流量耗費大不知如何優化&#xff1f;在今天的文章里&#xff0c;我們一起來討論一下如何給“包”瘦身。 為什么要限制包的大小&#xff1f; 我們都知道小程序作為一種 Hybrid 的解決方案&a…

軟件架構師的能力與特質

軟件開發工程師的職業發展無非兩大類&#xff1a;一是做“官”&#xff0c;從事管理工作&#xff1b;二則繼續從事技術工作。對于后者&#xff0c;軟件架構師&#xff08;software architect&#xff09;是很多軟件開發工程師追求的理想崗位。在這我想談一談軟件架構師所需的幾…

IntelliJ IDEA編碼設置

見&#xff1a;https://www.cnblogs.com/winner-0715/p/6364306.html項目中為了避免亂碼等問題應該使用UTF-8編碼方式,其實把編碼方式設置成UTF-8是創建完項目后就要做的事,按照如圖所示進行設置&#xff1a;這里要將Transparent native-to-ascii conversion選項勾選, 否則項目…

C#實現像微信PC版一樣的掃碼登錄功能

現在好些網站都支持掃碼登錄,感覺上安全了很多,但是本地程序掃碼登錄的不多,就用C#實現了一下,需要作如下準備 在官網上申請一個企業微信,有條件的話做個企業認證吧,我們的是認證過的,所以賬號和本地其他系統的賬號是統一的.在應用中創建一個應用,這個是關鍵,我們掃碼就是和它有…

JVM(一)史上最佳入門指南

2019獨角獸企業重金招聘Python工程師標準>>> 提到Java虛擬機&#xff08;JVM&#xff09;&#xff0c;可能大部分人的第一印象是“難”&#xff0c;但當讓我們真正走入“JVM世界”的時候&#xff0c;會發現其實問題并不像我們想象中的那么復雜。唯一真正令我們恐懼的…

如何成為一個技術“牛人”

今天給浙江大學過來的幾個還沒有畢業的研究生做面試&#xff0c;這些研究生是想來公司實習的。在面試的過程中&#xff0c;一個學生問我“我們有C/C、JAVA等等多種語言&#xff0c;我如何才能成為某一方面的一個技術牛人呢&#xff1f;這一問題一直困擾著我”&#xff0c;對于這…

python量化數據處理小細節(以后還會不斷補充)

使用tushare數據源獲取數據后處理 以下都是本人在獲得數據后&#xff0c;進行量化回測時&#xff0c;處理數據遇到的各種坑以及解決方案&#xff0c;有些甚至都很幼稚&#xff0c;切勿嘲笑 獲取數據 導包 import tushare as ts import pandas as pd import matplotlib #(ju…

Linux find和grep的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 grep是查找文件中匹配條件的行&#xff0c;find是搜索匹配條件的文件。 1.find:查找文件或目錄語法: find 查找位置 文件名或目錄名如:在…

Mysql 忘記密碼重置教程

https://jingyan.baidu.com/article/454316ab4e9e65f7a7c03ad1.html 百度經驗轉載于:https://www.cnblogs.com/leaf-cq/p/10410694.html