freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

初探推薦引擎五篇模版(編輯修改稿)

2024-11-14 18:12 本頁面
 

【文章內(nèi)容簡介】 發(fā)表的一篇關(guān)于基于 Mahout 實現(xiàn)推薦引擎的 developerWorks 文章,其中詳細介紹了 Mahout 的安裝步驟,并給出一個簡單的電影推薦引擎的例子。Apache Mahout 中提供的一個協(xié)同過濾算法的高效實現(xiàn),它是一個基于 Java 實現(xiàn)的可擴展的,高效的推薦引擎。圖 4 給出了 Apache Mahout 中協(xié)同過濾推薦實現(xiàn)的組件圖,下面我們逐步深入介紹各個部分。圖 數(shù)據(jù)表示:Data Model Preference基于協(xié)同過濾的推薦引擎的輸入是用戶的歷史偏好信息,在 Mahout 里它被建模為 Preference(接口),一個 Preference 就是一個簡單的三元組 用戶 ID, 物品 ID, 用戶偏好 ,它的實現(xiàn)類是 GenericPreference,可以通過以下語句創(chuàng)建一個 GenericPreference。GenericPreference preference = new GenericPreference(123, 456, )。這其中,123 是用戶 ID,long 型;456 是物品 ID,long 型; 是用戶偏好,float 型。從這個例子我們可以看出,單單一個 GenericPreference 的數(shù)據(jù)就占用 20 bytes,所以你會發(fā)現(xiàn)如果只簡單實用數(shù)組 Array 加載用戶偏好數(shù)據(jù),必然占用大量的內(nèi)存,Mahout 在這方面做了一些優(yōu)化,它創(chuàng)建了PreferenceArray(接口)保存一組用戶偏好數(shù)據(jù),為了優(yōu)化性能,Mahout 給出了兩個實現(xiàn)類,GenericUserPreferenceArray 和GenericItemPreferenceArray,分別按照用戶和物品本身對用戶偏好進行組裝,這樣就可以壓縮用戶 ID 或者物品 ID 的空間。下面清單 1 的代碼以 GenericUserPreferenceArray 為例,展示了如何創(chuàng)建和使用一個 PreferenceArray。清單 PreferenceArrayPreferenceArray userPref = new GenericUserPreferenceArray(2)。//size = 2(0, 1L)。(0, 101L)。// (0, )。(1, 102L)。// (1, )。Preference pref = (1)。//為了提高性能 Mahout 還構(gòu)建了自己的 HashMap 和 Set:FastByIDMap 和 FastIDSet,有興趣的朋友可以參考 Mahout 官方說明。DataModelMahout 的推薦引擎實際接受的輸入是 DataModel,它是對用戶偏好數(shù)據(jù)的壓縮表示,通過創(chuàng)建內(nèi)存版 DataModel 的語句我們可以看出:DataModel model = new GenericDataModel(FastByIDMapmap)。他保存在一個按照用戶 ID 或者物品 ID 進行散列的 PreferenceArray,而 PreferenceArray 中對應(yīng)保存著這個用戶 ID 或者物品 ID 的所有用戶偏好信息。DataModel 是用戶喜好信息的抽象接口,它的具體實現(xiàn)支持從任意類型的數(shù)據(jù)源抽取用戶喜好信息,具體實現(xiàn)包括內(nèi)存版的 GenericDataModel,支持文件讀取的 FileDataModel 和支持數(shù)據(jù)庫讀取的 JDBCDataModel,下面我們看看如何創(chuàng)建各種 DataModel。清單 DataModel//Inmemory DataModelFileDataModel DataModel dataModel = new FileDataModel(new File(“”)。//Databasebased DataModelPart 2: 深入推薦引擎相關(guān)算法協(xié)同過濾》。Mahout 中的向量 Vector 是一個每個域是浮點數(shù)(double)的復(fù)合對象,最容易聯(lián)想到的實現(xiàn)就是一個浮點數(shù)的數(shù)組。但在具體應(yīng)用由于向量本身數(shù)據(jù)內(nèi)容的不同,比如有些向量的值很密集,每個域都有值;有些呢則是很稀 疏,可能只有少量域有值,所以 Mahout 提供了多個實現(xiàn):,它的實現(xiàn)就是一個浮點數(shù)數(shù)組,對向量里所有域都進行存儲,適合用于存儲密集向量。 基于浮點數(shù)的 HashMap 實現(xiàn)的,key 是整形(int)類型,value 是浮點數(shù)(double)類型,它只存儲向量中不為空的值,并提供隨機訪問。 實現(xiàn)為整形(int)類型和浮點數(shù)(double)類型的并行數(shù)組,它也只存儲向量中不為空的值,但只提供順序訪問。用戶可以根據(jù)自己算法的需求選擇合適的向量實現(xiàn)類,如果算法需要很多隨機訪問,應(yīng)該選擇 DenseVector 或者 RandomAccessSparseVector,如果大部分都是順序訪問,SequentialAccessVector 的效果應(yīng)該更好。介紹了向量的實現(xiàn),下面我們看看如何將現(xiàn)有的數(shù)據(jù)建模成向量,術(shù)語就是“如何對數(shù)據(jù)進行向量化”,以便采用 Mahout 的各種高效的聚類算法。這種數(shù)據(jù)最簡單,只要將不同的域存在向量中即可,比如 n 維空間的點,其實本身可以被描述為一個向量。這類數(shù)據(jù)是對物體的描述,只是取值范圍有限。舉個例子,假設(shè)你有一個蘋果信息的數(shù)據(jù)集,每個蘋果的數(shù)據(jù)包括:大小,重量,顏色等,我們以顏 色為例,設(shè)蘋果的顏色數(shù)據(jù)包括:紅色,黃色和綠色。在對數(shù)據(jù)進行建模時,我們可以用數(shù)字來表示顏色,紅色 =1,黃色 =2,綠色 =3,那么大小直徑 8cm,重量 ,顏色是紅色的蘋果,建模的向量就是 。下面的清單 1 給出了對以上兩種數(shù)據(jù)進行向量化的例子。清單 // 創(chuàng)建一個二維點集的向量組public static final double[][] points = { { 1, 1 }, { 2, 1 }, { 1, 2 }, { 2, 2 }, { 3, 3 }, { 8, 8 }, { 9, 8 }, { 8, 9 }, { 9, 9 }, { 5, 5 }, { 5, 6 }, { 6, 6 }}。public static List getPointVectors(double[][] raw){ List points = new ArrayList()。for(int i = 0。i 。i++){double[] fr = raw[i]。// 這里選擇創(chuàng)建 RandomAccessSparseVectorVector vec = new RandomAccessSparseVector()。// 將數(shù)據(jù)存放在創(chuàng)建的 Vector 中 (fr)。(vec)。} return points。}// 創(chuàng)建蘋果信息數(shù)據(jù)的向量組public static List generateAppleData(){ List apples = new ArrayList()。// 這里創(chuàng)建的是 NamedVector,其實就是在上面幾種 Vector 的基礎(chǔ)上,//為每個 Vector 提供一個可讀的名字NamedVector apple = new NamedVector(new DenseVector(new double[] {, 510, 1}),“Small round green apple”)。(apple)。apple = new NamedVector(new DenseVector(new double[] {, 650, 3}),“Large oval red apple”)。(apple)。apple = new NamedVector(new DenseVector(new double[] {, 630, 1}),“Small elongated red apple”)。(apple)。apple = new NamedVector(new DenseVector(new double[] {, 590, 3}),“Large round yellow apple”)。(apple)。apple = new NamedVector(new DenseVector(new double[] {, 520, 2}),“Medium oval green apple”)。(apple)。return apples。}作為聚類算法的主要應(yīng)用場景逆向文本頻率(Term Frequency – Inverse Document Frequency, TFIDF):它是對 TF 方法的一種加強,字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在所有文本中出現(xiàn)的頻率成反比下降。舉個例子,對于“高頻無意義詞 匯”,因為它們大部分會出現(xiàn)在所有的文本中,所以它們的權(quán)重會大打折扣,這樣就使得文本模型在描述文本特征上更加精確。在信息檢索領(lǐng)域,TFIDF 是對文本信息建模的最常用的方法。o對于文本信息的向量化,Mahout 已經(jīng)提供了工具類,它基于 Lucene 給出了對文本信息進行分析,然后創(chuàng)建文本向量。下面的清單 2 給出了一個例子,分析的文本數(shù)據(jù)是路透提供的新聞數(shù)據(jù),參考資源里給出了下載地址。將數(shù)據(jù)集下載后,放在“clustering/reuters”目錄 下。清單 public static void documentVectorize(String[] args)throws Exception{ // , Mahout 提供了專門的方法()。// SequenceFile,因為這些工具類就是在 Hadoop 的基礎(chǔ)上做的,所以首先我們需要將數(shù)據(jù)寫// 成 SequenceFile,以便讀取和計算()。// SequenceFile 文件中的數(shù)據(jù),基于 Lucene 的工具進行向量化()。}public static void extractReuters(){ //ExtractReuters 是基于 Hadoop 的實現(xiàn),所以需要將輸入輸出的文件目錄傳給它,這里我們可以直接把它映// 射到我們本地的一個文件夾,解壓后的數(shù)據(jù)將寫入輸出目錄下File inputFolder = new File(“clustering/reuters”)。File outputFolder = new File(“clustering/reutersextracted”)。ExtractReuters extractor = new ExtractReuters(inputFolder, outputFolder)。()。}public static void transformToSequenceFile(){ //SequenceFilesFromDirectory 實現(xiàn)將某個文件目錄下的所有文件寫入一個 SequenceFiles 的功能// 它其實本身是一個工具類,可以直接用命令行調(diào)用,這里直接調(diào)用了它的 main 方法String[] args = {“c”, “UTF8”, “i”, “clustering/ reutersextracted/”, “o”, “clustering/reutersseqfiles”}。// 解釋一下參數(shù)的意義://c: 指定文件的編碼形式,這里用的是“UTF8” //i: 指定輸入的文件目錄,這里指到我們剛剛導(dǎo)出文件的目錄//o: 指定輸出的文件目錄try {(args)。} catch(Exception e){()。} }public static void transformToVector(){ //SparseVectorsFromSequenceFiles 實現(xiàn)將 SequenceFiles 中的數(shù)據(jù)進行向量化。// 它其實本身是一個工具類,可以直接用命令行調(diào)用,這里直接調(diào)用了它的 main 方法 String[] args = {“i”, “clustering/reutersseqfiles/”, “o”, “clustering/reutersvectorsbigram”, “a”, “” , “chunk”, “200”, “wt”, “tfidf”, “s”, “5”, “md”, “3”, “x”, “90”, “ng”, “2”, “ml”, “50”, “seq”}。// 解釋一下參數(shù)的意義://i: 指定輸入的文件目錄,這里指到我們剛剛生成 SequenceFiles 的目錄//o: 指定輸出的文件目錄//a: 指定使用的 Analyzer,這里用的是 lucene 的空格分詞的 Analyzer //chunk: 指定 Chunk 的大小,單位是 M。對于大的文件集合,我們不能一次 load 所有文件,所以需要 // 對數(shù)據(jù)進行切塊//wt: 指定分析時采用的計算權(quán)重的模式,這里選了 tfidf //s: 指定詞語在整個文本集合出現(xiàn)的最低頻度,低于這個頻度的詞匯將被丟掉//md: 指定詞語在多少不同的文本中出現(xiàn)的最低值,低于這個值的詞匯將被丟掉//x: 指定高頻詞匯和無意義詞匯(例如 is,a,the 等)的出現(xiàn)頻率上限,高于上限的將被丟掉//ng: 指定分詞后考慮詞匯的最大長度,例如 1gram 就是,coca,cola,這是兩個詞,// 2gram 時,coca cola 是一個詞匯,2gram 比 1gram 在一定情況 下分析的更準確。//ml: 指定判斷相鄰詞語是不是屬于一個詞匯的相似度閾值,當(dāng)選擇 1gram 時才有用,其實計算的是// Minimum Log Likelihood Ratio 的閾值 //seq: 指定生成的向量是SequentialAccessSparseVectors,沒設(shè)置時默 認生成還是// RandomAccessSparseVectorstry {(args)。} catch(Exception e){()。} }這里補充一點,生成的向量化文件的目錄結(jié)構(gòu)是這樣的:圖 2 文本信息向量化o o o o o o
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1