日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

svm多分类python代码_SVM算法的理解及其Python实现多分类和二分类

發布時間:2023/12/9 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 svm多分类python代码_SVM算法的理解及其Python实现多分类和二分类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原理

SVM被提出于1964年,在二十世紀90年代后得到快速發展并衍生出一系列改進和擴展算法,在人像識別、文本分類等模式識別(pattern recognition)問題中有得到應用。

支持向量機(Support Vector Machine, SVM)是一類按監督學習(supervised learning) 方式對數據進行二元分類的廣義線性分類器(generalized linear classifier),其決策邊界是對學習樣本求解的最大邊距超平面(maximum-margin hyperplane)

SVM可以通過核方法(kernel method)進行非線性分類,是常見的核學習(kernel learning)方法之一。

分類理論

在分類問題中給定輸入數據和學習目標:X = { X1, X2,…Xn },Y = { y1,y2,…yn}。其中輸入數據的每個樣本都包含多個特征并由此構成特征空間(feature space):Xi = { x1,x2…xn} ,而學習目標為二元變量y { ? 1 , 1 } y\{-1,1\}y{?1,1}表示負類(negative class)和正類(positive class)。

若輸入數據所在的特征空間存在作為決策邊界(decision boundary)的超平面將學習目標按正類和負類分開,并使任意樣本的點到平面距離大于等于1,則稱該分類問題具有線性可分性,參數 w,b分別為超平面的法向量和截距。

滿足該條件的決策邊界實際上構造了2個平行的超平面作為間隔邊界以判別樣本的分類:

所有在上間隔邊界上方的樣本屬于正類,在下間隔邊界下方的樣本屬于負類。兩個間隔邊界的距離 d = 2 ∥ w ∥ d=\frac{2}{\|w\|}d=∥w∥2?被定義為邊距(margin),位于間隔邊界上的正類和負類樣本為支持向量(support vector)。

確定最大間距

我們確定一個分類器,對任意的實數,當w T x + b > 1 , y i = 1 ; w T x + b < ? 1 , y i = ? 1 w^{T}x+b>1,y_{i}=1;w^{T}x +bwTx+b>1,yi?=1;wTx+b

這就可以寫作:a r g m a x w , b m i n n ( l a b e l ? ( w T + b ) ) ? 1 ∣ ∣ w ∣ ∣ argmax_{w,b}\quad {min_{n}\quad (label?(w^{T}+b))?\frac{1}{||w||}}argmaxw,b?minn?(label?(wT+b))?∣∣w∣∣1?。

很顯然l a b e l ? ( w T x i + b ) ? 1 , i = 1 , 2 , . . . , m , label?(w^{T}x_{i}+b)?1,i=1,2,...,m,label?(wTxi?+b)?1,i=1,2,...,m,為了最大化間隔只需要最大化∣ ∣ w ∣ ∣ ? 1 ||w||^{-1}∣∣w∣∣?1。等價于最小化∣ ∣ w ∣ ∣ 2 ||w||^{2}∣∣w∣∣2。

因此支持向量機的形式可表示如下:

1、m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 min_{w,b} \quad \frac{1}{2}||w||^{2}minw,b?21?∣∣w∣∣2

2、s . t . y i ( w T x i + b ) ? 1 , i = 1 , 2 , . . . , m . s.t.y_{i}(w^{T}x_{i}+b)?1,i=1,2,...,m.s.t.yi?(wTxi?+b)?1,i=1,2,...,m.

最后問題變成了凸二次規劃的問題,可解。

SVM多分類

SVM算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。目前,構造SVM多類分類器的方法主要有兩類:一類是直接法,直接在目標函數上進行修改,將多個分類面的參數求解合并到一個最優化問題中,通過求解該最優化問題“一次性”實現多類分類。這種方法看似簡單,但其計算復雜度比較高,實現起來比較困難,只適合用于小型問題中;另一類是間接法,主要是通過組合多個二分類器來實現多分類器的構造,常見的方法有one-against-one和one-against-all兩種。

a.一對多法(one-versus-rest,簡稱1-v-r-SVMs)。訓練時依次把某個類別的樣本歸為一類,其他剩余的樣本歸為另一類,這樣k個類別的樣本就構造出了k個SVM。分類時將未知樣本分類為具有最大分類函數值的那類。

b.一對一法(one-versus-one,簡稱1-v-1 SVMs)。其做法是在任意兩類樣本之間設計一個SVM,因此k個類別的樣本就需要設計k(k-1)/2個SVM。當對一個未知樣本進行分類時,最后得票最多的類別即為該未知樣本的類別。Libsvm中的多類分類就是根據這個方法實現的。

Python實現

多分類

X_train, X_test, y_train, y_test = train_test_split(feature, label, test_size=.2,random_state=0)

# 訓練模型

model = OneVsRestClassifier(svm.SVC(kernel='linear',probability=True,random_state=random_state))

print("[INFO] Successfully initialize a new model !")

print("[INFO] Training the model…… ")

clt = model.fit(X_train,y_train)

print("[INFO] Model training completed !")

# 保存訓練好的模型,下次使用時直接加載就可以了

joblib.dump(clt,"F:/python/model/conv_19_80%.pkl")

print("[INFO] Model has been saved !")

y_test_pred = clt.predict(X_test)

ov_acc = metrics.accuracy_score(y_test_pred,y_test)

print("overall accuracy: %f"%(ov_acc))

print("===========================================")

acc_for_each_class = metrics.precision_score(y_test,y_test_pred,average=None)

print("acc_for_each_class:\n",acc_for_each_class)

print("===========================================")

avg_acc = np.mean(acc_for_each_class)

print("average accuracy:%f"%(avg_acc))

二分類

>>> import numpy as np

>>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])

>>> y = np.array([1, 1, 2, 2])

>>> from sklearn.svm import SVC

>>> clf = SVC()

>>> clf.fit(X, y)

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',

max_iter=-1, probability=False, random_state=None, shrinking=True,

tol=0.001, verbose=False)

>>> print(clf.predict([[-0.8, -1]]))

[1]

總結

以上是生活随笔為你收集整理的svm多分类python代码_SVM算法的理解及其Python实现多分类和二分类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。