K 最近相鄰(2)

2021-05-24 05:41:30 字數 2646 閱讀 3265

k-最近鄰演算法的一大缺陷是:維度危機(curse  of  dimensionality)。當有大量不相干的屬性存在時,近鄰間的距離會被大量的不相關屬性所支配。

比如,在資料集方面。在《k-最近相鄰(1)》中的資料集是單一的,值域範圍相同的,且對結果有著同樣影響力的;但可能實際的資料集比之更為複雜。

例如:可能存在值域範圍不同的變數(例如,酒瓶的大小);或者完全不相干的變數(如,酒瓶的顏色etc。)在實際的學習器訓練中,我們不應該對這些因素考慮(針對不相干的變數),或者因對之進行合理的處理(如,值域範圍不同的變數)。

我們來構造乙個全新的資料集

這段**構造了一烏七八糟什麼都有的資料集。

如果使用我們前面的演算法,會將這所有的資料,有用的無用的值域相同的值域不同的,同等對待,那麼結果可能是這樣的(幸虧我們可以交叉測試):

嗯,這個結果,不太好。。。

我們應該對不同變數(要素)區別對待。

解決維數危機的方法可以有:

1.當計算兩個例項間的距離時對每個屬性加權。

2.從例項空間中完全消除最不相關的屬性。

按比例縮放(這裡順帶進行了不相干屬性的消除操作)

對數值進行歸一化處理,從而使所有變數都位於相同的值域之內。對每一維度上的數值乘以該維度上的乙個常量。

如果要忽略某些值,則將這些值乘以0,這樣就自然地忽略了。(這其實也是在按比例縮放,只不過縮放的比例是0。。。)

我們來測試一下:

結果大約如下:

可以看出,縮放後的效果總體上是好於所縮放前的。

(ps1:如何進行縮放是關鍵。這裡所使用的縮放方法是乘以乙個因子,我們的例子中使用的是:sdata = rescale(data_x, [1,1,0,0.01]),乘以1表示不縮放,乘以0,表示忽略該項。)

(ps2:其實這裡的比較並沒有多大的意義;因為演算法是隨機產生乙個隨機數來進行資料集的劃分的,兩次隨機產生的資料集並不相同;但鑑於資料集被縮放過的,所以無論如何劃分資料集,所進行的總是:未縮放的資料與已縮放的資料之間的比較,所以還是具有一定的意義的)

(ps3:書《集體智慧型程式設計》上給出的例子中縮放前喝縮放後的比較那叫乙個明顯啊。。。)

縮放引數確定的自動化進行

以上的資料是我們自己生成的,但如果我們事先並不知道這些資料(例如特徵etc。)那麼我們該選擇什麼縮放引數呢?

嗯,我們的問題是:如何從一系列的答案中得到比較好的那個,那麼很顯然,應使用優化演算法來自動確定優秀的縮放引數。

我們要做的只是寫乙個控制函式而已。

貌似如果使用lambda來定義該函式的話會產生錯誤的結果。。。

另,注意weightdomain 的定義。(這個在優化演算法中已有大量講到)

我們來呼叫一下:

geneticoptimize_x是以爬山法產生初始種群的遺傳演算法。geneticoptimize_x的執行效率顯然是相當的可觀。。。

執行結果大致如下:

(說大致是因為:我們定義的成本函式,從本質上講,是個基於概率的函式,且在其中,概率發生的作用相當巨大,因此,在每次呼叫時,該成本函式對同樣的序列並不能給出同樣的結果,因此,geneticoptimize_x的種群的最優異者是每次都變化的。從本質上將,在geneticoptimize_x中,迭代n次與不迭代沒有顯著的區別(因為迭代的結果並不能保持到下次迭代中去,即是,優異者在種群的下次進化中死掉了。。。)。。。):

通過測試,該序列[15, 8, 0, 2]在geneticoptimize_x產生的成本結果是:

scores =  (2647.7657340720734, [15, 8, 0, 2])

這在以後調同樣的函式後,得到的成本結果卻達不到該值。。。

基於以上的討論,你可能認為,既然geneticoptimize_x的優異者並不能保持到下次種群進化中,也就是說,geneticoptimize_x中只有第一次爬山法產生的序列是真正有意義的,那麼不如直接使用爬山法來得到序列得了。

但測試後發現,直接用爬山法得到的序列並不是很好。這大約是因為,geneticoptimize_x中我們產生的初始種群是由爬山法進行了n次獲得的,且在geneticoptimize_x的main loop中葉並不是完全沒有意義。。。

在測試中,遇到過這樣的問題:

return error/len(testset)

zerodivisionerror: int division or modulo by zero

原來是len(testset)中testset是基於概率產生的,那麼完全可能產生乙個長度為0的testset。。。(汗,這概率。。。)

修改後的testalgorithm如下:

這讓我想起《蝙蝠俠2》中的台詞:「只有概率是公平的」。。。

以此來確定最佳引數還有額外的乙個好處便是:我們可以通過所優化得到的引數判斷出哪些引數是重要的,哪些是不太重要的,哪些是可以忽略的。。。如此在蒐集資料時候,就可以有針對性的進行(比如,我們不會去費力收集某些實際上無用的資料。。。)。

嗯,看起來這篇博文本數不太多。。。那就貼個k-最鄰近演算法的全部**吧。

(ps:其中很多部分可以單獨成模組,或和其他模組整合在一起。)

嗯,關於k-最近鄰演算法大約就是這麼些了。

k-最近鄰演算法屬於基於例項的機器學習方法。但基於例項的機器學習演算法還有很多。如區域性加權回歸,徑向基函式,基於案例的推理等。具體可參看《機器學習》等書籍。

by kewing

最近相鄰插值

使用最近鄰插值 源 simg 目標 dimg 縮放係數 k 縮放係數k 源尺寸 目標 由上,對分x y軸 sx dx k sy dy k 思路 初始化目標size的,然後根據位置計算目標對應於原的位置索引,索引結果四捨五入 也就是說目標的每個畫素都是根據目標的畫素索引 縮放係數後求得目標對應其在源上...

K最近鄰演算法

參考 所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。cover和hart在1968年提出了最初的鄰近演算法。knn是一種分類 classification 演算法,它輸入基於例項的學習 instance based learning 屬於懶惰學習 lazy ...

K最近鄰演算法

一 原理 k最近鄰演算法 k nearest neighbor,knn 是最基本的分類演算法,其基本原理是 從最近的k個鄰居 樣本 中,選擇出現次數最多的類別作為判定類別。k最近鄰演算法可以理解為是乙個分類演算法,常用於標籤的 如性別。實現knn演算法核心的一般思路 相似度計算 計算未知樣本和每個訓...