李航老师《统计学习方法》第七章:SVM支持向量机(SMO算法)python代码实现

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值