核函數和激活函數和異常檢測和聚類(outlier detection)


特徵工程 Feature Engineering(一)
PimaIndiansdiabetes-數據預處理實驗(一)
聚類總結(一)K-means、層次、DBSCAN、均值漂移、K-Means 與 KNN
聚類總結(二)聚類性能評估、肘部法則、輪廓係數
網格搜索 GridSearchCV\訓練集、驗證集和測試集

一、核函數

  有人說核函數與內積是等價的,我贊同這一觀點。當我們將低維空間的數據映射到高維空間的時候,我們甚至不需要知道映射函數是什麼,就算知道了又能怎麼樣,它只會給我們帶來計算的複雜度。我們需要的是這種類型的核函數可以在低維空間中用怎樣的形式表現出來,因爲低維空間的表達式纔是容易計算的。可以說,內積是核函數實現的一種技巧。沒有內積,就沒有核函數;沒有核函數,也就體現不出內積的價值。

1.1 Linear核函數

  要用於線性可分的情形。參數少,速度快,對於一般數據,分類效果已經很理想了。線性核,主要用於線性可分的情況,我們可以看到特徵空間到輸入空間的維度是一樣的,其參數少速度快,對於線性可分數據,其分類效果很理想,因此我們通常首先嚐試用線性核函數來做分類,看看效果如何,如果不行再換別的

1.2 RBF高斯核函數

  主要用於線性不可分的情形。參數多,分類結果非常依賴於參數。有很多人是通過訓練數據的交叉驗證來尋找合適的參數,不過這個過程比較耗時。我個人的體會是:使用libsvm,默認參數,RBF核比Linear核效果稍差。通過進行大量參數的嘗試,一般能找到比linear核更好的效果。至於到底該採用哪種核,要根據具體問題,有的數據是線性可分的,有的不可分,需要多嘗試不同核不同參數。如果特徵的提取的好,包含的信息量足夠大,很多問題都是線性可分的。當然,如果有足夠的時間去尋找RBF核參數,應該能達到更好的效果。

  RBF kernel可以處理非線性的情況,linear kernel可以是RBF kernel的特殊情況;高斯徑向基函數是一種局部性強的核函數,其可以將一個樣本映射到一個更高維的空間內,該核函數是應用最廣的一個,無論大樣本還是小樣本都有比較好的性能,而且其相對於多項式核函數參數要少,因此大多數情況下在不知道用什麼核函數的時候,優先使用高斯核函數。

1.3 sigmoid核函數

  採用sigmoid核函數,支持向量機實現的就是一種多層神經網絡。

1.4 多項式核函數

  polynomial kernel的參數比RBF多,而參數越多模型越複雜;多項式核函數可以實現將低維的輸入空間映射到高緯的特徵空間,但是多項式核函數的參數多,當多項式的階數比較高的時候,核矩陣的元素值將趨於無窮大或者無窮小,計算複雜度會大到無法計算。

1.5 選擇核函數的方法

  

  • 如果特徵的數量大到和樣本數量差不多,則選用LR或者線性核的SVM;
  • 如果特徵的數量小,樣本的數量正常,則選用SVM+高斯核函數;
  • 如果特徵的數量小,而樣本的數量很大,則需要手工添加一些特徵從而變成第一種情況。
  • RBF kernel更方便計算,取值在[0,1];而用polynomial kernel取值範圍是(0,inf),在自由度高的情況下更凸顯出劣勢;至於sigmoid,它可能在某些參數下是無效的
  • RBF核函數可以將一個樣本映射到一個更高維的空間,而且線性核函數是RBF的一個特例,也就是說如果考慮使用RBF,那麼就沒有必要考慮線性核函數了。
  • 與多項式核函數相比,RBF需要確定的參數要少,核函數參數的多少直接影響函數的複雜程度。另外,當多項式的階數比較高時,核矩陣的元素值將趨於無窮大或無窮小,而RBF則在上,會減少數值的計算困難。
  • 對於某些參數,RBF和sigmoid具有相似的性能。

1.6 核函數對應的參數

