基於遺傳最佳化的協同過濾推薦演算法matlab模擬

简简单单做算法發表於2024-03-23

1.演算法執行效果圖預覽

最後得到推薦的商品ID號:

推薦商品的ID號:

ans =
 
        9838
       17582
       21911
       14902
       14902
       12352
       24732
       23071
       23499
       11790
        1547
       16550
       16550
       16550
        1133
       11330
       27415
       28391
        6672
        8193
        8193
       12168
         241
       14020
       20631
       17958
       21336
       25227
        2257
        2257
       14182
        5369
       22313
       11280
       26699
       25792
       12168
       17060
        2963
       27791
       27791
       27791
       20297
       14182
       14182
       12599
        1547
        1547
       15584
        4479
       22583
       26298
       26006
        3627
       14020
        9657
       25086
       23662
       25372
       29203
       26871
       15934
       13883
       12220
       27785
       27785
       27785
       25488
       27989
       27989
        6672
       27508
       22583
        9829
        7386
        4647
       13554
       11939
        2635
       25372
       25372
        6080
       12162
       25329
       17550
        7868
        7868
       28410
        8637
       25488
       21838
       11083
         251
        6319
        6319
        2410
       23928
       19421
       13494
        7490
       23662
       14159
       11000
       11000
       12606
       21657
        4571
       15639
       12230
       24528
       17445
        1133
       11052
       23482
       23482
       23482
       23482
       23482
       23482
       22583
         241
       26969
       14902
        6672
       26722

  

2.演算法執行軟體版本

matlab2022a

3.演算法理論概述

使用者興趣模型,即對使用者的興趣和愛好的準確描述。而在建立使用者興趣模型的時候,首先需要確定使用者興趣模型的表示形式。因此,使用者興趣模型的表示是使用者興趣模型的一個重要環節。所謂使用者興趣的表示,即個性化資訊推薦的一個重要環節,影響使用者興趣的因素有很多種,比如年齡,學歷,職業等。另外一方面,使用者興趣會隨著時間的變化而變化,這對使用者興趣的表示增加了難度。其中一個最為基礎的使用者興趣表示方法是透過關鍵詞來表示的。但是透過關鍵詞方式的使用者興趣表示方法具有一定的侷限性。這個侷限性,主要是因為關鍵詞無法完全表達出使用者興趣導致的。

使用者興趣模型的構建,其本質就是和使用者興趣相關的資訊的獲取,然後構建一個可以讀取識別這些資訊的數學模型的過程。使用者興趣模型的構建過程如下圖所示。

使用者興趣模型是個性化推薦技術的基礎,透過建立一個優良的使用者興趣模型,可以實現更高效能的推薦系統。從而大大減少了使用者尋找自己感興趣資訊的時間和精力。

協同過濾推薦(Collaborative Filtering Recommendation)技術,在推薦系統中是最為成功的技術之一。協同過濾,被稱為社會過濾或者協作過濾。最早是由Goldberg等學者提出來的,之後發展快速且廣泛。協同過濾方法,首先利用使用者歷史評價的記錄,然後構建出使用者評分矩陣,並且計算專案或使用者之間相似度,最後是採用領域的方法向使用者推薦。協同過濾,根據使用者的歷史喜好資訊,計算使用者之間的距離,然後對商品的評價進行加權評價值,利用目標使用者的最近的鄰居使用者,預測目標使用者對商品的喜好程度,系統根據對商品的喜好程度從而對目標使用者進行個性化推薦。

支援度表示某一關聯規則在資料中出現的普遍程度,即稱為該關聯規則在資料中的支援度,其中支援度的計算公式為:

此外,置信度說明某一關聯規則成立的必然程度,即稱為該關聯規則在資料庫的可信度,其中支援度的計算公式為:

透過判斷支援度和置信度是否超過閾值,來判斷是否產生一個強規則,那麼預先設定這個支援度閾值和置信度閾值是十分重要的,對最後的推薦準確度有著重要影響。 這裡,透過遺傳演算法來最佳化支援度閾值和置信度閾值。

這裡,設定最佳化目標函式為:

其中函式f表示的是當設定不同的支援度閾值和置信度閾值下,整個推薦演算法獲得的推薦正確率,然後透過GA演算法流程圖進行閾值的最佳化。

4.部分核心程式

while gen < MAXGEN;   
      gen
      P1 = 0.9;
      P2 = 1-P1;
      FitnV=ranking(Objv);    
      Selch=select('sus',Chrom,FitnV);    
      Selch=recombin('xovsp', Selch,P1);   
      Selch=mut( Selch,P2);   
      phen1=bs2rv(Selch,FieldD);   
      for a=1:1:NIND  
          if  gen == 1
              LR(a)    = Supp0;               
          else
              LR(a)    = phen1(a,1);      
          end
          %計算對應的目標值
          errs    = func_obj(data(Index(1:10000),:),Max_N,LR(a));
          E       = 1/errs;
          JJ(a,1) = E;
      end 
      Objvsel=(JJ+eps);    
      [Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel);   
      gen=gen+1; 
      %儲存引數收斂過程和誤差收斂過程以及函式值擬合結論
      LR2(gen) = mean(LR);
 
end 
 
%畫圖
figure;
plot(LR2(3:end),'b-o','linewidth',2);
xlabel('Iteration Number');
ylabel('Support value');
grid on;
save GA.mat LR2
end
 
load GA.mat
figure;
plot(LR2(3:end),'b-o','linewidth',2);
xlabel('Iteration Number');
ylabel('Support value');
grid on;
%**************************************************************************
Supp        = LR2(end); %支援度閾值
%根據關聯規則進行推薦演算法
%初始商品推薦列表
[P,Support] = func_ProductList(data,Supp);
 
if length(P) > Max_N
   Len            = length(P);  
   [tmps,I]       = sort(Support);
   Index          = I(Len-Max_N+1:Len);
   Recommend_list = P(Index);
   Support_list   = Support(Index);
else
   Recommend_list = P;
   Support_list   = Support;
end
%獲得最後的推介商品
R1 = [Prod_ID(Recommend_list),Support_list];
 
save r1.mat R1 P Support Prod_ID
 
disp('推薦商品的ID號:');
Prod_ID(Recommend_list)

  

相關文章