在mnist、Yale、lung数据集下实现 svm分类器

素颜马尾好姑娘i 2023-06-25 06:24 72阅读 0赞

文章目录

    • 一、实验介绍
      • (1)实验目的
      • (2)数据集简介
      • (3)实验内容
      • (4)评价指标
    • 二、实验代码
    • 三、结果
      • (1)acc结果对比
      • (2)结果分析
      • (3)控制台输出
    • 五、参考:

一、实验介绍

(1)实验目的

  1. 掌握线性支持向量机(SVM)分类器。
  2. 掌握基于高斯核的SVM分类器。
  3. 掌握基于拉普拉斯核的SVM分类器。

(2)数据集简介

20191226194227504.png_pic_center

  • 上述数据集均一.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’]

  1. # 加载数据
  2. def create_data(path):
  3. data = loadmat(path)
  4. data_x = data["X"]
  5. data_y = data["Y"][:, 0]
  6. data_y -= 1
  7. Data = np.array(data_x)
  8. Label = np.array(data_y)
  9. return Data, Label
  10. def laplace(X1, X2):
  11. K = np.zeros((len(X1), len(X2)), dtype=np.float)
  12. for i in range(len(X1)):
  13. for j in range(len(X2)):
  14. K[i][j] = math.exp(-math.sqrt(np.dot(X1[i] - X2[j], (X1[i] - X2[j]).T))/2)
  15. return K
  16. def classify(path, kernel):
  17. X, y = create_data(path)
  18. train_data, test_data, train_label, test_label = train_test_split(X, y, test_size=0.333, random_state=233)
  19. # 训练svm分类器
  20. classifier = svm.SVC(C=2, kernel=kernel, gamma=10, decision_function_shape='ovr') # ovr:一对多策略
  21. classifier.fit(train_data, train_label.ravel()) # ravel函数在降维时默认是行序优先
  22. # 计算svc分类器的准确率
  23. print("训练集:", classifier.score(train_data, train_label))
  24. print("测试集:", classifier.score(test_data, test_label))
  25. if __name__ == '__main__':
  26. print('yale: ')
  27. print('linear: ')
  28. classify(yale_path, KERNEL[0])
  29. print('rbf: ')
  30. classify(yale_path, KERNEL[1])
  31. print('laplace:')
  32. classify(yale_path, laplace)
  33. print('-----------------')
  34. print('lung: ')
  35. print('linear: ')
  36. classify(lung_path, KERNEL[0])
  37. print('rbf: ')
  38. classify(lung_path, KERNEL[1])
  39. print('laplace:')
  40. classify(lung_path, laplace)
  41. print('-----------------')
  42. print('minist: ')
  43. print('linear: ')
  44. classify(minist_path, KERNEL[0])
  45. print('rbf: ')
  46. classify(minist_path, KERNEL[1])
  47. print('laplace:')
  48. 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)控制台输出

  1. yale:
  2. linear:
  3. 训练集: 1.0
  4. 测试集: 0.7090909090909091
  5. rbf:
  6. 训练集: 1.0
  7. 测试集: 0.0
  8. laplace:
  9. 训练集: 1.0
  10. 测试集: 0.0
  11. -----------------
  12. lung:
  13. linear:
  14. 训练集: 1.0
  15. 测试集: 0.9558823529411765
  16. rbf:
  17. 训练集: 1.0
  18. 测试集: 0.6617647058823529
  19. laplace:
  20. 训练集: 1.0
  21. 测试集: 0.6617647058823529
  22. -----------------
  23. minist:
  24. linear:
  25. 训练集: 1.0
  26. 测试集: 0.9049049049049049
  27. rbf:
  28. 训练集: 1.0
  29. 测试集: 0.09009009009009009
  30. laplace:
  31. 训练集: 1.0
  32. 测试集: 0.9229229229229229

五、参考:

支持向量机通俗导论(理解SVM的三层境界)-————大佬的svm原理详细讲解,一千多个赞,百万阅读,啥也不说了
Svm算法原理及实现-————对svm原理进行了讲解,并手写了svm的训练函数和测试函数
【机器学习】python使用支持向量机SVM-———-博主以鸢尾花数据集对鸢尾花数据集的两个特征作svm并绘图
SVM基本概要与sklearn.svm.svc 参数说明
SVM支持向量机-核函数(6)-———-各个核函数及其python实现
Python sklearn SVM自定义核实现和所遇到的问题及解决(完整代码)

发表评论

表情:
评论列表 (有 0 条评论,72人围观)

还没有评论,来说两句吧...

相关阅读