1)對於線性核函數,沒有專門需要設置的參數 
2)對於多項式核函數,有三個參數。-d用來設置多項式核函數的最高此項次數,也就是公式中的d,默認值是3。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。 
3)對於RBF核函數,有一個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。 
4)對於sigmoid核函數,有兩個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。
from sklearn.cluster import KMeans
model = KMeans(n_clusters=8,
               init='k-means++',
               n_init=10,
               max_iter=300,
               tol=0.0001,
               precompute_distances='auto',
               verbose=0,
               random_state=None,
               copy_x=True,
               n_jobs=None,
               algorithm='auto')

參數的意義:

  • n_clusters:簇的個數,即你想聚成幾類
  • init: 初始簇中心的獲取方法
  • n_init: 獲取初始簇中心的更迭次數,爲了彌補初始質心的影響,算法默認會初始10個質心,實現算法,然後返回最好的結果。
  • max_iter: 最大迭代次數(因爲kmeans算法的實現需要迭代)
  • tol: 容忍度,即kmeans運行準則收斂的條件
  • precompute_distances:是否需要提前計算距離,這個參數會在空間和時間之間做權衡,如果是True 會把整個距離矩陣都放到內存中,auto 會默認在數據樣本大於- featurs*samples 的數量大於12e6 的時候False,False 時核心實現的方法是利用Cpython 來實現的
  • verbose: 冗長模式(不太懂是啥意思,反正一般不去改默認值)
  • random_state: 隨機生成簇中心的狀態條件。
  • copy_x: 對是否修改數據的一個標記,如果True,即複製了就不會修改數據。bool 在- scikit-learn 很多接口中都會有這個參數的,就是是否對輸入數據繼續copy 操作,以便不修改用戶的輸入數據。這個要理解Python 的內存機制纔會比較清楚。
  • n_jobs: 並行設置
  • algorithm: kmeans的實現算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式實現

1.7 聚類初始質心的選取

  
常見的方法是隨機的選取初始質心,但是這樣簇的質量常常很差。
(1)多次運行,每次使用一組不同的隨機初始質心,然後選取具有最小SSE(誤差的平方和)的簇集。這種策略簡單,但是效果可能不好,這取決於數據集和尋找的簇的個數。

(2)取一個樣本,並使用層次聚類技術對它聚類。從層次聚類中提取K個簇,並用這些簇的質心作爲初始質心。該方法通常很有效,但僅對下列情況有效:樣本相對較小;K相對於樣本大小較小。

(3)取所有點的質心作爲第一個點。然後,對於每個後繼初始質心,選擇離已經選取過的初始質心最遠的點。使用這種方法,確保了選擇的初始質心不僅是隨機的,而且是散開的。但是,這種方法可能選中離羣點。

1.8 聚類算法停止條件

  
一般是目標函數達到最優或者達到最大的迭代次數即可終止。對於不同的距離度量,目標函數往往不同。當採用歐式距離時,目標函數一般爲最小化對象到其簇質心的距離的平方和;當採用餘弦相似度時,目標函數一般爲最大化對象到其簇質心的餘弦相似度和。

1.9 聚類距離的度量

常用的距離度量方法包括:歐幾里得距離和餘弦相似度。歐幾里得距離度量會受指標不同單位刻度的影響,所以一般需要先進行標準化,同時距離越大,個體間差異越大;空間向量餘弦夾角的相似度度量不會受指標刻度的影響,餘弦值落於區間[-1,1],值越大,差異越小。

二、激活函數

  激活函數,即Activation Function,有時候也稱作激勵函數。它是爲了解決線性不可分的問題引出的。但是也不是說線性可分就不能用激活函數,也是可以的。它的目的是爲了使數據更好的展現出我們想要的效果。

2.1 tanh激活

  tanh是雙曲正切函數,tanh是zero-centered,但是還是會飽和。tanh函數和sigmod函數的曲線是比較相近的,咱們來比較一下看看。首先相同的是,這兩個函數在輸入很大或是很小的時候,輸出都幾乎平滑,梯度很小,不利於權重更新;不同的是輸出區間,tanh的輸出區間是在(-1,1)之間,而且整個函數是以0爲中心的,這個特點比sigmod的好。

  一般二分類問題中,隱藏層用tanh函數,輸出層用sigmod函數。不過這些也都不是一成不變的,具體使用什麼激活函數,還是要根據具體的問題來具體分析,還是要靠調試的。

