1.1 KNN算法作分類(常見)
1.1 簡述KNN算法
- 核心思想:
給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最領近的k個實例,這k個實例的多數屬於某個類,則就把該輸入實例分成這個類。 - 算法:
輸入:訓練數據集(帶標籤)
輸出:新的輸入實例 x 所屬的類y - KNN模型有何特點:
當訓練集、距離度量、k值、決策規則確定下來後,對於任何一個新的實例,它所屬的類唯一確定。所以說該算法的主要因素是:距離度量、k值、決策規則。 - 三要素
距離度量:一般採用歐氏距離(2範數)
k值如何確定:k值選擇很小時,就意味着模型比較複雜,容易產生過擬合(例如鄰近的點恰好是噪點,預測就會出錯);k值選擇較大時,意味着模型較爲簡單,就容易產生欠擬合。
一般先選擇較小的k值,然後使用交叉驗證法來選擇最優的k值
決策規則:一般爲多數表決,多數表決從某種程度上來說爲經驗風險最小化
1.2簡述KNN算法的優缺點:
優點:
1.思想簡單,理論成熟,既可以用來做分類也可以用來做迴歸。
2.訓練時間複雜度爲O(logN),如果採用kd-tree的話。
3.準確度高,對數據沒有假設,對離羣值不敏感。
缺點:
1.計算量大
2.樣本不平衡問題(即有些類別的樣本數量很多,而其他樣本的數量很少)
3.需要大量內存。
1.3 不平衡樣本可以給KNN預測結果造成哪些問題,有沒有什麼好的解決方式?
可能造成大數量的樣本佔多數,但是這類樣本不接近目標樣本。而數量小的這類樣本很靠近目標樣本。KNN不關心這個問題,他只關心哪類樣本的數量最多,而不去把距離遠近考慮在內。
改進方法:和該樣本距離小的鄰居權值大,遠的權值小,有次講距離遠近因素也考慮在內,避免一個樣本過大導致誤判的情況。
1.4 爲了解決KNN算法計算量過大問題,可以使用分組方式進行計算,簡述一下該方法原理。
將樣本集按近鄰關係分解成組,給出每組的質心得位置,以質心作爲代表點,和位置樣本計算距離,選出距離最近的一個或若干個組,再在組的範圍內應用一般KNN算法,由於並不是將位置樣本與所有樣本計算距離,故該計算可減少計算量,但不能減少存儲量。
1.5 什麼時曼哈頓距離和歐式距離?
不說了,沒意思(L1範數和L2的別稱)
1.6 爲什麼用歐式不用曼哈頓?
我們不用曼哈頓距離,因爲它只計算水平或垂直距離,有維度的限制。另一方面,歐氏距離可用於任何空間的距離計算問題。因爲,數據點可以存在於任何空間,歐氏距離是更可行的選擇。例如:想象一下國際象棋棋盤,象或車所做的移動是由曼哈頓距離計算的,因爲它們是在各自的水平和垂直方向做的運動。
1.7 簡述kd-tree的構造和搜索過程
參考《李航統計學方法》,同時注意一下:
-
選擇的特徵與樹的深度有關
-
時間複雜度爲O(logN)
-
樹的深度和數據的分佈密切相關。
-
具體的構造及搜索過程在這裏不說了,好好看看書 ,想看博客的話我就貼個連接吧(其實李航書上講的很清楚了,面試前多看兩遍就好了)
kd-tree -
最後,我想說:kd樹適用於訓練實例數遠大於空間維度的數據搜索,當訓練實例小於或接近特徵向量的維度時,算法時間複雜度會變成近似線性。
2. KNN來做迴歸
- 其實就是將k個鄰居加起來求平均然後輸出,這樣輸出就是連續值了。