關鍵字
樣本的特征數稱為維數(dimensionality),當維數非常大時,也就是現(xiàn)在所說的“維數災難”,具體表現(xiàn)在:在高維情形下,數據樣本將變得十分稀疏,因為此時要滿足訓練樣本為“密采樣”的總體樣本數目是一個觸不可及的天文數字,訓練樣本的稀疏使得其代表總體分布的能力大大減弱,從而消減了學習器的泛化能力;同時當維數很高時,計算距離也變得十分復雜,甚至連計算內積都不再容易,這也是為什么支持向量機(SVM)使用核函數“低維計算,高維表現(xiàn)”的原因。
1、k近鄰學習(KNN算法)
k近鄰學習是一種常用的監(jiān)督學習方法,無需訓練訓練集,是較為簡單的經典機器學習算法之一,可以處理回歸問題和分類問題。
其工作機制很簡單:給定測試樣本,基于某種距離度量找出訓練集中與其最靠近的k個訓練樣本,然后基于這k個“鄰居”的信息來進行預測。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k近鄰算法中k的出處,通常k是不大于20的整數。
通常在分類任務中可使用“投票法”,即選擇這k個樣本中出現(xiàn)最多的類別標記作為預測結果;在回歸任務中可使用“平均法”,即將這k個樣本的實值輸出標記的平均值作為預測結果,還可以基于距離遠近進行加權平均或加權投票,距離越近的樣本權重越大。
投票法:通常在分類任務中使用,判別方法是選擇這k個樣本中出現(xiàn)最多的雷冰標記作為預測結果。
平均法:通常在回歸任務中使用,判別方法是將這k個樣本的實值輸出標記的平均值最為預測結果。
加權平均或加權投票:根據距離遠近來決定權重,距離越近,權重越大。
2、SVM和KNN算法區(qū)別
SVM算法樣本需要固定,屬于急切性學習,即在存在訓練階段,在學習模型中訓練好后,與驗證集比較,將低維度問題上升到高緯度
KNN算法不需要固定樣本數量,屬于懶惰學習,沒有顯示的訓練過程,它在訓練階段只是把數據保存下來,訓練時間開銷為0,等收到測試樣本后進行處理
3、KNN優(yōu)缺點:
優(yōu)點:
(1)簡單,易于理解,易于實現(xiàn),無需參數估計,無需訓練,用法靈活;(2) 精度高,對異常值不敏感,無數據輸入假定
(3)適合對稀有事件進行分類;
(4) 適合于多分類問題(multi-modal,對象具有多個類別標簽),KNN要比SVM表現(xiàn)要好
(5)對于小樣本預測方便
缺點:
(1)計算復雜度高、空間復雜度高,對大量測試樣本計算量大,資源開銷大。
(2)K值的選擇:最大的缺點是當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數。
(3) KNN是一種消極學習方法、懶惰算法。 缺少訓練階段,無法應對多樣本。
4、KNN實現(xiàn)步驟:
1)計算距離
歐氏距離(Euclidean distance),即
2)按照距離的遞增關系進行排序;
3)選取距離最小的K個點(一般不大于20個);
4)確定前K個點所在類別的出現(xiàn)頻率:
出現(xiàn)頻率 =某個類別 / k
5)返回前K個點中出現(xiàn)頻率最高的類別作為測試數據的預測分類。
舉個例子,根據下圖,測試樣本m在圖中央,若k=1時,樣本m的近鄰點為“+”,則判斷樣本m為“+”。當k=3時,近鄰點有1個+、2個-,則判斷為“-”。當k=5時,近鄰點有3個+、2個-,則判斷為“+”。
4.1、歐幾里得距離、巴氏距離、馬氏距離的區(qū)別:
歐幾里得距離
歐幾里得距離也叫做(歐氏距離)是歐幾里得空間中兩點的“普遍”(直線距離)。缺點主要有兩個:(1)將各個分量的量綱(scale),也就是“單位”當作相同的看待了。(2)沒有考慮各個分量的分布(期望,方差等)可能是不同的。
舉個例子:二維樣本(身高,體重),其中身高范圍是150-190,體重范圍是50-60,有三個樣本:a(180,50),b(190,50),c(180,60)。那么a與b之間的閔氏距離(無論是曼哈頓距離、歐氏距離或切比雪夫距離)等于a與c之間的閔氏距離,但是身高的10cm不等價于體重的10kg。
代碼實現(xiàn)
import numpy as np
np.linalg(vector1-vector2, ord=2)
巴氏距離
在統(tǒng)計中,Bhattacharyya距離測量兩個離散或連續(xù)概率分布的相似性。它與衡量兩個統(tǒng)計樣品或種群之間的重疊量的Bhattacharyya系數密切相關。Bhattacharyya距離和Bhattacharyya系數以20世紀30年代曾在印度統(tǒng)計研究所工作的一個統(tǒng)計學家A. Bhattacharya命名。同時,Bhattacharyya系數可以被用來確定兩個樣本被認為相對接近的,它是用來測量中的類分類的可分離性。
巴氏距離的定義
對于離散概率分布 p和q在同一域 X,它被定義為:
其中
它是Bhattacharyya系數。
馬氏距離
由印度科學家馬哈拉諾比斯提出,表示數據的協(xié)方差距離。是一種有效的計算兩個位置樣本集相似度的方法。與歐氏距離不同的是他考慮到各種特性之間的聯(lián)系并且是尺度無關的,即獨立于測量尺度。如果協(xié)方差矩陣為單位矩陣,馬氏距離就簡化為歐式距離,如果協(xié)方差矩陣為對角陣,其也可稱為正規(guī)化的馬氏距離。
優(yōu)點:(1)它不受量綱的影響,兩點之間的馬氏距離與原始數據的測量單位無關。(它考慮到各種特性之間的聯(lián)系(例如:一條關于身高的信息會帶來一條關于體重的信息,因為兩者是有關聯(lián)的)并且是尺度無關的(scale-invariant),即獨立于測量尺度);(2)馬氏距離還可以排除變量之間的相關性的干擾。
缺點:(1)夸大了變化微小的變量的作用。(2)受協(xié)方差矩陣不穩(wěn)定的影響,馬氏距離并不總是能順利計算出。即計算馬氏距離過程中,要求總體樣本數大于樣本的維數,否則得到的總體樣本協(xié)方差矩陣逆矩陣不存在。(3)如果樣本的維數非常大,那么計算它的協(xié)方差矩陣是十分耗時的
代碼實現(xiàn):
import numpy as np
x=np.random.random(10)
y=np.random.random(10)
#馬氏距離要求樣本數要大于維數,否則無法求協(xié)方差矩陣
#此處進行轉置,表示10個樣本,每個樣本2維
X=np.vstack([x,y])
XT=X.T
#根據公式求解
S=np.cov(X) #兩個維度之間協(xié)方差矩陣
SI = np.linalg.inv(S) #協(xié)方差矩陣的逆矩陣
#馬氏距離計算兩個樣本之間的距離,此處共有10個樣本,兩兩組合,共有45個距離。
n=XT.shape[0]
d1=[]
for i in range(0,n):
for j in range(i+1,n):
delta=XT[i]-XT[j]
d=np.sqrt(np.dot(np.dot(delta,SI),delta.T))
d1.append(d)
表格統(tǒng)計
歐氏距離 | 巴氏距離 | 馬氏距離 | |
---|---|---|---|
優(yōu)點 | 易于理解、適用于大多數場景 | 可以測量兩個離散或連續(xù)概率分布的相似性。 | (1)它不受量綱的影響,兩點之間的馬氏距離與原始數據的測量單位無關。 (2)馬氏距離還可以排除變量之間的相關性的干擾。 |
缺點 | (1)將各個分量的量綱(scale),也就是“單位”當作相同的看待了。(2)沒有考慮各個分量的分布(期望,方差等)可能是不同的。 | 使用場景較少 | (1)夸大了變化微小的變量的作用。 (2)受協(xié)方差矩陣不穩(wěn)定的影響,馬氏距離并不總是能順利計算出。 (3)如果樣本的維數非常大,那么計算它的協(xié)方差矩陣是十分耗時的! |
相同點 | (1)如果馬氏距離的協(xié)方差矩陣為單位矩陣,馬氏距離就簡化為歐氏距離 | (2)歐氏和馬氏都是計算兩個未知樣本集的相似度的方法。 | (3)歐氏和馬氏距離都可以計算多維度數據 |
不同點 | (1)馬氏距離它不受量綱的影響,兩點之間的馬氏距離與原始數據的測量單位無關而歐氏當各個分量為不同性質的量時,“距離”的大小與指標的單位有關。它將樣品的不同屬性之間的差別等同看待 | (2)馬氏距離的計算是不穩(wěn)定的而歐氏和巴氏是穩(wěn)定的 | (3)巴氏距離測量兩個離散或連續(xù)概率分布的相似性 |
公式 |
參考博客:
https://blog.csdn.net/jideljd_2010/article/details/39938555
https://blog.csdn.net/shenbo2030/article/details/44226919
https://blog.csdn.net/mousever/article/details/45967643
5、MDS多維標度法
k近鄰學習方法基于一個重要的假設:任意測試樣本x附近任意小的 距離范圍內總能找到一個訓練樣本,即訓練樣本的采樣密度足夠大,或稱為密采樣(dense sample)。不過這在現(xiàn)實任務中一般很難滿足,假設 ,在單個屬性情況下,僅需1000個樣本點平均分布在歸一化后的屬性取值范圍內[0,1],即可使得任務測試樣本在其附近0.001距離范圍內總能找到一個訓練樣本,此時最近鄰分類器的錯誤率不超過貝葉斯最優(yōu)分類器的錯誤率的兩倍;但若在多個屬性情況下,如假定屬性維數是20,按照密采樣條件要求,至少需要 (〖10〗^3 )20=〖10〗60個樣本。現(xiàn)實應用中屬性維數眾多,要滿足密采樣條件,所需的樣本數目將是天文數字。而且還要考慮距離度量計算,高維空間對距離計算來說不是簡單的開銷,當維數很高時,連計算內積都不容易。
上文的分析暴露一個很嚴重的問題,就是高維情形下,樣本數的采樣以及距離計算問題。在高維情形下出現(xiàn)的數據樣本稀疏、距離計算困難等問題,是所有機器學習方法共同面臨的嚴重障礙,被稱為維數災難(curse of dimensionality)。
緩解維數災難的兩個途徑:一是特征選擇;二是本文要重點介紹的降維(dimension reduction)。思路上,這兩種途徑都是減少維數,不過一個是在事前,一個是在事中。降維,也稱維數約簡,通過某種數學變換將原始高維屬性空間轉變?yōu)橐粋€低維子空間(subspace),在子空間中,樣本密度可以大幅提高,距離計算也相對容易。事實上,觀測或收集到的數據樣本雖然是高維的,但與學習任務相關的或許只是某個低維分布,這也是特征選擇可以事前根據業(yè)務來定義的。
在很多時候,人們觀測或收集到的數據樣本雖然是高維的,但與學習任務密切相關的也許僅是某個低維分布,即高維空間中的一個低維嵌入,如圖10.2,原始高維空間中的樣本點,在這個低維嵌入空間中更容易進行學習。
線性降維方法:基于線性變換來進行降維的方法。
5.1 不管是使用核函數升維還是對數據降維,我們都希望原始空間樣本點之間的距離在新空間中基本保持不變,這樣才不會使得原始空間樣本之間的關系及總體分布發(fā)生較大的改變。“多維縮放”(MDS)正是基于這樣的思想,MDS要求原始空間樣本之間的距離在降維后的低維空間中得以保持,如圖10.2
算法實現(xiàn):
import numpy as np
import operator
def createDataset():
#四組二維特征
group = np.array([[5,115],[7,106],[56,11],[66,9]])
#四組對應標簽
labels = ('動作片','動作片','愛情片','愛情片')
return group,labels
def classify(intX,dataSet,labels,k):
'''
KNN算法
'''
#numpy中shape[0]返回數組的行數,shape[1]返回列數
#MDS降維操作
dataSetSize = dataSet.shape[0]
#去逆矩陣
diffMat = np.tile(intX,(dataSetSize,1))-dataSet
#二維特征相減后乘方
sqdifMax = diffMat**2
#計算距離
seqDistances = sqdifMax.sum(axis=1)
distances = seqDistances**0.5
print ("distances:",distances)
#返回distance中元素從小到大排序后的索引
sortDistance = distances.argsort()
print ("sortDistance:",sortDistance)
classCount = {}
for i in range(k):
#取出前k個元素的類別
voteLabel = labels[sortDistance[i]]
print ("第%d個voteLabel=%s",i,voteLabel)
classCount[voteLabel] = classCount.get(voteLabel,0)+1
#dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認值。
#計算類別次數
#key=operator.itemgetter(1)根據字典的值進行排序
#key=operator.itemgetter(0)根據字典的鍵進行排序
#reverse降序排序字典
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
#結果sortedClassCount = [('動作片', 2), ('愛情片', 1)]
print ("sortedClassCount:",sortedClassCount)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataset()
test = [20,101]
test_class = classify(test,group,labels,3)
print (test_class)
完整代碼查看碼云
5.2 主成分分析(PCA)
參閱:http://blog.csdn.net/hellotruth/article/details/30750823
簡單說:以二維特征為例,如下圖。特征之間可能不存在完全的線性關系,可能只是強的正相關。如果把x-y坐標分解成u1-u2坐標,而u1軸線上反應了特征的主要變化(intrinsic),而u2的特征變化較小,其實可以完全理解為一些噪聲的擾動而不去考慮它。PCA的任務就是找到u1和u2。
PCA其實是最簡單的降維方法之一了,很明顯的劣勢是它僅去除數據之間的線性相關性。對線性的改善往往通過kernel技術拓展到非線性的應用上。另外,PCA的這種降維不一定有助于分類,用于分類的降維方法之一就是LDA。從另一方面說,PCA是一種線性投影,保留了數據與數據之間的歐式距離,即原來歐式距離大的兩點在降維后的空間中距離也應大(這樣才好保證方差大)。而事實上數據有可能呈現(xiàn)某種流型結構,用PCA降維后數據將不能保持原有的流型結構。
原理:PCA采用一組新的基來表示樣本點,其中每一個基向量都是原來基向量的線性組合,通過使用盡可能少的新基向量來表出樣本,從而達到降維的目的。
假設使用d’個新基向量來表示原來樣本,實質上是將樣本投影到一個由d’個基向量確定的一個超平面上(即舍棄了一些維度),要用一個超平面對空間中所有高維樣本進行恰當的表達,最理想的情形是:若這些樣本點都能在超平面上表出且這些表出在超平面上都能夠很好地分散開來。但是一般使用較原空間低一些維度的超平面來做到這兩點十分不容易,因此我們退一步海闊天空,要求這個超平面應具有如下兩個性質:
最近重構性:樣本點到超平面的距離足夠近,即盡可能在超平面附近;
最大可分性:樣本點在超平面上的投影盡可能地分散開來,即投影后的坐標具有區(qū)分性。
這里十分神奇的是:最近重構性與最大可分性雖然從不同的出發(fā)點來定義優(yōu)化問題中的目標函數,但最終這兩種特性得到了完全相同的優(yōu)化問題:
接著使用拉格朗日乘子法求解上面的優(yōu)化問題,得到:
因此只需對協(xié)方差矩陣進行特征值分解即可求解出W,PCA算法的整個流程如下圖所示:
總結
PCA優(yōu)缺點:
優(yōu)點:1)最小誤差。2)提取了主要信息
缺點:1)計算協(xié)方差矩陣,計算量大
LDA方法簡介
(1)LDA核心思想:往線性判別超平面的法向量上投影,使得區(qū)分度最大(高內聚,低耦合)。
(2)LDA優(yōu)缺點:
優(yōu)點:1)簡單易于理解
缺點:2)計算較為復雜
在很多問題上,可能需要非線性映射才能找到恰當的低維嵌入。那么非線性降維常用的一種方法,就是基于核技巧對線性降維方法進行“核化”(使用一個超平面去近似表出)。例如核主成分分析(KPCA)
下面主要介紹核化主成分分析(KPCA)的思想。
若核函數的形式已知,即我們知道如何將低維的坐標變換為高維坐標,這時我們只需先將數據映射到高維特征空間,再在高維空間中運用PCA即可。但是一般情況下,我們并不知道核函數具體的映射規(guī)則,例如:Sigmoid、高斯核等,我們只知道如何計算高維空間中的樣本內積,這時就引出了KPCA的一個重要創(chuàng)新之處:即空間中的任一向量,都可以由該空間中的所有樣本線性表示。證明過程也十分簡單:
這樣我們便可以將高維特征空間中的投影向量wi使用所有高維樣本點線性表出,接著代入PCA的求解問題,得到:
化簡到最后一步,發(fā)現(xiàn)結果十分的美妙,只需對核矩陣K進行特征分解,便可以得出投影向量wi對應的系數向量α,因此選取特征值前d’大對應的特征向量便是d’個系數向量。這時對于需要降維的樣本點,只需按照以下步驟便可以求出其降維后的坐標。可以看出:KPCA在計算降維后的坐標表示時,需要與所有樣本點計算核函數值并求和,因此該算法的計算開銷十分大。
流行學習是一類借鑒了拓撲流形概念的降維方法。常用的流行學習方法有等度量映射和局部線性嵌入。
1 等度量映射(Isomap)
等度量映射的基本出發(fā)點是:高維空間中的直線距離具有誤導性,因為有時高維空間中的直線距離在低維空間中是不可達的。因此利用流形在局部上與歐式空間同胚的性質,可以使用近鄰距離來逼近測地線距離,即對于一個樣本點,它與近鄰內的樣本點之間是可達的,且距離使用歐式距離計算,這樣整個樣本空間就形成了一張近鄰圖,高維空間中兩個樣本之間的距離就轉為最短路徑問題。可采用著名的Dijkstra算法或Floyd算法計算最短距離,得到高維空間中任意兩點之間的距離后便可以使用MDS算法來其計算低維空間中的坐標。
從MDS算法的描述中我們可以知道:MDS先求出了低維空間的內積矩陣B,接著使用特征值分解計算出了樣本在低維空間中的坐標,但是并沒有給出通用的投影向量w,因此對于需要降維的新樣本無從下手,書中給出的權宜之計是利用已知高/低維坐標的樣本作為訓練集學習出一個“投影器”,便可以用高維坐標預測出低維坐標。Isomap算法流程如下圖:
對于近鄰圖的構建,常用的有兩種方法:一種是指定近鄰點個數,像kNN一樣選取k個最近的鄰居;另一種是指定鄰域半徑,距離小于該閾值的被認為是它的近鄰點。但兩種方法均會出現(xiàn)下面的問題:
若鄰域范圍指定過大,則會造成“短路問題”,即本身距離很遠卻成了近鄰,將距離近的那些樣本扼殺在搖籃。
若鄰域范圍指定過小,則會造成“斷路問題”,即有些樣本點無法可達了,整個世界村被劃分為互不可達的小部落。
2 局部線性嵌入(LLE)
不同于Isomap算法去保持鄰域距離,LLE算法試圖去保持鄰域內的線性關系,假定樣本xi的坐標可以通過它的鄰域樣本線性表出:
LLE算法分為兩步走,首先第一步根據近鄰關系計算出所有樣本的鄰域重構系數w:
接著根據鄰域重構系數不變,去求解低維坐標:
這樣利用矩陣M,優(yōu)化問題可以重寫為:
M特征值分解后最小的d’個特征值對應的特征向量組成Z,LLE算法的具體流程如下圖所示:
首先要學習出距離度量必須先定義一個合適的距離度量形式。對兩個樣本xi與xj,它們之間的平方歐式距離為:
若各個屬性重要程度不一樣即都有一個權重,則得到加權的平方歐式距離:
此時各個屬性之間都是相互獨立無關的,但現(xiàn)實中往往會存在屬性之間有關聯(lián)的情形,例如:身高和體重,一般人越高,體重也會重一些,他們之間存在較大的相關性。這樣計算距離就不能分屬性單獨計算,于是就引入經典的馬氏距離(Mahalanobis distance):
標準的馬氏距離中M是協(xié)方差矩陣的逆,馬氏距離是一種考慮屬性之間相關性且尺度無關(即無須去量綱)的距離度量。
矩陣M也稱為“度量矩陣”,為保證距離度量的非負性與對稱性,M必須為(半)正定對稱矩陣,這樣就為度量學習定義好了距離度量的形式,換句話說:度量學習便是對度量矩陣進行學習。現(xiàn)在來回想一下前面我們接觸的機器學習不難發(fā)現(xiàn):機器學習算法幾乎都是在優(yōu)化目標函數,從而求解目標函數中的參數。同樣對于度量學習,也需要設置一個優(yōu)化目標,書中簡要介紹了錯誤率和相似性兩種優(yōu)化目標,此處限于篇幅不進行展開。
總結:
數據降維的目的:數據降維,直觀地好處是維度降低了,便于計算和可視化,其更深層次的意義在于有效信息的提取綜合及無用信息的擯棄。
數據降維的好處:降維可以方便數據可視化+數據分析+數據壓縮+數據提取等。
-········
【問題】knn似乎和降維沒有關系?
降維是將原高維空間嵌入到一個合適的低維子空間中,接著在低維空間中進行學習任務;度量學習則是試圖去學習出一個距離度量來等效降維的效果,兩者都是為了解決維數災難帶來的諸多問題。
那kNN呢,為什么一開頭就說了kNN算法,但是好像和后面沒有半毛錢關系?
正是因為在降維算法中,低維子空間的維數d’通常都由人為指定,因此我們需要使用一些低開銷的學習器來選取合適的d’,kNN這家伙懶到家了根本無心學習,在訓練階段開銷為零,測試階段也只是遍歷計算了距離,因此拿kNN來進行交叉驗證就十分有優(yōu)勢了~同時降維后樣本密度增大同時距離計算變易,更為kNN來展示它獨特的十八般手藝提供了用武之地。
參考文獻:
https://www.cnblogs.com/nolonely/p/6435159.html