1 近红外光谱
红外光 近红外光谱仪(Near Infrared Spectrum Instrument,NIRS)是介于可见光(Vis)和中红外(MIR)之间的电磁辐射波,美国材料检测协会(ASTM)将近红外光谱区定义为780-2526nm的区域,是人们在吸收光谱中发现的第一个非可见光区。近红外光谱区与有机分子中含氢基团(O-H、N-H、C-H)振动的合频和各级倍频的吸收区一致,通过扫描样品的近红外光谱,可以得到样品中有机分子含氢基团的特征信息,而且利用近红外光谱技术分析样品具有方便、快速、高效、准确和成本较低,不破坏样品,不消耗化学试剂,不污染环境等优点,因此该技术受到越来越多人的青睐。
2 SVM算法
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
3 算法实现
实验数据来源于:nirpy
milk-powder数据集包含11个不同的类别,对应的样本从100%奶粉到0%奶粉(即100%椰子奶粉)下降10%。
#导入包
import pandas as pd
import numpy as np
from matplotlib.pyplot import imshow, show, colorbar
import matplotlib.pyplot as plt
from operator import truediv
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import cohen_kappa_score
#导入数据
data = pd.read_csv('/milk-powder.csv')
y = data.iloc[:,1].values.astype('uint8')#标签
X = data.iloc[:,2:].values#光谱值
#SVM训练
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 100) #划分30%数据为测试,70%为训练
from sklearn.svm import SVC
classifier = SVC(C=1000,kernel='rbf', random_state=0) #设定核参数
classifier.fit(X_train, y_train)
# 测试集结果
y_pred = classifier.predict(X_test)
#画混淆矩阵
from pretty_confusion_matrix import pp_matrix
from sklearn.metrics import confusion_matrix
label = ['1','2','3','4','5','6','7','8','9','10','11']
cm = confusion_matrix(y_test, y_pred)
cm = pd.DataFrame(cm, index=np.unique(label), columns=np.unique(label))
cm.index.name = 'Actual'
cm.columns.name = 'Predicted'
fig, ax = plt.subplots(figsize=(15,10))
plt.rcParams.update({'font.size': 12})
cmap = "Greens_r"
pp_matrix(cm, cmap=cmap)
#预测结果
counter = cm.shape[0]
list_diag = np.diag(cm)
list_raw_sum = np.sum(cm, axis=1)
each_acc = np.nan_to_num(truediv(list_diag, list_raw_sum))
average_acc = np.mean(each_acc)
kappa = metrics.cohen_kappa_score(y_pred, y_test)
overall_acc = metrics.accuracy_score(y_pred, y_test)
4 结果
用平均精度、kappa系数和总体精度衡量SVM的分类性能。
average_acc = 0.9772727272727273
kappa = 0.9831675592960979
overall_acc = 0.9848484848484849