一、实验介绍
(1)实验目的
- 掌握支持向量机(SVM)分类器。
(2)数据集简介
- 上述数据集均一.mat文件存放在/datasets文件夹下。
(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: ')
classify(yale_path, KERNEL[0])
print('-----------------')
print('lung: ')
classify(lung_path, KERNEL[0])
print('-----------------')
print('minist: ')
classify(minist_path, KERNEL[0])
三、结果
(1)acc结果对比
数据/方法 | minist | lung | yale |
---|---|---|---|
svm | 0.904 | 0.955 | 0.709 |
(2)结果分析
- 通过实验可以发现由于lung数据集的数据量最大,标签类别只有5,因此每一类标签的训练数据集较大,因此结果较高,可以到百分之九十,yale数据量小,标签类别为15,因此每一类标签的训练数据集较小,结果也相对较差。可以通过优化模型,或者增加数据记得方式来提高精确度。
(3)控制台输出
yale:
训练集: 1.0
测试集: 0.7090909090909091
-----------------
lung:
训练集: 1.0
测试集: 0.9558823529411765
-----------------
minist:
训练集: 1.0
测试集: 0.9049049049049049
五、参考:
支持向量机通俗导论(理解SVM的三层境界)---------大佬的svm原理详细讲解,一千多个赞,百万阅读,啥也不说了
Svm算法原理及实现---------对svm原理进行了讲解,并手写了svm的训练函数和测试函数
【机器学习】python使用支持向量机SVM--------博主以鸢尾花数据集对鸢尾花数据集的两个特征作svm并绘图
SVM基本概要与sklearn.svm.svc 参数说明
SVM支持向量机-核函数(6)--------各个核函数及其python实现
Python sklearn SVM自定义核实现和所遇到的问题及解决(完整代码)