一、實驗介紹
(1)實驗目的
- 掌握線性支持向量機(SVM)分類器。
- 掌握基於高斯核的SVM分類器。
- 掌握基於拉普拉斯核的SVM分類器。
(2)數據集簡介
- 上述數據集均一.mat文件存放在/datasets文件夾下。
(3)實驗內容
- 編寫程序實現線性SVM分類器設計。
- 編寫程序實現基於高斯核的SVM分類器設計。
- 編寫程序實現基於拉普拉斯核的SVM分類器設計。
(4)評價指標
- 本次實驗主要利用Acc指標對聚類結果進行評價,值越大表明聚類效果越好。
二、實驗代碼
- 編寫程序實現線性、高斯核、拉普拉斯核的的SVM分類器設計。
import numpy as np
from scipy.io import loadmat
from sklearn import svm
from sklearn.model_selection import train_test_split
import math
# 數據準備
minist_path = r".\datasets\MNIST.mat"
lung_path = r".\datasets\lung.mat"
yale_path = r".\datasets\Yale.mat"
KERNEL = ['linear', 'rbf']
# 加載數據
def create_data(path):
data = loadmat(path)
data_x = data["X"]
data_y = data["Y"][:, 0]
data_y -= 1
Data = np.array(data_x)
Label = np.array(data_y)
return Data, Label
def laplace(X1, X2):
K = np.zeros((len(X1), len(X2)), dtype=np.float)
for i in range(len(X1)):
for j in range(len(X2)):
K[i][j] = math.exp(-math.sqrt(np.dot(X1[i] - X2[j], (X1[i] - X2[j]).T))/2)
return K
def classify(path, kernel):
X, y = create_data(path)
train_data, test_data, train_label, test_label = train_test_split(X, y, test_size=0.333, random_state=233)
# 訓練svm分類器
classifier = svm.SVC(C=2, kernel=kernel, gamma=10, decision_function_shape='ovr') # ovr:一對多策略
classifier.fit(train_data, train_label.ravel()) # ravel函數在降維時默認是行序優先
# 計算svc分類器的準確率
print("訓練集:", classifier.score(train_data, train_label))
print("測試集:", classifier.score(test_data, test_label))
if __name__ == '__main__':
print('yale: ')
print('linear: ')
classify(yale_path, KERNEL[0])
print('rbf: ')
classify(yale_path, KERNEL[1])
print('laplace:')
classify(yale_path, laplace)
print('-----------------')
print('lung: ')
print('linear: ')
classify(lung_path, KERNEL[0])
print('rbf: ')
classify(lung_path, KERNEL[1])
print('laplace:')
classify(lung_path, laplace)
print('-----------------')
print('minist: ')
print('linear: ')
classify(minist_path, KERNEL[0])
print('rbf: ')
classify(minist_path, KERNEL[1])
print('laplace:')
classify(minist_path, laplace)
三、結果
(1)acc結果對比
數據/方法 | linear | rbf | laplace |
---|---|---|---|
minist | 0.904 | 0.090 | 0.922 |
lung | 0.955 | 0.661 | 0.661 |
yale | 0.709 | 0.0 | 0.0 |
(2)結果分析
- 通過實驗可以發現由於lung數據集的數據量最大,標籤類別只有5,因此每一類標籤的訓練數據集較大,因此結果較高,可以到百分之九十,yale數據量小,標籤類別爲15,因此每一類標籤的訓練數據集較小,結果也相對較差。可以通過優化模型,或者增加數據記得方式來提高精確度。
- 在本次實驗中,yale數據集在rbf和laplace核上沒有輸出,現在還沒有弄清楚原因,等後面查看源碼分析後,在將原因補上,minist在rbf上幾乎沒有效果。
(3)控制檯輸出
yale:
linear:
訓練集: 1.0
測試集: 0.7090909090909091
rbf:
訓練集: 1.0
測試集: 0.0
laplace:
訓練集: 1.0
測試集: 0.0
-----------------
lung:
linear:
訓練集: 1.0
測試集: 0.9558823529411765
rbf:
訓練集: 1.0
測試集: 0.6617647058823529
laplace:
訓練集: 1.0
測試集: 0.6617647058823529
-----------------
minist:
linear:
訓練集: 1.0
測試集: 0.9049049049049049
rbf:
訓練集: 1.0
測試集: 0.09009009009009009
laplace:
訓練集: 1.0
測試集: 0.9229229229229229
五、參考:
支持向量機通俗導論(理解SVM的三層境界)---------大佬的svm原理詳細講解,一千多個贊,百萬閱讀,啥也不說了
Svm算法原理及實現---------對svm原理進行了講解,並手寫了svm的訓練函數和測試函數
【機器學習】python使用支持向量機SVM--------博主以鳶尾花數據集對鳶尾花數據集的兩個特徵作svm並繪圖
SVM基本概要與sklearn.svm.svc 參數說明
SVM支持向量機-核函數(6)--------各個核函數及其python實現
Python sklearn SVM自定義覈實現和所遇到的問題及解決(完整代碼)