机器学习手撕代码(5)svm
- 本篇分享一下svm的代码,svm.py为支持向量机模型的代码。utils.py中为可视化结果的工具。
- dataset见本系列第0篇。
svm.py
import numpy as np
from datasets.dataset import DataSet
from utils import Visualization,Metrics
from sklearn.model_selection import train_test_split
class SVM:
def __init__(self,C=1,tol = 0.001,random_seed=2021,gamma=10,type_k='rbf'):
self.b = None
self.alpha = None
self.C = C # 软间隔
self.tol = tol # 松弛变量
self._K = None # 经过核函数映射后内积
self._targets = None # 标签[-1,1]
self.gamma = gamma
self.support_vec = None
self.support_vec_alpha = None
self.support_vec_targets = None
self._type_k = type_k
np.random.seed(random_seed)
def fit(self,data,targets,max_iter_steps=100):
self._targets = self._nor_targets(targets) # 标签映射到[-1,1]
if self._type_k == 'rbf': # 选择核函数
self._K = self._rbf_K(data)
self.alpha = np.zeros(data.shape[0])
self.b = 0
parameter_changed = 1 # flag,记录本次迭代是否优化了参数
for iter in range(max_iter_steps):
if parameter_changed == 0: # 没有优化参数,此时迭代完成退出
break
parameter_changed = 0
first_check = (self.alpha>0) * (self.alpha<self.C)
check_i_range = np.concatenate([np.where(first_check)[0],np.where(~first_check)[0]],axis=0)
for i in check_i_range:
if not self._is_meet_KKT(i):
j = self.select_j(i)
if self._targets[i]==self._targets[j]: # 对同号和不同号两种情况下计算alpha的上界和下界
L = max(0,self.alpha[i]+self.alpha[j]-self.C)
H = min(self.C,self.alpha[j]+self.alpha[i])
else:
L = max(0,self.alpha[j]-self.alpha[i])
H = min(self.C,self.C+self.alpha[j]-self.alpha[i])
if L == H:
continue
eta = self._K[i,i]+self._K[j,j]-2*self._K[i,j]
alpha_j_new = self.alpha[j]+(self._targets[j]*(self._cal_E(i)-self._cal_E(j)))/eta # 更新alpha的值
if alpha_j_new >H:
alpha_j_new = H
elif alpha_j_new<L:
alpha_j_new = L
alpha_i_new = self.alpha[i]+self._targets[i]*self._targets

本文介绍了如何从头实现支持向量机(SVM)模型,并使用可视化工具展示其分类效果。作者提供了SVM的Python代码,包括核函数的选择、优化过程的迭代算法以及预测函数。此外,还展示了如何使用TSNE进行数据降维并用matplotlib进行结果展示。通过训练集上的数据,计算并输出了模型的准确率、召回率和精确率。
最低0.47元/天 解锁文章
952

被折叠的 条评论
为什么被折叠?



