在mnist、Yale、lung數據集下實現 svm分類器

一、實驗介紹

(1)實驗目的

  1. 掌握線性支持向量機(SVM)分類器。
  2. 掌握基於高斯核的SVM分類器。
  3. 掌握基於拉普拉斯核的SVM分類器。

(2)數據集簡介

  • 上述數據集均一.mat文件存放在/datasets文件夾下。

(3)實驗內容

  1. 編寫程序實現線性SVM分類器設計。
  2. 編寫程序實現基於高斯核的SVM分類器設計。
  3. 編寫程序實現基於拉普拉斯核的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自定義覈實現和所遇到的問題及解決(完整代碼)

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