svm.zip

  • Fov
    了解作者
  • Python
    开发工具
  • 1KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 0
    下载次数
  • 2021-04-21 12:40
    上传日期
SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器 [2] 。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一
svm.zip
  • svm.py
    5.8KB
内容介绍
import numpy as np class SVM: def __init__(self, max_iter=100, kernel='linear'): self.max_iter = max_iter self._kernel = kernel def init_args(self, features, labels): # 样本数,特征维度 self.m, self.n = features.shape self.X = features self.Y = labels self.b = 0.0 # 将Ei保存在一个列表里 self.alpha = np.ones(self.m) self.E = [self._E(i) for i in range(self.m)] # 松弛变量 self.C = 1.0 def _KKT(self, i): y_g = self._g(i) * self.Y[i] if self.alpha[i] == 0: return y_g >= 1 elif 0 < self.alpha[i] < self.C: return y_g == 1 else: return y_g <= 1 # g(x)预测值,输入xi(X[i]) # g(x) = \sum_{j=1}^N {\alpha_j*y_j*K(x_j,x)+b} def _g(self, i): r = self.b for j in range(self.m): r += self.alpha[j] * self.Y[j] * self.kernel(self.X[i], self.X[j]) return r # 核函数 def kernel(self, x1, x2): if self._kernel == 'linear': return sum([x1[k] * x2[k] for k in range(self.n)]) elif self._kernel == 'poly': return (sum([x1[k] * x2[k] for k in range(self.n)]) + 1) ** 2 return 0 # E(x)为g(x)对输入x的预测值和y的差 # E_i = g(x_i) - y_i def _E(self, i): return self._g(i) - self.Y[i] def _init_alpha(self): # 外层循环首先遍历所有满足0<a<C的样本点,检验是否满足KKT index_list = [i for i in range(self.m) if 0 < self.alpha[i] < self.C] # 否则遍历整个训练集 non_satisfy_list = [i for i in range(self.m) if i not in index_list] index_list.extend(non_satisfy_list) # 外层循环选择满足0<alpha_i<C,且不满足KKT的样本点。如果不存在遍历剩下训练集 for i in index_list: if self._KKT(i): continue # 内层循环,|E1-E2|最大化 E1 = self.E[i] # 如果E1是+,选择最小的E_i作为E2;如果E1是负的,选择最大的E_i作为E2 if E1 rel='nofollow' onclick='return false;'>= 0: j = min(range(self.m), key=lambda x: self.E[x]) else: j = max(range(self.m), key=lambda x: self.E[x]) return i, j def _compare(self, _alpha, L, H): if _alpha > H: return H elif _alpha < L: return L else: return _alpha def fit(self, features, labels): self.init_args(features, labels) for t in range(self.max_iter): # train, 时间复杂度O(n) i1, i2 = self._init_alpha() # 边界,计算阈值b和差值E_i if self.Y[i1] == self.Y[i2]: # L = max(0, alpha_2 + alpha_1 -C) # H = min(C, alpha_2 + alpha_1) L = max(0, self.alpha[i1] + self.alpha[i2] - self.C) H = min(self.C, self.alpha[i1] + self.alpha[i2]) else: # L = max(0, alpha_2 - alpha_1) # H = min(C, alpha_2 + alpha_1+C) L = max(0, self.alpha[i2] - self.alpha[i1]) H = min(self.C, self.C + self.alpha[i2] - self.alpha[i1]) E1 = self.E[i1] E2 = self.E[i2] # eta=K11+K22-2K12= ||phi(x_1) - phi(x_2)||^2 eta = self.kernel(self.X[i1], self.X[i1]) + self.kernel( self.X[i2], self.X[i2]) - 2 * self.kernel(self.X[i1], self.X[i2]) if eta <= 0: # print('eta <= 0') continue # 更新约束方向的解 alpha2_new_unc = self.alpha[i2] + self.Y[i2] * ( E1 - E2) / eta # 此处有修改,根据书上应该是E1 - E2,书上130-131页 alpha2_new = self._compare(alpha2_new_unc, L, H) alpha1_new = self.alpha[i1] + self.Y[i1] * self.Y[i2] * ( self.alpha[i2] - alpha2_new) b1_new = -E1 - self.Y[i1] * self.kernel(self.X[i1], self.X[i1]) * ( alpha1_new - self.alpha[i1]) - self.Y[i2] * self.kernel( self.X[i2], self.X[i1]) * (alpha2_new - self.alpha[i2]) + self.b b2_new = -E2 - self.Y[i1] * self.kernel(self.X[i1], self.X[i2]) * ( alpha1_new - self.alpha[i1]) - self.Y[i2] * self.kernel( self.X[i2], self.X[i2]) * (alpha2_new - self.alpha[i2]) + self.b if 0 < alpha1_new < self.C: b_new = b1_new elif 0 < alpha2_new < self.C: b_new = b2_new else: # 选择中点 b_new = (b1_new + b2_new) / 2 # 更新参数 self.alpha[i1] = alpha1_new self.alpha[i2] = alpha2_new self.b = b_new self.E[i1] = self._E(i1) self.E[i2] = self._E(i2) return 'train done!' def predict(self, data): r = self.b for i in range(self.m): r += self.alpha[i] * self.Y[i] * self.kernel(data, self.X[i]) return 1 if r > 0.5 else 0 def score(self, X_test, y_test): right_count = 0 for i in range(len(X_test)): result = self.predict(X_test[i]) if result == y_test[i]: right_count += 1 return right_count / len(X_test) def _weight(self): # linear model yx = self.Y.reshape(-1, 1) * self.X self.w = np.dot(yx.T, self.alpha) return self.w def predict_test(self,test): test_label_pro=[] for i in range(len(test)): test_label_pro.append(self.predict(test[i,:])) return test_label_pro
评论
    相关推荐
    • SVM.zip
      基于SVM实现了对于数据的线性分类,并且附带了使用的数据
    • SVM.rar
      这里实现了四种SVM工具箱的分类与回归算法 1、工具箱:LS_SVMlab Classification_LS_SVMlab.m - 多类分类 Regression_LS_SVMlab.m - 函数拟合 2、工具箱:OSU_SVM3.00 Classification_OSU_SVM.m - 多类分类 3、工具...
    • SVM.rar
      crop yeild prediction using SVM
    • SVM.rar
      用python代码实现svm向量机,如果有错误希望大家多多指正
    • RSVM
      RSVM 该源代码是根据以下算法进行编程的: R. Collobert,F.Sinz,J.Weston,L.Bottou,“采用凸性实现可伸缩性”,Proc。 23th Int。 Conf。 马赫Learn。,2006年,第201-208页。 如果您使用该代码进行研究,请...
    • matlab实现svm.zip
      matlab实现svm
    • svm opencv
      直接将图片分类好放进完好、破损文件夹,完好文件夹全体重命名为1破损文件夹全体重命名为2,测试文件夹全体重命名为3,重命名后后即可运行项目,完成svm分类训练出分类模型svm.xml,并进行预测图片分类。
    • SVM.rar
      SVM machine learning
    • svm-master.zip
      svm基本示例:手写字体的识别、预测动物年龄等等。
    • SVM.rar
      svm功能,用于测试训练,其中含有大量程序,可以选择使用。