'''支持向量机-------------------------------------数据集:Mnist训练集数量:10000测试集数量:1000---------------------------------训练结果:初始化时间:327s训练时间:285s正确率:0.99'''
import numpy as np
import time
from itertools import islice
import math
'''readlines方法读取训练数据--------输入:file:数据地址--------输出:data:转换后的数据label:转换后的标记'''
def LoadData(file):
# 打开数据文件
fr = open(file, 'r')
# 准备两个list存储data和label
data = []
label = []
# 逐行读取数据,使用islice可以直接跳过第一行表头进行逐行读取
for line in islice(fr,1,None):
# 对每一行消去空格,并根据','进行分割
splited = line.strip().split(',')
# 分割后的第一个元素是Label,跳过label遍历所有特征值
# 归一化
int_line = [int(num) / 255 for num in splited[1:]]
# 逐行存储数据
data.append(int_line)
# 将问题转换为二分类问题
if int(splited[0]) == 0:
label.append(1)
else:
label.append(-1)
# 转换成ndarray形式方便后续计算
data = np.array(data)
label = np.array(label)
# 返回数据的特征部分和标记部分
return data, label
'''定义SVM类'''
class SVM:
'''初始化参数'''
def __init__(self, train_data, train_label, sigma, C, toler, itertime):
self.train_data = train_data # 训练集数据
self.train_label = train_label # 训练集标记
self.m, self.n = np.shape(train_data) # self.m为训练集样本容量,self.n为特征数量
self.sigma = sigma # 高斯核分母上的超参数
self.KernalMatrix = self.CalKernalMatrix() # 高斯核矩阵
self.alpha = np.zeros(self.m) # 初始化拉格朗日向量,长度为训练集样本容量
self.b = 0 # 初始化参数b
self.C = C # 惩罚参数
self.toler = toler # 松弛变量
self.itertime = itertime # 迭代次数
self