99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀基于用戶的協(xié)同過濾算法(Java實(shí)現(xiàn)或R語(yǔ)言實(shí)現(xiàn)
基于用戶的協(xié)同過濾算法(Java實(shí)現(xiàn)或R語(yǔ)言實(shí)現(xiàn)
2016-12-17
收藏

基于用戶的協(xié)同過濾算法(Java實(shí)現(xiàn)或R語(yǔ)言實(shí)現(xiàn)

協(xié)同過濾的步驟是:

創(chuàng)建數(shù)據(jù)模型 —> 用戶相似度算法 —>用戶近鄰算法 —>推薦算法。
基于用戶的協(xié)同過濾算法在Mahout庫(kù)中已經(jīng)模塊化了,通過4個(gè)模塊進(jìn)行統(tǒng)一的方法調(diào)用。首先,創(chuàng)建數(shù)據(jù)模型(DataModel),然后定義用戶的相似度算法(UserSimilarity),接下來(lái)定義用戶近鄰算法(UserNeighborhood ),最后調(diào)用推薦算法(Recommender)完成計(jì)算過程。而基于物品的協(xié)同過濾算法(ItemCF)過程也是類似的,去掉第三步計(jì)算用戶的近鄰算法就行了。

軟件環(huán)境:Win7 64位 + Eclipse4.4 +jdk1.6
使用Java語(yǔ)言,借用Mahout庫(kù)里的API,實(shí)現(xiàn)基于用戶的協(xié)同過濾算法,從而進(jìn)行商品推薦。
1.數(shù)據(jù)集
//testCF.csv

1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
該testCF.csv數(shù)據(jù)集中,第一列為用戶號(hào)UserID,第二列為商品號(hào)ItemID,第三列為評(píng)分Preference Value.
2.借用Java里Mahout庫(kù),實(shí)現(xiàn)協(xié)同過濾算法。
//UserBased.java
package com.xie;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.model.file.*;  
import org.apache.mahout.cf.taste.impl.neighborhood.*;  
import org.apache.mahout.cf.taste.impl.recommender.*;  
import org.apache.mahout.cf.taste.impl.similarity.*;  
import org.apache.mahout.cf.taste.model.*;   
import org.apache.mahout.cf.taste.recommender.*;  
import org.apache.mahout.cf.taste.similarity.*;  

import java.io.*;  
import java.util.*; 

public class UserBased {

    final static int NEIGHBORHOOD_NUM = 2;
    final static int RECOMMENDER_NUM = 3;

    public static void main(String[] args) throws IOException, TasteException {
        String file = "src/data/testCF.csv";
        DataModel model = new FileDataModel(new File(file));
        UserSimilarity user = new EuclideanDistanceSimilarity(model);
        NearestNUserNeighborhood neighbor = new NearestNUserNeighborhood(NEIGHBORHOOD_NUM, user, model);
        Recommender r = new GenericUserBasedRecommender(model, neighbor, user);
        LongPrimitiveIterator iter = model.getUserIDs();

        while (iter.hasNext()) {
            long uid = iter.nextLong();
            List<RecommendedItem> list = r.recommend(uid, RECOMMENDER_NUM);
            System.out.printf("uid:%s", uid);
            for (RecommendedItem ritem : list) {
                System.out.printf("(%s,%f)", ritem.getItemID(), ritem.getValue());
            }
            System.out.println();
        }
    }
}

效果如下:

基于用戶的協(xié)同過濾算法(Java實(shí)現(xiàn)或R語(yǔ)言實(shí)現(xiàn)圖(1) 協(xié)同過濾,從而進(jìn)行商品推薦
結(jié)果說(shuō)明:
對(duì)于uid=1的用戶,給他推薦計(jì)算得分最高的2個(gè)物品,104和106。
對(duì)于uid=2的用戶,給他推薦計(jì)算得分最高的1個(gè)物品,105。
對(duì)于uid=3的用戶,給他推薦計(jì)算得分最高的2個(gè)物品,103和102。
對(duì)于uid=4的用戶,給他推薦計(jì)算得分最高的1個(gè)物品,102。
對(duì)于uid=5的用戶,沒有推薦。
用Java實(shí)現(xiàn)協(xié)同過濾的工程代碼:
方法二:用R語(yǔ)言實(shí)現(xiàn)協(xié)同過濾算法
軟件環(huán)境:win7 64位 + RStudio 0.99 + R3.2.3
//mahout1.R

# part1 -------------------------------------------------------------------
##加載arules包
library(arules)

##建立模型矩陣
FileDataModel <- function(file){
    ##讀取CSV文件到內(nèi)存
    data <- read.csv(file,header = FALSE)  
    ##增加列名
    names(data) <- c("uid","iid","pref")

    ##計(jì)算用戶數(shù)
    user <- unique(data$uid)
    ##計(jì)算產(chǎn)品數(shù)
    item <- unique(sort(data$iid))
    uidx <- match(data$uid, user)
    iidx <- match(data$iid, item)
    ##定義存儲(chǔ)矩陣
    M <- matrix(0, length(user),length(item))
    i <- cbind(uidx, iidx, pref=data$pref)

    ##給矩陣賦值
    for(n in 1:nrow(i)){
        M[i[n,][1], i[n,][2]] <- i[n,][3]
    }

    dimnames(M)[[2]] <- item
    ##返回矩陣值
    M
}


# part2 -------------------------------------------------------------------
##歐式距離相似度算法
EuclideanDistanceSimilarity <- function(M){
    row <- nrow(M)
    ##相似度矩陣
    s <- matrix(0,row,row)

    for(z1 in 1:row){
        for(z2 in 1:row){
            if(z1 < z2){
               ##可計(jì)算的列
               num <- intersect(which(M[z1,]!=0),which(M[z2,]!=0))

               sum <- 0
               for(z3 in num){
                  sum <- sum+(M[z1,][z3] - M[z2,][z3])^2
               }

               s[z2,z1] <- length(num)/(1+sqrt(sum))

               ##對(duì)算法的閾值進(jìn)行限制
               if(s[z2,z1] > 1) s[z2,z1] <- 1
               if(s[z2,z1] < -1) s[z2,z1] <- -1

            }
        }
    }

    ts <- t(s)   ##補(bǔ)全三角矩陣
    w <- which(upper.tri(ts))
    s[w] <- ts[w]
    s      ##返回用戶相似度矩陣

}


# part3 -------------------------------------------------------------------
##用戶近鄰算法
NearestNUserNeigborhood <- function(S,n){
    row <- nrow(S)
    neighbor <- matrix(0,row,n)
    for(z1 in 1:row){
        for(z2 in 1:n){
            m <- which.max(S[,z1])
            neighbor[z1,][z2] <- m
            S[,z1][m]=0
        }
    }
    neighbor
}


# part4 -------------------------------------------------------------------
##推薦算法
UserBasedRecommender <- function(uid,n,M,S,N){
    row <- ncol(N)
    col <- ncol(M)
    r <- matrix(0,row,col)
    N1 <- N[uid,]
    for(z1 in 1:length(N1)){
        num <- intersect(which(M[uid,]==0),which(M[N1[z1],]!=0))  
        for(z2 in num){
            r[z1,z2] = M[N1[z1],z2]*S[uid,N1[z1]]
        }
    }

    ##輸出推薦矩陣
    sum <- colSums(r)
    s2 <- matrix(0,2,col)
    for(z1 in 1:length(N1)){
        num <- intersect(which(colSums(r)!=0),which(M[N1[z1],]!=0))
        for(z2 in num){
            s2[1,][z2] <- s2[1,][z2]+S[uid,N1[z1]]
            s2[2,][z2] <- s2[2,][z2]+1
        }
    }

    s2[,which(s2[2,]==1)]=10000
    s2 <- s2[-2,]

    r2 <- matrix(0,n,2)
    rr <- sum/s2
    item <- dimnames(M)[[2]]
    for(z1 in 1:n){
        w <- which.max(rr)
        if(rr[w]>0.5){
            r2[z1,1] <- item[which.max(rr)]
            r2[z1,2] <- as.double(rr[w])
            rr[w]=0
        }
    }
    r2
}


# part5 -------------------------------------------------------------------

##調(diào)用算法
setwd("G:\myProject\RDoc\Unit2\rChap2")
myFile <- "testCF.csv"
NeighborHodd_num <- 2 ##取兩個(gè)最大近鄰
Recommender_num <- 3  ##保留最多3個(gè)推薦結(jié)果

myM <- FileDataModel(myFile)
myS <- EuclideanDistanceSimilarity(myM)
myN <- NearestNUserNeigborhood(myS,NeighborHodd_num)

##對(duì)用戶user= 1的推薦結(jié)果
R1 <- UserBasedRecommender(1, Recommender_num,myM,myS,myN); R1

##對(duì)用戶user= 2的推薦結(jié)果
R2 <- UserBasedRecommender(2, Recommender_num,myM,myS,myN); R2

##對(duì)用戶user= 3的推薦結(jié)果
R3 <- UserBasedRecommender(3, Recommender_num,myM,myS,myN); R3

##對(duì)用戶user= 4的推薦結(jié)果
R4 <- UserBasedRecommender(4, Recommender_num,myM,myS,myN); R4

##對(duì)用戶user= 5的推薦結(jié)果
R5 <- UserBasedRecommender(5, Recommender_num,myM,myS,myN); R5
效果如下:

基于用戶的協(xié)同過濾算法(Java實(shí)現(xiàn)或R語(yǔ)言實(shí)現(xiàn)圖(2)用R語(yǔ)言實(shí)現(xiàn)協(xié)同過濾算法

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }