from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import math
class SVM:
def __init__(self):
self.train_data = None # 训练数据
self.train_label = None # 训练数据的标签
self.Num = None # 训练数据的总个数
self.num = None # 样本特征的数目(本数据集为4)
self.sigma = None # 高斯核函数中的分母σ
self.C = None # 惩罚参数C
self.toler = None # 判断是否满足kkt条件引入的松弛变量
self.k = None # 核函数对应的gram矩阵
self.b = None # 偏置项b
self.alpha = [] # 真正需要求得的变量α
self.E = [] # 目前的g(xi,α,b)-yi的误差Ei
self.supportVector = [] # 存储支持向量,因为最后预测的时候只用到支持向量
def calcKernal(self, x, z):
result = np.dot((x - z), (x - z).T) # X-Z的二范数的平方
result = np.exp(-result / 2 * (self.sigma ** 2))
return result
# 计算高斯核函数对应的gram矩阵
def calcKernal_gram(self):
k = np.zeros((self.Num, self.Num)) # 初始化一个N*N的0矩阵
for i in range(self.Num):
X = self.train_data[i]
# 由于对称矩阵的性质,所以内循环只需要从i开始遍历
for j in range(i, self.Num):
Z = self.train_data[j]
result = self.calcKernal(X, Z)
# 由于gram矩阵是对称矩阵。所以k[i][j] = k[j][i]
k[i][j] = result
k[j][i] = result
# 返回高斯核函数的gram矩阵存储使用
return k
# 初始化SVM类中的各个参数
def init_para(self, train_data, train_label, sigma=10, C=200, toler=0.001):
self.train_data = train_data
self.train_label = train_label.T # 标签变为列向量
self.Num = train_data.shape[0]
self.num = train_data.shape[1]
self.sigma = sigma
self.C
李航老师《统计学习方法》第七章:SVM支持向量机(SMO算法)python代码实现
于 2024-10-31 18:11:36 首次发布