只使用numpy不调用skit-learn完整实现线性不可分支持向量机六分类,对手动输入的单条18维数据循环训练、保存模型、加载模型、预测

时间: 2023-06-15 07:03:18 浏览: 79
好的,我可以为您提供一个基于numpy实现的线性不可分支持向量机的六分类器。这里使用的是一对多(One-vs-All)的方法进行多分类。 代码实现如下: ```python import numpy as np class SVM: def __init__(self, C=1, learning_rate=0.01, max_iters=1000, kernel_type='linear', degree=3, gamma=1.0): self.C = C self.learning_rate = learning_rate self.max_iters = max_iters self.kernel_type = kernel_type self.degree = degree self.gamma = gamma self.kernel = self._get_kernel_func(kernel_type, degree, gamma) def _get_kernel_func(self, kernel_type, degree, gamma): if kernel_type == 'linear': return lambda x, y: np.dot(x, y) elif kernel_type == 'poly': return lambda x, y: (gamma * np.dot(x, y) + 1) ** degree elif kernel_type == 'rbf': return lambda x, y: np.exp(-gamma * np.sum((x - y) ** 2)) else: raise ValueError('Invalid kernel type.') def _init_params(self, X, y): self.X = X self.y = y self.m, self.n = X.shape self.alpha = np.zeros(self.m) self.b = 0 self.E = np.zeros(self.m) def _predict(self, X): pred = np.zeros(X.shape[0]) for i in range(X.shape[0]): pred[i] = np.sign(np.sum(self.alpha * self.y * self.kernel(X[i], self.X)) + self.b) return pred def _train(self): for t in range(self.max_iters): for i in range(self.m): Ei = self.E[i] xi = self.X[i] yi = self.y[i] if (yi * Ei < -0.001 and self.alpha[i] < self.C) or (yi * Ei > 0.001 and self.alpha[i] > 0): j = np.random.choice(list(range(i)) + list(range(i+1, self.m))) xj = self.X[j] yj = self.y[j] Ej = self.E[j] alpha_i_old = self.alpha[i] alpha_j_old = self.alpha[j] if yi != yj: L = max(0, alpha_j_old - alpha_i_old) H = min(self.C, self.C + alpha_j_old - alpha_i_old) else: L = max(0, alpha_i_old + alpha_j_old - self.C) H = min(self.C, alpha_i_old + alpha_j_old) if L == H: continue eta = self.kernel(xi, xi) + self.kernel(xj, xj) - 2 * self.kernel(xi, xj) if eta == 0: continue alpha_j_new_unc = alpha_j_old + yj * (Ei - Ej) / eta alpha_j_new = min(max(alpha_j_new_unc, L), H) alpha_i_new = alpha_i_old + yi * yj * (alpha_j_old - alpha_j_new) b1 = self.b - Ei - yi * (alpha_i_new - alpha_i_old) * self.kernel(xi, xi) - yj * (alpha_j_new - alpha_j_old) * self.kernel(xi, xj) b2 = self.b - Ej - yi * (alpha_i_new - alpha_i_old) * self.kernel(xi, xj) - yj * (alpha_j_new - alpha_j_old) * self.kernel(xj, xj) if 0 < alpha_i_new < self.C: self.b = b1 elif 0 < alpha_j_new < self.C: self.b = b2 else: self.b = (b1 + b2) / 2 self.alpha[i] = alpha_i_new self.alpha[j] = alpha_j_new self.E[i] = np.sum(self.alpha * self.y * self.kernel(xi, self.X)) + self.b - yi self.E[j] = np.sum(self.alpha * self.y * self.kernel(xj, self.X)) + self.b - yj def fit(self, X, y): self._init_params(X, y) for i in range(6): binary_y = np.where(y == i, 1, -1) self.E = np.zeros(self.m) self.alpha = np.zeros(self.m) self.b = 0 self._train() setattr(self, f'alpha_{i}', self.alpha) setattr(self, f'b_{i}', self.b) def predict(self, X): predictions = np.zeros((X.shape[0], 6)) for i in range(6): alpha = getattr(self, f'alpha_{i}') b = getattr(self, f'b_{i}') predictions[:, i] = self._predict(X) * alpha * self.y + b return np.argmax(predictions, axis=1) def save(self, filename): with open(filename, 'wb') as f: np.savez(f, C=self.C, learning_rate=self.learning_rate, max_iters=self.max_iters, kernel_type=self.kernel_type, degree=self.degree, gamma=self.gamma, alpha=self.alpha, b=self.b) def load(self, filename): with open(filename, 'rb') as f: model = np.load(f) self.C = model['C'] self.learning_rate = model['learning_rate'] self.max_iters = model['max_iters'] self.kernel_type = model['kernel_type'] self.degree = model['degree'] self.gamma = model['gamma'] self.alpha = model['alpha'] self.b = model['b'] ``` 接下来,您可以使用以下代码进行训练、保存模型、加载模型和预测: ```python # 训练模型 svm = SVM(C=1, learning_rate=0.01, max_iters=1000, kernel_type='rbf', gamma=0.1) svm.fit(X_train, y_train) # 保存模型 svm.save('svm_model.npz') # 加载模型 svm = SVM() svm.load('svm_model.npz') # 预测 X_test = np.array([[-0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5]]) y_pred = svm.predict(X_test) print(y_pred) ``` 这里假设您已经有了训练数据 `X_train` 和标签 `y_train`。在上述代码中,我们使用了高斯核函数(RBF核函数)进行分类。您可以根据需要修改 `SVM` 类的参数,例如正则化参数 `C`、学习率 `learning_rate`、最大迭代次数 `max_iters`、核函数类型 `kernel_type`、多项式核函数的次数 `degree` 和高斯核函数的参数 `gamma`。 在 `predict` 方法中,我们使用了一对多的方法进行多分类。首先为每个类别训练一个二分类器,然后将测试样本输入这些二分类器进行预测,最后选择预测得分最高的类别作为最终预测结果。预测结果是一个长度为测试样本数的一维数组,每个元素表示该样本的预测类别。 在上述代码中,我们手动输入了一条测试数据 `X_test`,您可以根据需要修改为其他数据。

相关推荐

最新推荐

recommend-type

pytorch 实现数据增强分类 albumentations的使用

albumentations包是一种针对数据增强专门写的API,里面基本包含大量的数据增强手段,比起pytorch自带的ttransform更丰富,搭配使用效果更好。 代码和效果 import albumentations import cv2 from PIL import Image, ...
recommend-type

Numpy一维线性插值函数的用法

主要介绍了Numpy一维线性插值函数的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

numpy:np.newaxis 实现将行向量转换成列向量

今天小编就为大家分享一篇numpy:np.newaxis 实现将行向量转换成列向量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Pytorch 使用CNN图像分类的实现

读取数据集对数据集选取减少偏斜 cnn设计因为特征少,直接1*1卷积层 或者在4*4外围添加padding成6*6,设计2*2的卷积核得出3*3再接上全连接层 代码 import torch import torchvision import torchvision....
recommend-type

numpy矩阵数值太多不能全部显示的解决

主要介绍了numpy矩阵数值太多不能全部显示的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。