文章目錄
【學習記錄】有監督學習和無監督學習的概念理解(機器學習)
1.有監督學習
有監督學習可以說是一種分類問題,通過已有的訓練樣本(已知數據及其對應的輸出)去訓練一個得到一個最優模型(模型是某個函數的集合,這裏的最優模型是指在某個評價準則下的最優,具體問題具體分析)。再利用這個訓練出來的模型將所有的輸入映射成爲相應的輸出,對輸出進行判斷從而實現分類的目的。
這裏我們可以通俗的說,就類似我們小時候在識事物,老師和家長會告訴你這是什麼東西,這就是已知數據及其對應的輸出,然後我們的腦子裏會慢慢的形成一個泛化的意識,這個意識就是我們訓練出來的模型(一種函數對應關係)。我們通過我們的意識看到某種東西,就可以反應出這是什麼,這就是將所有的輸入映射成爲相應的輸出。
KNN算法
KNN算法概念理解
KNN算法的核心思想是用距離目標數據最近的k個樣本數據的分類來代表目標數據的分類。因此KNN也叫k-鄰近算法。
我們可以先通俗的理解一下,比如判斷我的職業,KNN就是通過人以羣分的方法,如果我的身邊的朋友多數是程序員,那麼即判定我是個程序員。
如下圖所示,我們存在一個訓練樣本集,而在樣本集中存在特徵和目標變量這兩個概念,特徵在下圖中即圖標的空間座標,目標變量即圖標的分類(三角形還是正方形)。因此我們在輸入一個新的不含目標變量的數據(還未被分類),我們就通過KNN來判斷他的目標變量。
簡單演示一下KNN的過程(判斷綠色圓的目標變量):
當k=3時,距離綠色圓最近的三個圖標有兩個爲三角形,一個爲正方形,我們判斷未知數據的目標變量爲三角形。
當k=5時,距離綠色圓最近的五個圖標有兩個爲三角形,三個爲正方形,我們判斷未知數據的目標變量爲正方形。
KNN的優缺點
優點:算法簡單,易於理解。對異常值不敏感(雙刃劍)
缺點:結果受k值的影響大,k值的取值會影響結果的判定(k一般不超過20)。算法計算量大,需要計算每個樣本的距離,雖然理解簡單,但是不斷的計算,不夠優化。且當樣本的分佈不平衡的話,就無法準確判斷(比如我是一個老師,但是我經常和程序員打交道,身邊的朋友程序員佔絕大多數,因此訓練時我的身份被判定爲程序員)。
KNN算法的流程
(1)數據集的整理:有監督學習需要一個訓練樣本
(2)計算輸入的測試數據和每個訓練樣本的數據的距離(兩個公式)
(3)按照距離遞增排序
(4)選距離最近的k個點
(5)判斷這個k點的分類概率
(6)將返回的最高的分類概率,該分類及測試數據的分類
KNN算法分類器
#KNN算法分類器函數
from numpy import *
import operator
#函數參數:(測試數據,訓練數據,分類標籤,k值)
def classify(inX,dataSet, labels, k):
#dataSet.shape[0]指數據行數
dataSetSize = dataSet.shape[0]
'''
我們模擬一下下面的計算過程
假設測試數據(即輸入)爲[1,0,1]
訓練數據爲
[2,1,3]
[1,2,3]
[0,3,1]
==>
將測試數據域訓練數據進行相減,得到
==>
[-1,-1,-2]
[0,-2,-2]
[1,-3,0]
==>
將相減結果進行平方,得到
==>
[1,1,2]
[0,2,2]
[1,3,0]
==>
將其相加
==>
[4]
[4]
[4]
==>
開方
==>
[2]
[2]
[2]
==>
排序得[2,2,2]
'''
#相減
diffMat = tile(inX,(dataSetSize,1))-dataSet
#平方
sqDiffMat=diffMat**2
#相加
sqDistances=sqDiffMat.sum(axis=1)
#開方
distances=sqDistances**0.5 #計算歐式距離
#排序
sortedDistIndicies=distances.argsort() #排序並返回index
#選擇距離最近的k個值
classCount={}
for i in range(k):
voteIlabel=labels[sortedDistIndicies[i]]
#計算每個類別出現的頻率
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#排序
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
SVM算法
SVM算法概念理解
通俗理解:判斷我是哪裏人,比如福建和浙江的交界處是一條分割線,我在分割線靠福建這塊,就判斷我爲福建人,反之則爲浙江人。
特徵向量映射到空間的數據,有不同的目標變量(即分類),SVM的目的就是畫出一條準確的線來區分這兩種類別,在我們後續輸入新的測試數據照樣能很好的分類。
SVM算法的小知識
(1)SVM算法可以畫出很多條分界線,但是每一條的效果不一樣,如上圖所示,綠線明顯效果不好,藍線還算湊合,紅線的區分效果明顯比較好。我們把最好的那條分界線稱之爲劃分超平面(超平面指特徵如果是高維的,這樣的樣本空間的最佳分界是一個超平面)
(2)在SVM算法訓練出的分界中,以邊際最大的的超平面稱爲劃分超平面。邊際指在裏分界線(面)兩邊最近的兩個樣本數據的距離(如下圖)。
算法會盡量的讓邊際變得更大,因爲這樣使得分類的犯錯率減小。
SVM特性
- 算法的複雜度取決於支持向量(這裏的支持向量即坐落在邊際超平面上的點),與數據維度的高低關聯不大,因此SVM不容易產生過擬合。
- SVM在訓練時需要將空間中不是支持向量的點捨去(可以理解爲我們將離超平面距離遠的點捨去,以降低算法的複雜程度)
- 若訓練的樣本(支持向量)過少的話,SVM訓練出的算法容泛化
SVM算法的推導公式
https://blog.csdn.net/d__760/article/details/80387432
2.無監督學習
無監督學習的輸入數據沒有被標記,也無法通過輸入已知他的輸出結果。樣本的數據類別是未知的,然後我們通過樣本之間的相似程度對樣本集進行分類(聚類)。通俗理解:兒童去動物園,不知道這個動物是啥,但是參觀了一天下來,會發現老虎獅子是體型大的動物,兔子猴子是體型小的動物。類似這樣去把所輸入的知識通過數據間的相似性區分開來。(數據如下圖)
推薦參考文章:https://blog.csdn.net/qq_29373285/article/details/82529333
3.無監督學習和有監督學習的採用
(1)當我們有一個訓練樣本時(已標記)可以採取有監督學習(優先考慮)和無監督學習。但是如果正負樣本的分佈具有偏差(有小有大),那麼這時我們有監督學習的效果就不如無監督學習了。(這裏可以自己腦補上述KNN算法和SVM算法數據不平衡時的情況)
(2)當無訓練樣本一定不能使用有監督學習的方法。(沒有分類無從下手)