2.2 sigmoid 函數

  在sigmod函數中我們可以看到,其輸出是在(0,1)這個開區間內;特點:可以解釋,比如將0-1之間的取值解釋成一個神經元的激活率(firing rate)

  知識點:對於函數f(x),若x趨向於負無窮大,其導數f’(x)趨向於0,則稱其爲左飽和。若x趨向於正無窮大,其導數f’(x)趨向於0,則稱其爲右飽和。同時滿足左右飽和時,稱爲兩端飽和。

缺陷

  有飽和區域,是軟飽和,在大的正數和負數作爲輸入的時候,梯度就會變成零,使得神經元基本不能更新。
  只有正數輸出(不是zero-centered),這就導致所謂的zigzag現象:

  在sigmod函數中我們可以看到,其輸出是在(0,1)這個開區間內

函數本身是有一定的缺陷:

  1. 當輸入稍微遠離了座標原點,函數的梯度就變得很小了,幾乎爲零。在神經網絡反向傳播的過程中,我們都是通過微分的鏈式法則來計算各個權重w的微分的。當反向傳播經過了sigmod函數,這個鏈條上的微分就很小很小了,況且還可能經過很多個sigmod函數,最後會導致權重w對損失函數幾乎沒影響,這樣不利於權重的優化,這個問題叫做梯度飽和,也可以叫梯度彌散。

  2. 函數輸出不是以0爲中心的,這樣會使權重更新效率降低。對於這個缺陷,在斯坦福的課程裏面有詳細的解釋。

  3. sigmod函數要進行指數運算,這個對於計算機來說是比較慢的。

2.3 ReLU函數

  ReLU(Rectified Linear Unit)函數是目前比較火的一個激活函數,相比於sigmod函數和tanh函數,它有以下幾個優點

  1. 在輸入爲正數的時候,不存在梯度飽和問題。

  2. 計算速度要快很多。ReLU函數只有線性關係,不管是前向傳播還是反向傳播,都比sigmod和tanh要快很多。(sigmod和tanh要計算指數,計算速度會比較慢)

  當然,缺點也是有的:

  1. 當輸入是負數的時候,ReLU是完全不被激活的,這就表明一旦輸入到了負數,ReLU就會死掉。這樣在前向傳播過程中,還不算什麼問題,有的區域是敏感的,有的是不敏感的。但是到了反向傳播過程中,輸入負數,梯度就會完全到0,這個和sigmod函數、tanh函數有一樣的問題。

  2. 我們發現ReLU函數的輸出要麼是0,要麼是正數,這也就是說,ReLU函數也不是以0爲中心的函數。

  CNN中常用。對正數原樣輸出,負數直接置零。在正數不飽和,在負數硬飽和。relu計算上比sigmoid或者tanh更省計算量,因爲不用exp,因而收斂較快。但是還是非zero-centered。

  relu在負數區域被kill的現象叫做dead relu,這樣的情況下,有人通過初始化的時候用一個稍微大於零的數比如0.01來初始化神經元,從而使得relu更偏向於激活而不是死掉,但是這個方法是否有效有爭議。

2.4 PReLU函數

  PReLU也是針對ReLU的一個改進型,在負數區域內,PReLU有一個很小的斜率,這樣也可以避免ReLU死掉的問題。相比於ELU,PReLU在負數區域內是線性運算,斜率雖然小,但是不會趨於0,這算是一定的優勢吧。

  我們看PReLU的公式,裏面的參數α一般是取0~1之間的數,而且一般還是比較小的,如零點零幾。當α=0.01時,我們叫PReLU爲Leaky ReLU,算是PReLU的一種特殊情況吧。

  總體來看,這些激活函數都有自己的優點和缺點,沒有一條說法表明哪些就是不行,哪些激活函數就是好的,所有的好壞都要自己去實驗中得到。
qq

