十七、支持向量機(SVM)
試圖尋找能夠獲得最大間距的線性分類邊界。
y = kx +b
kx -y + b = 0
w1x1+w2x2 + w3 = 0
wx + b = 0
尋找特定的w和b能夠使得所有支持向量到分類邊界的間距相等且最大,同時該分類邊界能夠正確區分不同類別的樣本。
d & 1/||w||^2
| |
v v
max max
||w||^2 -> min
wx+b = 0
wx + b = 1
wx + b = -1
藍:wx + b >= 1, y = 1
紅:wx + b <= -1, y = -1
在滿足y[i](wx[i] + b) >= 1的條件下,使得||w||^2最小的w和b是什麼?
依據拉格朗日乘子法,等價轉換求以下函數的最小值問題:
m
L(w,b) = 1/2 ||w||^2 - sigma(a[i](y[i](wx[i]+b)-1))
i=1
dL/dw = 0
m
w = sigma(a[i]y[i]x[i])
i=1
dL/db = 0
m
sigma(a[i]y[i]) = 0
i=1
預測函數:y = wx + b
使y >0的樣本屬於1類,時y < 0的樣本屬於-1類。
y = sigma(a[i]y[i]x[i])x + b
= sigma(a[i]y[i]x[i]x) + b
= sigma(a[i]y[i]k(x[i], x)) + b
k(x[i], x)稱為核函數
當核函數表現為向量的內積形式時,其分類邊界必為線性。
相似性函數:x'=f(x)
k(x[i], x)非內積形式,線性不可分
通過相似性函數將x升維變換為x'
k(x'[i], x')=f(x[i])f(x)
一般而言相似性函數與具體業務相關,但也存在一些相對通用的相似性函數,可以使核函數表現為內積,即升維線性可分。
sklearn中將這些相對固定的通用核函數定義為算法模型的參數,可供選擇:線性核函數、多項式核函數、高斯(徑向基)核函數。
代碼:svm_line.py、svm_poly.py、svm_rbf.py
C: 鬆弛因數,正則化強度的倒數,該值越大,模型越遷就於未被最大間距規則的樣本,過大形成過擬合。
degree:多項式核函數的次數,缺省3。
gamma:高斯核函數的標準差平方的倒數,缺省1。
class_weight:是否對所佔比例不同的類別做權重均衡。
代碼:svm_bal.py
置信概率:針對位置輸出的輸入,給出模型計算出來的可相信概率,該值有模型根據樣本距離分類邊界的距離確定。
為了讓模型能夠在分類的同時計算樣本的置信概率,需要為分類器指定probability=True參數,而後通過模型的predict_proba方法,獲得與每個輸入樣本相對應的置信概率矩陣,矩陣中的每一行對應一個輸入樣本,每一列對應一個輸出類別。
代碼:svm_prob.py
十八、最優超參數
sklearn.model_selection.GridSearchCV(模型對象,
參數列表, cv=交叉驗證數)->基於最佳超參數組合實例化的模型對象
根據參數列表每一種超參數則組合進行cv次交叉驗證,返回每次驗證的f1得分。通過模型對象的cv_results_屬性可以獲得針對每種超參數組合的驗證分值,該對象的best_params_屬性為最佳超參數組合。
代碼:bhp.py
十九、k-means聚類算法
1.算法步驟
1)給聚類中心分配點。計算所有的訓練樣本,把每個訓練樣本分配到距離其最近的聚類中心所在的類別裡;
2)移動聚類中心。將聚類的中心移動到其所在聚類中各樣本的平均值處。
3)一直重複以上步驟,直到聚類中心和聚類中各樣本的平均值足夠接近為止。
2.前提:聚類的個數,根據應用場景的業務特徵確定。如果聚類個數設定與實際樣本的分佈狀態不符,最終的聚類的結果可以能因初始中心的選擇而異。
3.k-means算法只負責聚類和劃分,類別標籤(0,1,2,...)是隨機分配的,多次重複可能會有差別。
4.k-means算法的初始中心是隨機挑選的,每次運行算法所獲得最終收斂位置可能因初始位置的不同而不同,可以通過n_init參數指定取若干次聚類中心的平均值,提高穩定性。
代碼:km.py
centers: [100 200 50 80]
y: 0 0 0 1 1 1 0 0 2 2 3
centers[y]: 100 100 100 200 200 200 100 100 50 50 80
基於k-means聚類的矢量量化
代碼:quant.py
二十、均值漂移聚類算法
1.算法思想
均值漂移聚類算法把數據樣本看成是符合某種概率規則的隨機分佈,該算法試圖在特徵空間中根據既有的概率密度函數找出與已知樣本相匹配的模式,並從這些模式中找到局部密度最大的區域,以此作為聚類的中心,服從該模式的樣本即取與中心相同的聚類標籤。
代碼:shift.py
二十一、凝聚層次聚類算法
1.算法思想
假設每個樣本都是獨立的聚類,如果實際聚類數大於預期聚類數,在立足每個樣本尋找其它未聚類樣本中距離該樣本最近的樣本,合併為一類,使實際聚類數減少,重複以上過程,直到實際聚類數達到預期位置。
2.凝聚層次算法和k-means算法一樣需要預先給定聚類數,但是沒有聚類中心,因此不能對非訓練集中的樣本進行預測。
代碼:agglo.py
3.因為凝聚層次算法不是基於中心和概率峰值尋求聚類,而是以及每個樣本與其鄰居的相似程度,因此它可以支持對連續性的特殊約束。
閱讀更多 小悅 的文章