本篇主要內容:無監督學習。web
(2)無監督學習算法
在這時,咱們獲得了一個數據集,可是咱們並不知道要拿它來作什麼,也不知道每一個數據點到底是什麼。咱們只是被告知,這裏有個數據集,你能在其中找到某種數據結構嗎?數據庫
對於某個特定的數據集,無監督學習算法可能斷定該數據集包含兩個不一樣的簇。這就是聚類算法。編程
事實上,聚類算法被用在不少地方。其中一個應用聚類算法的例子就是谷歌新聞。谷歌新聞天天作的事情就是收集幾萬條甚至幾十萬條新聞,而後將它們組合成一個個新聞專題。網絡
如圖所示,當咱們點擊裏面的不一樣的連接,咱們就能看到華爾街日報、CNN、英國衛報關於BP油井泄漏事故的報道。因此,谷歌新聞所作的就是:去搜集成千上萬條新聞,而後自動地將它們分簇。有關同一主題的新聞被顯示在一塊兒。數據結構
這裏再舉一個在基因組學的應用。這裏是一個DNA微陣列數據的例子。基本思想是給定一組不一樣的個體,對於每一個個體檢測它們是否擁有某個特定的基因,也就是檢測特定基因的表達程度。這些顏色(如紅、綠、灰等等)展現了不一樣基因擁有特定基因的程度。而後你能所作的就是:運用一個聚類算法,把不一樣的個體納入不一樣的類或歸爲不一樣類型的人。機器學習
這就是無監督學習算法,由於咱們沒有提早告知這個算法這是一類,那是另外一類等等,相反咱們只是告訴這個算法,我這裏有一堆數據,我不知道這些數據是什麼,也不知道它們是什麼類型,你能自動找出這些數據的結構嗎?函數
生活中還有不少例子,好比工具
這些都是聚類的例子,而聚類只是無監督學習的一種。學習
下面咱們來討論另一種。咱們先來說一下雞尾酒宴的問題。想象一下有一個宴會,有一屋子的人,你們都坐在一塊兒講話。由於每一個人都在同時講話,有許多聲音混雜在一塊兒,因此你幾乎很難聽清楚你面前的人說的話。如今假設有兩我的正在同時說話,房間裏還有兩個麥克風。由於這兩個麥克風離兩我的的距離不同,因此每一個麥克風記錄了兩我的聲音的不一樣組合。也許第一我的在一號麥克風裏聲音會響一點,第二我的在二號麥克風裏聲音會響一點。
可是,每一個麥克風都記錄着兩個說話者重疊的聲音。咱們能作的就是把這兩個錄音交給一種無監督學習算法,稱爲「雞尾酒會算法」。讓它幫你找出數據的結構,這個算法就會去聽着兩個錄音,而後說這聽起來像兩個音頻錄音被疊加在一塊兒。此外,這個算法還會分離出這兩個被疊加在一塊兒的音頻源。
看看這個無監督學習算法,實現這個得要多麼的複雜,是吧?它彷佛是這樣,爲了構建這個應用,完成這個音頻處理彷佛須要你去寫大量的代碼或連接到一堆的合成器JAVA庫,處理音頻的庫,看上去絕對是個複雜的程序,去完成這個從音頻中分離出音頻。事實上,這個算法對應你剛纔知道的那個問題的算法能夠就用一行代碼來完成。
就是這裏展現的代碼:
[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
研究人員花費了大量時間才最終實現這行代碼。我不是說這個是簡單的問題,但它證實了,當你使用正確的編程環境,許多學習算法是至關短的程序。因此,這也是爲何在本課中,咱們打算使用Octave編程環境。Octave,是免費的開源軟件,使用一個像Octave或Matlab的工具,許多學習算法變得只有幾行代碼就可實現。
事實上,在硅谷裏,對大量機器學習算法,咱們第一步就是建原型,在Octave建軟件原型,由於軟件在Octave中能夠使人難以置信地、快速地實現這些學習算法。這裏的這些函數好比SVM(支持向量機)函數,奇異值分解,Octave裏已經建好了。若是你試圖完成這個工做,但藉助C++或JAVA的話,你會須要不少不少行的代碼,並連接複雜的C++或Java庫。因此,你能夠實現這些算法,藉助C++或Java或Python,它只是用這些語言來實現會更加複雜。(如今主流是Python)
下面有一道簡單的複習題。
下面的例子中,你會用無監督學習算法解決哪一個問題?(多選)
顯然第一個和第四個是監督學習的例子,而第二個和第三個是無學習監督的例子。