何謂QoS?
QoS(Quality of Service)是一個頻寬管理的功能,使用者可以設定為特定的電腦保留一定比例的頻寬,當頻寬滿載,這台電腦還可以繼續使用,不用跟其他的電腦搶奪頻寬。
為什麼需要 QoS?
在一般的家庭網路中,頻寬是所有電腦共用的。這表示任何使用「高頻寬」應用程式的電腦 ( 例如: Torrent 或其他 P2P 軟體 ) ,將會影響到其他電腦。這也包括對整個網路效能的負面影響。
如何避免這個問題?
Hard work beats talent when talent doesn't work hard
文章緩慢構建中,自我複習之餘也希望能幫助需要的人。
2016年2月5日 星期五
CPU體系架構分析
CPU體系架構按照名稱主要分為兩大類:IA和x86,而在這兩類下又分別劃分為32位元和64位元。
按照這樣的分類,就出現了四種體系架構名稱:IA-32,IA-64,X86-32,X86-64。這些名詞的含義總結如下:
x86 (= 80x86)
x86是Intel公司首先研發的一種CPU體系架構,這種體系架構也常被稱為80×86。該系列最早的處理器即為16位的Intel 8086。由於Intel早年對於這個系列的處理器都是以80開頭並以86結尾,比如Intel 8086、80186、80286及80386等,因此用x86或者80×86表示該體系架構,其中“x”即為英文字母x。
值得注意的是,x86代表一類處理器的體系架構,並不特指Intel公司的處理器,比如AMD公司也生產遵循x86架構的處理器。另外,x86體系架構包含16位、32位和64位。
x86-32 (= x86 = IA32 = i386)
表示32位的x86體系架構,該系列也被稱為IA-32或i386,甚至直接使用x86來代表這種體系架構。該架構的第一款CPU為Intel 80386,它完全取代了16位x86架構的CPU。
x86-64 (= x64)
表示64位的x86體系架構。該架構由AMD公司首推,因此AMD將其稱為AMD64。 Intel隨後也推出了64位的x86架構,將其稱為Intel64。由於這兩個64位的架構幾乎相同,因此許多其他廠商使用不偏袒任何廠商的稱呼x86-64來表示對這兩個架構的兼容。該架構有時也被稱為x86_64或x64,某些廠商也用AMD64或amd64同時表示Intel64和AMD64。
IA-32 (= x86-32)
表示英特爾32位元架構,英文全稱為Intel Architecture 32-bit.它與x86-32表示同一種體系架構,只不過Intel現如今將x86-32稱為IA-32。
IA-64
表示Intel與惠普合作開發的一種嶄新的64位體系架構,它與x86架構不兼容。因此,IA-64與上面提到的x86-64或x64代表的含義不同。
來源:http://edsionte.com/techblog/archives/category/计算机体系结构
按照這樣的分類,就出現了四種體系架構名稱:IA-32,IA-64,X86-32,X86-64。這些名詞的含義總結如下:
x86 (= 80x86)
x86是Intel公司首先研發的一種CPU體系架構,這種體系架構也常被稱為80×86。該系列最早的處理器即為16位的Intel 8086。由於Intel早年對於這個系列的處理器都是以80開頭並以86結尾,比如Intel 8086、80186、80286及80386等,因此用x86或者80×86表示該體系架構,其中“x”即為英文字母x。
值得注意的是,x86代表一類處理器的體系架構,並不特指Intel公司的處理器,比如AMD公司也生產遵循x86架構的處理器。另外,x86體系架構包含16位、32位和64位。
x86-32 (= x86 = IA32 = i386)
表示32位的x86體系架構,該系列也被稱為IA-32或i386,甚至直接使用x86來代表這種體系架構。該架構的第一款CPU為Intel 80386,它完全取代了16位x86架構的CPU。
x86-64 (= x64)
表示64位的x86體系架構。該架構由AMD公司首推,因此AMD將其稱為AMD64。 Intel隨後也推出了64位的x86架構,將其稱為Intel64。由於這兩個64位的架構幾乎相同,因此許多其他廠商使用不偏袒任何廠商的稱呼x86-64來表示對這兩個架構的兼容。該架構有時也被稱為x86_64或x64,某些廠商也用AMD64或amd64同時表示Intel64和AMD64。
IA-32 (= x86-32)
表示英特爾32位元架構,英文全稱為Intel Architecture 32-bit.它與x86-32表示同一種體系架構,只不過Intel現如今將x86-32稱為IA-32。
IA-64
表示Intel與惠普合作開發的一種嶄新的64位體系架構,它與x86架構不兼容。因此,IA-64與上面提到的x86-64或x64代表的含義不同。
來源:http://edsionte.com/techblog/archives/category/计算机体系结构
2016年2月4日 星期四
[Linux] Shell script if
常用的系統符號變數有:
$# Number of parameter
$* All the parameter
$? Exit status of previous command(前一個指令執行後的回傳值,0為執行成功)
$$ PID of this shell's process
$! PID of the most recently started background
Shell script的if寫法如下:
if [...]; then
...
else
...
fi
[ string1 = string2 ] string1 and string2 are equal
[ string1 != string2 ] string1 and string2 are not equal
[ string1 \< string2 ] string1 is lexically less than string2 (e.g. 'a' is less than 'b')
[ string1 \> string2 ] string1 is lexically greater than string2 (e.g. 'b' is greater than 'a')
[ -z string ] string is zero (e.g. a empty string)
[ -n string ] string is nonzero (e.g. a VAR string)
[ -e file ] file exists
[ -f file ] file is a file
[ -d file ] file is a directory
[ -c file ] file is a character device
[ -b file ] file is a block device
[ -p file ] file is a named pipe
[ -s file ] file is not empty
[ -k file ] file's sticky bit is set
[ -S file ] file is a socket
[ -L file ] file is a symbolic link
[ -r file ] file is readable by user
[ -w file ] file is writeable by user
[ -x file ] file is executeable by user
[ -O file ] file is owner by user
[ -G file ] file is group owned by a greoup
[ -u file ] file has its set user ID bit set
[ -g file ] file has its group user ID bit set
[ file1 -nt file2 ] file1 is newer than file2
[ file1 -ot file2 ] file1 is older than file2
[ file -ef file2 ] file1 is another name for file2
[ n1 -eq n2 ] true if integer n1 = integer n2
[ n1 -ne n2 ] true if integer n1 <> n2
[ n1 -gt n2 ] true if n1 > n2
[ n1 -ge n2 ] true if n1 >= n2
[ n1 -lt n2 ] true if n1 < n2
[ n1 -le n2 ] true if n1 <= n
$# Number of parameter
$* All the parameter
$? Exit status of previous command(前一個指令執行後的回傳值,0為執行成功)
$$ PID of this shell's process
$! PID of the most recently started background
Shell script的if寫法如下:
if [...]; then
...
else
...
fi
其中[...]可以為:
[ string1 != string2 ] string1 and string2 are not equal
[ string1 \< string2 ] string1 is lexically less than string2 (e.g. 'a' is less than 'b')
[ string1 \> string2 ] string1 is lexically greater than string2 (e.g. 'b' is greater than 'a')
[ -z string ] string is zero (e.g. a empty string)
[ -n string ] string is nonzero (e.g. a VAR string)
[ -e file ] file exists
[ -f file ] file is a file
[ -d file ] file is a directory
[ -c file ] file is a character device
[ -b file ] file is a block device
[ -p file ] file is a named pipe
[ -s file ] file is not empty
[ -k file ] file's sticky bit is set
[ -S file ] file is a socket
[ -L file ] file is a symbolic link
[ -r file ] file is readable by user
[ -w file ] file is writeable by user
[ -x file ] file is executeable by user
[ -O file ] file is owner by user
[ -G file ] file is group owned by a greoup
[ -u file ] file has its set user ID bit set
[ -g file ] file has its group user ID bit set
[ file1 -nt file2 ] file1 is newer than file2
[ file1 -ot file2 ] file1 is older than file2
[ file -ef file2 ] file1 is another name for file2
[ n1 -eq n2 ] true if integer n1 = integer n2
[ n1 -ne n2 ] true if integer n1 <> n2
[ n1 -gt n2 ] true if n1 > n2
[ n1 -ge n2 ] true if n1 >= n2
[ n1 -lt n2 ] true if n1 < n2
[ n1 -le n2 ] true if n1 <= n
2015年11月10日 星期二
[Linux] 在Ubuntu 12.04上使用「Sublime Text 3 + Ctags + Cscope」取代Source Insight + 安裝HighlightWords套件 + 安裝Function Name Display套件
Step1. 在Ubuntu上安裝Ctags與Cscope
sudo apt-get install cscope
sudo apt-get install exuberant-ctags
Step2. 在Sublime Text上安裝Ctags與Cscope套件
(1) 先安裝Package Control:選取「View -> Show Console」,貼上「https://packagecontrol.io/installation」網址中的指令按enter安裝
(2) 選取「Preference -> Package Control」,打i後選install package按enter,打ctags按enter安裝
(3) 選取「Preference -> Package Control」,打i後選install package按enter,打cscope按enter安裝
sudo apt-get install cscope
sudo apt-get install exuberant-ctags
Step2. 在Sublime Text上安裝Ctags與Cscope套件
(1) 先安裝Package Control:選取「View -> Show Console」,貼上「https://packagecontrol.io/installation」網址中的指令按enter安裝
(2) 選取「Preference -> Package Control」,打i後選install package按enter,打ctags按enter安裝
(3) 選取「Preference -> Package Control」,打i後選install package按enter,打cscope按enter安裝
2015年1月16日 星期五
[機器學習] 降維演算法:主成分分析(Principal Component Analysis, PCA)
以下講解如何公式化主成分分析演算法,假設我有如下二維data,我們想要將它投影到一條直線上使其降成一維,那麼該如何找出最佳的一條直線來投影呢?
PCA要做的就是找出一個低維度的投影平面(在這個例子是一條紅色直線),當我們將data投影到上面,data與這條線之間的平方投影誤差(squared projection error)能夠最小化。平方投影誤差就是data「原始的」位置與「投影到平面上後」的位置之間距離的「平方」。
正式定義:
當你想將二維資料降成一維時,PCA會尋找一個對資料進行投影的方向,或稱一個向量${ u }^{ (i) }\in { R }^{ n }$,在這邊就是${ u }^{ (i) }\in { R }^{ 2 }$,使得投影誤差能夠最小化。這個向量是正是負都沒關係,因為即使是相反方向,定義出的直線(投影方向)還是一樣的。
以此類推,如果要將n維資料降成k維時,我們就要找出k個方向(向量)來將data投影到由這k個向量所形成的一個k維平面上。
以右圖為例,假設我要將三維降成兩維,現在k=2,則我們要找出從原點延伸出來的兩個方向(向量):${ u }^{ (1) }$與${ u }^{ (2) }$,這兩個向量會定義一個二維平面,我們就可以將data投影到這個平面上。
用線性代數的術語來說,就是要將data投影到這k個向量生成的線性子空間中。
那麼PCA跟線性回歸有什麼關係呢?看起來很像但兩者意義不太一樣,線性回歸要最小化的東西是每個點與回歸直線之間的平方誤差,是一個垂直距離,它是某個點與透過假設所得到的其預測值y之間的距離。而PCA要最小化的東西是每個點與直線之間的直角距離(orthogonal distance)。
線性回歸做的是用x中所有的值來預測一個特殊變數y,但在PCA沒有這麼一個要預測的y,我們擁有的就是一群特徵${ x }_{ 1 },{ x }_{ 2 }, ... , { x }_{ n }$,這些特徵都是被同等對待的,沒有所謂的特殊變數y需要被預測。
因此,如果我要將三維降成兩維,我要做的就是找出兩個方向,並將data投影到二維平面上,此時三個特徵${ x }_{ 1 }$、${ x }_{ 2 }$與${ x }_{ 3 }$是被同等對待的。
問題:
PCA要做的就是找出一個低維度的投影平面(在這個例子是一條紅色直線),當我們將data投影到上面,data與這條線之間的平方投影誤差(squared projection error)能夠最小化。平方投影誤差就是data「原始的」位置與「投影到平面上後」的位置之間距離的「平方」。
正式定義:
當你想將二維資料降成一維時,PCA會尋找一個對資料進行投影的方向,或稱一個向量${ u }^{ (i) }\in { R }^{ n }$,在這邊就是${ u }^{ (i) }\in { R }^{ 2 }$,使得投影誤差能夠最小化。這個向量是正是負都沒關係,因為即使是相反方向,定義出的直線(投影方向)還是一樣的。
以此類推,如果要將n維資料降成k維時,我們就要找出k個方向(向量)來將data投影到由這k個向量所形成的一個k維平面上。
以右圖為例,假設我要將三維降成兩維,現在k=2,則我們要找出從原點延伸出來的兩個方向(向量):${ u }^{ (1) }$與${ u }^{ (2) }$,這兩個向量會定義一個二維平面,我們就可以將data投影到這個平面上。
用線性代數的術語來說,就是要將data投影到這k個向量生成的線性子空間中。
那麼PCA跟線性回歸有什麼關係呢?看起來很像但兩者意義不太一樣,線性回歸要最小化的東西是每個點與回歸直線之間的平方誤差,是一個垂直距離,它是某個點與透過假設所得到的其預測值y之間的距離。而PCA要最小化的東西是每個點與直線之間的直角距離(orthogonal distance)。
線性回歸做的是用x中所有的值來預測一個特殊變數y,但在PCA沒有這麼一個要預測的y,我們擁有的就是一群特徵${ x }_{ 1 },{ x }_{ 2 }, ... , { x }_{ n }$,這些特徵都是被同等對待的,沒有所謂的特殊變數y需要被預測。
因此,如果我要將三維降成兩維,我要做的就是找出兩個方向,並將data投影到二維平面上,此時三個特徵${ x }_{ 1 }$、${ x }_{ 2 }$與${ x }_{ 3 }$是被同等對待的。
問題:
主成分分析演算法
在使用PCA之前,我們習慣先做mean normalization以及feature scaling。mean normalization是一定要做的,feature scaling則視data set而定,我們先計算每個特徵的平均${ u }_{ j }$,並將每個特徵${ x }_{ j }^{ (i) }$用${ x }_{ j }-{ u }_{ j }$取代,如果每個特徵值範圍差太多,我們再用特徵縮放來處理。${ S }_{ j }代表最大值減最小值。
現在問題就是,該如何找到我們要的${ u }^{ (1) }$、${ u }^{ (2) }$、${ z }_{ 1 }$與${ z }_{ 2 }$等等呢?
以數學角度來說,我們要先計算一個covariance矩陣,它的符號與「求和」符號一樣,在這邊不要搞混就好,我們會將它存在一個Sigma變數中,接下來就是要求它的eigenvectors,將svd()方法用於這個covariance矩陣會得到三個矩陣U,S,V。U矩陣為一個n*n矩陣,如果想要將矩陣降到k維,我們就只要取U矩陣的前k個行向量,這k個向量就是我們要找的k個方向,將data投影到上面。
如果要將我們原始的data set $x\in { R }^{ n }$用一個低維度的$z\in { R }^{ k }$表示,就是取U矩陣的前k個向量,取出來後把這個n*k矩陣叫做${ U }_{ reduce }$。而z就是這個矩陣的轉置乘上x,z是一個k*n矩陣,而x是一個n*1向量,最後會得出一個k*1向量,還算合理。如果要針對某個training example ${ x }^{ (i) }$,我們就在x上面加個上標i即可,最後會得出${ z }^{ (i) }$。
總結,右邊的計算方式是一種向量化寫法,在octave中「'」代表「T」:
問題:
主成分元素的個數
當我們要將資料從n維降成k維時,k是一個PCA演算法要輸入的變數,這個k又叫作「主成分元素的個數」,以下講解該如何找出這個k。
首先,PCA在做的就是要最小化平均平方投影誤差。另外,我們的data的總變異就是所有樣本長度的平均。
只要這個k能夠使得這兩者相除小於0.01,找出當中最小的k即可。當別人問你留下了多少主成分,你可以說你選擇了一個k,代表留下了k個主成分,這個k保留了99%的variance。0.01是大家最常用的數值,0.05也可以,最常見就是k保留了95%~99%的variance。
再來,該怎麼選k呢?你可以從k=1開始一直算,直到該式子小於等於0.01為止。很明顯這不太有效率,我們可以換個方式,用svd分解來找,取出svd分解後的Sigma矩陣,給定一個k,我們只要算出1減掉這k個對角線的值的總和除以n個對角線的值的總和是否小於等於0.01即可。換個角度講就是,這k個對角線的值的總和除以n個對角線的值的總和要大於等於0.99。
因此,你只要慢慢增加k就好,而且只要呼叫一次SVD即可。
總結:
重建資料(Reconstruction)
以下面例子來說,我們該如何將$z\in { R }$轉回$x\in { R }^{2}$呢?由於$z={ U }_{ reduce }^{T}x$,要重建成原本的資料只要求${ x }_{ approx }={ U }_{ reduce }z$即可,但是只能重建成近似資料,沒辦法一模一樣。
問題:假設我們要進行降維,但是是降成k=n維(也就是一模一樣維度),以下何者算正確?
假設你有個100*100=10000pixels的影像資料,你的特徵向量{x}^{(i)}就會包含10000個pixels的亮度值,也就是特徵向量為10000維。想像一下如果將這個10000維的特徵向量丟給監督學習演算法,例如邏輯回歸、神經網路或是支援向量機,這速度想必會非常慢,此時用PCA壓縮一下資料可以加快演算法的速度。
首先我們先取出data set中的input部分,也就是特徵向量x,這還是10000維。此時對它做PCA後,可能可以得到一個低維度(或許1000維)的特徵向量z,這樣我們將會得到一個新的data set,這個新的data set,input部分已經變成了z。
錯誤的PCA用法:使用PCA來降低特徵數量以防止over-fitting
正確的用法:使用regularization來防止over-fitting
最後,在使用PCA以前,你應該確保演算法在原始數據上進行過嘗試,只有在這種嘗試達不到你預期結果時才採用PCA。因為大部分人在做project時會加入「將資料進行壓縮」這個步驟,而其實不用壓縮似乎也不影響結果。
[機器學習] 將高維度資料壓縮(Data Compression)與視覺化(Visualization)
資料壓縮
為何要將資料壓縮?主要有兩大好處:
- 減少硬碟與記憶體空間的使用
- 加快演算法速度
如果我們現在有個data set具有非常非常多特徵,例如50個特徵,我們隨便取兩個特徵出來,假設特徵${ x }_{ 1 }$是某樣東西用公分表示的長度,特徵${ x }_{ 2 }$是同樣東西用英寸表示的長度。
明明是針對同一樣東西,卻用兩個特徵來表示它的長度,看似有一個特徵是多餘的。因此,我們可以嘗試將data set從二維轉到一維,看能不能只用一個特徵值來代表這樣東西的長度就好。
現在,假設我們有如下圖二維的data set,想將它們降到一維,我們可以將這些data投影(projection)到那條綠色的回歸線上,投影後我們要做的就只是測量每個data在這條直線上的位置,透過建立一個新的特徵假設叫做${ z }_{ 1 }$,只需要一個值就可以記錄每個data在這條線上的位置了。
因此,過去每一個樣本都要用兩個值來表示,現在只要用一個值就可以了。經過降維,我用來儲存資料的硬碟或記憶體空間可能就只有過去的一半而已,但更有感的可能是加快演算法的速度。
同樣的,我們也可以將三維的資料降成二維,而在實際操作上,你還可能會遇到要將1000維的資料降成100維這種例子。
左圖中,你可以發現這群data約略是圍繞在一個平面周圍的感覺,我們試著將這些data投影到一個二維平面,如中間那個圖,投影後,所有data都在一個二維平面上了,所以我們要用兩個值來表示每一個data對吧?
這兩個值分別就是用圖中兩條綠色軸${ z }_{ 1 }$與${ z }_{ 2 }$上的值來表示,將這兩個軸獨立出來後,就變成了右圖,用${ z }_{ 1 }$軸與${ z }_{ 2 }$軸來表示這些data。
以下分別為上圖中對應的圖,第一張圖為data在三維空間時的散佈樣子,第二張圖則是將這些三維data投影到一個二維平面時的樣子,知道這個二維平面的兩個軸${ z }_{ 1 }$與${ z }_{ 2 }$後,第三張圖就是以${ z }_{ 1 }$與${ z }_{ 2 }$來表示這些data的位置。
視覺化
現在,假設我們有一些國家的資料作為它們的特徵,假設有50個特徵好了,我們要怎麼視覺化這50維的data呢?首先,辦不到,與其用一個50維的特徵向量${ x }^{ (i) }$表示每一個國家,不如嘗試用一個二維的特徵向量來表示,也就是使用之前所說的兩個特徵${ z }_{ 1 }$與${ z }_{ 2 }$來表示,而這就要用到降維了。要注意的是,降維後的結果只能粗略代表這50個特徵,也就是結果多少會與原始資料有些許出入。
我們將上表畫出來,${ z }_{ 1 }$軸與${ z }_{ 2 }$軸可能就各代表一群特徵的綜合值。
勘誤:上圖左下角應該是${ z }^{ (i) }\in { R }^{ 2 }$
2015年1月14日 星期三
[機器學習](十)向量化(Vectorization):低維度矩陣分解(Low Rank Matrix Factorization)
向量化的意思就是把一些for迴圈的操作轉換成矩陣的操作,速度會比寫一般迴圈快非常多。比如說線性回歸,求預測值時,普通做法是一個樣本求一次,而m個樣本就要用for迴圈求m次,向量化操作就是用矩陣相乘的方式,一次求出m個樣本的預測值。
以協同過濾的例子為例,之前我們說使用者j對電影i的預測評分為${({ \Theta }^{ (j) }) }^{ T }{ x }^{ (i) }$,現在,我們該如何使用向量化的方式來預測評分呢?
首先,先寫出參數向量$\Theta$與特徵向量X,此時為了計算所有預測矩陣中的評分,只要將${ \Theta }^{ T }$與X這兩者相乘即可,這種向量化式的做法又叫作Low Rank Matrix Factorization。
除了跑此演算法外,還有其他可以做的事,也就是使用學習到的特徵向量來找出相關電影。
例如,如果你發現電影i的特徵向量與電影j的特徵向量,彼此之間的距離很相近,代表兩者可能很類似,則使用者喜歡電影i或許也會喜歡電影j。
假設你現在有五部電影j,其都與電影i有關,則你可以計算這五部電影各自的特徵向量與電影i的特徵向量之間的距離,最小者就是最相似者,而這可以讓你推薦給使用者比較不同的電影。
使用Mean Normalization加強協同過濾演算法:
如果現在多了一個使用者Eve,其對任何電影都沒有評分過,來看看協同過濾怎麼處理它。
假設現在n=2,代表有兩個特徵,我們要求Eve的${ \Theta }^{ (5) }$。由於Eve沒有評過任何電影,也就是沒有任何r(i,j)=1,導致會影響${ \Theta }^{ (5) }$的就只有式子最後的那一個正規項目。
如果你的目標是要最小化這個正規項目,則只要將${ \Theta }^{ (5) }$設$\begin{bmatrix} 0 \\ 0 \end{bmatrix}$就好。
因為正規項目鼓勵我們將參數設定成儘量接近0。因此,${({ \Theta }^{ (5) }) }^{ T }{ x }^{ (i) }=0$,將會預測Eve對所有電影的評分都是0。這看起來好像沒什麼用,因為有些電影有些人還是有評分,而這也讓我們很難推薦Eve某部電影,因為每個Eve對電影的預測評分都是0,都是一樣的,沒有比較高分的電影可以讓我們推薦。
因此,Mean Normalization的做法就是讓我們解決這個問題。
首先,我們計算出每部電影的平均得分,將其記在向量$\mu $中,再來,將原矩陣的每一列減掉平均值,現在每部電影在這個Y矩陣中都有一個0的平均評分(average rating of zero?)。
此時,假設這個Mean Normalize movie rating矩陣中的評分確實是從使用者那邊得到的評分,我將使用這個矩陣來學習參數向量${ \Theta }^{ (j) }$以及特徵向量${ x }^{ (i) }$。
對於使用者j,預測其對電影i的評分,最後要加回去減掉的${ \mu }_{ i }$:
${({ \Theta }^{ (j) }) }^{ T }{ x }^{ (i) }+{ \mu }_{ i }$
這是很合理的,因為我們根本不知道新使用者的喜好,所能做的就是對於該使用者,預測其給予電影的評分值可能是該電影的平均的得分值。
最後,一般狀況下,「某個使用者還未對任何電影評過分」,其重要程度可能會比「某個電影還未得到任何一個評分」來得高。
問題:
以協同過濾的例子為例,之前我們說使用者j對電影i的預測評分為${({ \Theta }^{ (j) }) }^{ T }{ x }^{ (i) }$,現在,我們該如何使用向量化的方式來預測評分呢?
首先,先寫出參數向量$\Theta$與特徵向量X,此時為了計算所有預測矩陣中的評分,只要將${ \Theta }^{ T }$與X這兩者相乘即可,這種向量化式的做法又叫作Low Rank Matrix Factorization。
除了跑此演算法外,還有其他可以做的事,也就是使用學習到的特徵向量來找出相關電影。
例如,如果你發現電影i的特徵向量與電影j的特徵向量,彼此之間的距離很相近,代表兩者可能很類似,則使用者喜歡電影i或許也會喜歡電影j。
假設你現在有五部電影j,其都與電影i有關,則你可以計算這五部電影各自的特徵向量與電影i的特徵向量之間的距離,最小者就是最相似者,而這可以讓你推薦給使用者比較不同的電影。
使用Mean Normalization加強協同過濾演算法:
如果現在多了一個使用者Eve,其對任何電影都沒有評分過,來看看協同過濾怎麼處理它。
假設現在n=2,代表有兩個特徵,我們要求Eve的${ \Theta }^{ (5) }$。由於Eve沒有評過任何電影,也就是沒有任何r(i,j)=1,導致會影響${ \Theta }^{ (5) }$的就只有式子最後的那一個正規項目。
如果你的目標是要最小化這個正規項目,則只要將${ \Theta }^{ (5) }$設$\begin{bmatrix} 0 \\ 0 \end{bmatrix}$就好。
因為正規項目鼓勵我們將參數設定成儘量接近0。因此,${({ \Theta }^{ (5) }) }^{ T }{ x }^{ (i) }=0$,將會預測Eve對所有電影的評分都是0。這看起來好像沒什麼用,因為有些電影有些人還是有評分,而這也讓我們很難推薦Eve某部電影,因為每個Eve對電影的預測評分都是0,都是一樣的,沒有比較高分的電影可以讓我們推薦。
因此,Mean Normalization的做法就是讓我們解決這個問題。
首先,我們計算出每部電影的平均得分,將其記在向量$\mu $中,再來,將原矩陣的每一列減掉平均值,現在每部電影在這個Y矩陣中都有一個0的平均評分(average rating of zero?)。
此時,假設這個Mean Normalize movie rating矩陣中的評分確實是從使用者那邊得到的評分,我將使用這個矩陣來學習參數向量${ \Theta }^{ (j) }$以及特徵向量${ x }^{ (i) }$。
對於使用者j,預測其對電影i的評分,最後要加回去減掉的${ \mu }_{ i }$:
${({ \Theta }^{ (j) }) }^{ T }{ x }^{ (i) }+{ \mu }_{ i }$
這是很合理的,因為我們根本不知道新使用者的喜好,所能做的就是對於該使用者,預測其給予電影的評分值可能是該電影的平均的得分值。
最後,一般狀況下,「某個使用者還未對任何電影評過分」,其重要程度可能會比「某個電影還未得到任何一個評分」來得高。
問題:
訂閱:
文章 (Atom)