2.5 ELU函數

  ELU函數是針對ReLU函數的一個改進型,相比於ReLU函數,在輸入爲負數的情況下,是有一定的輸出的,而且這部分輸出還具有一定的抗干擾能力。這樣可以消除ReLU死掉的問題,不過還是有梯度飽和和指數運算的問題。

2.6 softmax

  用於多分類過程,把多個神經元輸出值映射到(0,1)總和爲1,可以從概率角度理解,則輸出時選擇值最大的(概率最大)作爲預測值

三、異常檢測(Anomaly Detection)

3.1 異常檢測介紹

  總體來講,異常檢測問題可以概括爲兩類:

  1. 一是對結構化數據的異常檢測。
      對結構化數據的異常檢測的解決思想主要是通過找出與正常數據集差異較大的離羣點,把離羣點作爲異常點。常常面臨的問題有二:一是需要定義一個清晰的決策邊界,從而界定正常點與異常點;二是維數災難及交叉指標計算之間的高頻計算性能瓶頸。主要使用以下五種方式解決:
  • 圖形位置分佈,最簡單的異常檢測方式是基於圖形位置,例如箱線圖。
  • 統計方法檢測
  • 距離檢測
  • 密度檢測
  • 矩陣分解檢測
  • 無監督模型識
  1. 二是對非結構化數據的異常檢測。
      對非結構化數據的異常檢測常見於圖像識別,通過對圖像目標檢測,識別出異常(故障)點,主要使用以下四種方式解決:
  • 數字圖像處理
  • RCNN系列
  • YOLO系列
  • SSD系列

3.2 高斯分佈x~N(u,σ2)

  高斯分佈,也稱爲正態分佈

  我們可以利用已有的數據來預測總體中的u和σ2的計算方法如下:

'''
【乾貨來了|小麥苗IT資料分享】
★小麥苗DB職場乾貨:https://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w
★小麥苗數據庫健康檢查:https://share.weiyun.com/5lb2U2M
★小麥苗微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
★各種操作系統下的數據庫安裝文件(Linux、Windows、AIX等):鏈接:https://pan.baidu.com/s/19yJdUQhGz2hTgozb9ATdAw  提取碼:4xpv
★小麥苗分享的資料:https://share.weiyun.com/57HUxNi
★小麥苗課堂資料:https://share.weiyun.com/5fAdN5m
★小麥苗課堂試聽資料:https://share.weiyun.com/5HnQEuL
★小麥苗出版的相關書籍:https://share.weiyun.com/5sQBQpY
★小麥苗博客文章:https://share.weiyun.com/5ufi4Dx
★數據庫系列(Oracle、MySQL、NoSQL):https://share.weiyun.com/5n1u8gv
★公開課錄像文件:https://share.weiyun.com/5yd7ukG
★其它常用軟件分享:https://share.weiyun.com/53BlaHX
★其它IT資料(OS、網絡、存儲等):https://share.weiyun.com/5Mn6ESi
★Python資料:https://share.weiyun.com/5iuQ2Fn
★已安裝配置好的虛擬機:https://share.weiyun.com/5E8pxvT
★小麥苗騰訊課堂:https://lhr.ke.qq.com/
★小麥苗博客:http://blog.itpub.net/26736162/
'''

有趣的事,Python永遠不會缺席

歡迎關注小婷兒的博客

  文章內容來源於小婷兒的學習筆記,部分整理自網絡,若有侵權或不當之處還請諒解!!!

  如需轉發,請註明出處:小婷兒的博客python    https://blog.csdn.net/u010986753

  CSDN https://blog.csdn.net/u010986753

  博客園 https://www.cnblogs.com/xxtalhr/

有問題請在博客下留言或加作者:
  微信tinghai87605025 聯繫我加微信羣
  QQ87605025
  QQ交流羣:py_data 483766429
  公衆號DB寶

證書說明

  OCP證書說明連接 https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

  OCM證書說明連接 https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

   小婷兒的python正在成長中,其中還有很多不足之處,隨着學習和工作的深入,會對以往的博客內容逐步改進和完善噠。重要的事多說幾遍。。。。。。

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