在mnist、Yale、lung数据集下实现 svm分类器
文章目录
- 一、实验介绍
- (1)实验目的
- (2)数据集简介
- (3)实验内容
- (4)评价指标
- 二、实验代码
- 三、结果
- (1)acc结果对比
- (2)结果分析
- (3)控制台输出
- 五、参考:
一、实验介绍
(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自定义核实现和所遇到的问题及解决(完整代码)
还没有评论,来说两句吧...