【學習記錄】有監督學習和無監督學習的概念理解

【學習記錄】有監督學習和無監督學習的概念理解(機器學習)

1.有監督學習

有監督學習可以說是一種分類問題,通過已有的訓練樣本(已知數據及其對應的輸出)去訓練一個得到一個最優模型(模型是某個函數的集合,這裏的最優模型是指在某個評價準則下的最優,具體問題具體分析)。再利用這個訓練出來的模型將所有的輸入映射成爲相應的輸出,對輸出進行判斷從而實現分類的目的。

這裏我們可以通俗的說,就類似我們小時候在識事物,老師和家長會告訴你這是什麼東西,這就是已知數據及其對應的輸出,然後我們的腦子裏會慢慢的形成一個泛化的意識,這個意識就是我們訓練出來的模型(一種函數對應關係)。我們通過我們的意識看到某種東西,就可以反應出這是什麼,這就是將所有的輸入映射成爲相應的輸出。

KNN算法

KNN算法概念理解

KNN算法的核心思想是用距離目標數據最近的k個樣本數據的分類來代表目標數據的分類。因此KNN也叫k-鄰近算法。

我們可以先通俗的理解一下,比如判斷我的職業,KNN就是通過人以羣分的方法,如果我的身邊的朋友多數是程序員,那麼即判定我是個程序員。

如下圖所示,我們存在一個訓練樣本集,而在樣本集中存在特徵目標變量這兩個概念,特徵在下圖中即圖標的空間座標,目標變量即圖標的分類(三角形還是正方形)。因此我們在輸入一個新的不含目標變量的數據(還未被分類),我們就通過KNN來判斷他的目標變量。

簡單演示一下KNN的過程(判斷綠色圓的目標變量):
當k=3時,距離綠色圓最近的三個圖標有兩個爲三角形,一個爲正方形,我們判斷未知數據的目標變量爲三角形。
當k=5時,距離綠色圓最近的五個圖標有兩個爲三角形,三個爲正方形,我們判斷未知數據的目標變量爲正方形。
img

KNN的優缺點

優點:算法簡單,易於理解。對異常值不敏感(雙刃劍)

缺點:結果受k值的影響大,k值的取值會影響結果的判定(k一般不超過20)。算法計算量大,需要計算每個樣本的距離,雖然理解簡單,但是不斷的計算,不夠優化。且當樣本的分佈不平衡的話,就無法準確判斷(比如我是一個老師,但是我經常和程序員打交道,身邊的朋友程序員佔絕大多數,因此訓練時我的身份被判定爲程序員)。

KNN算法的流程

(1)數據集的整理:有監督學習需要一個訓練樣本

(2)計算輸入的測試數據和每個訓練樣本的數據的距離(兩個公式)

  • d(x,y)=i=1n(xiyi)2 歐式距離公式:d(x,y)=\sqrt {\sum_{i=1}^n(x_{i}-y_{i})^2}

d(x,y)=i=1nxiyi 曼哈頓距離公式:d(x,y)=\sum_{i=1}^n|x_{i}-y_{i}|

(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的目的就是畫出一條準確的線來區分這兩種類別,在我們後續輸入新的測試數據照樣能很好的分類。
img

SVM算法的小知識

(1)SVM算法可以畫出很多條分界線,但是每一條的效果不一樣,如上圖所示,綠線明顯效果不好,藍線還算湊合,紅線的區分效果明顯比較好。我們把最好的那條分界線稱之爲劃分超平面(超平面指特徵如果是高維的,這樣的樣本空間的最佳分界是一個超平面)
(2)在SVM算法訓練出的分界中,以邊際最大的的超平面稱爲劃分超平面。邊際指在裏分界線(面)兩邊最近的兩個樣本數據的距離(如下圖)。

img
算法會盡量的讓邊際變得更大,因爲這樣使得分類的犯錯率減小。

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)當無訓練樣本一定不能使用有監督學習的方法。(沒有分類無從下手)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章