1. 程式人生 > >推薦系統1

推薦系統1

推薦系統常常用於推薦給使用者可能喜歡的產品,或者推薦給使用者可能會喜歡的電影等等場景,一般推薦系統的建立是基於資料的。

 

理解近鄰的概念NN:

 

近鄰的概念就是一個實體與另外一個實體之間很相似,我們稱之為近鄰。for example:

上圖是A,B,C三個使用者的體重,我們發現:

 class Program
    {
        static void Main(string[] args)
        {
            int a = 60;
            int b = 62;
            int c = 90;
            Console.WriteLine("已知條件:*********************************************************************");
            Console.WriteLine(String.Format("a的體重是:{0}kg", a));
            Console.WriteLine(String.Format("b的體重是:{0}kg", b));
            Console.WriteLine(String.Format("c的體重是:{0}kg", c));
            Console.WriteLine("計算結果:*********************************************************************");
            Console.WriteLine(String.Format("a和b相差:{0}kg", Math.Abs(a - b)));
            Console.WriteLine(String.Format("a和c相差:{0}kg", Math.Abs(a - c)));
            Console.WriteLine(String.Format("b和c相差:{0}kg", Math.Abs(c - b)));
            Console.WriteLine("得出結論:*********************************************************************");
            Console.WriteLine("a和b的差異更小,所以a和b更接近");
            Console.Read();
        }
    }

如此看來,A和B的體重更為接近,我們認為他們是近鄰,也就是說他們之間更加相似。

我們再新增一個屬性:

A和B之間的“”距離“”就可以使用歐氏距離的演算法進行計算啦:

 

但是單純的這種計算也會引發誤區:

 

我們按照計算髮現,A和C好像更加接近,但是直覺告訴我們,B和C才是最接近的,因為他們的齒輪數是一樣的。

 

這個時候需要引入正則化概念:

 

正則化就是,將所有的變數歸一化到同樣的尺度的方法。對於不同的屬性,類似於上面的表格中,汽車的執行速度的值是100和110,而齒輪的數目確實4和5,二者數值相差很大。所以我們需要將執行速度和齒輪數目正則化到相同的尺度上進行比較。

 

常用的正則化的方法有:

 

1.將變數除以當前屬性中最大值。

2.將變數減去均值,再除以標準差。

3.將每個變數除以最大值和最小值的差。

 

K近鄰演算法(KNN)

 

KNN就是找到與當前實體最接近的K個實體,由這K個實體投票表決,決定到底是否推薦給當前的實體。

假如,和當前實體最接近的10個實體中,有9個實體都購買了某件商品,那麼,我們將選擇把這件商品推薦給當前的實體。

又例如,和當前實體最接近的10個實體中,只有一個實體喜歡某一部電影,其餘9個實體不喜歡這部電影,那麼我們將選擇不把當前的這部電影推薦給當前的實體。

這種推薦方式就是一種協同過濾的方式進行推薦。