数据集下载地址:
https://github.com/Jack-Cherish/Machine-Learning/blob/master/SVM/testSet.txt

# coding=UTF-8
import random
import matplotlib.pyplot as plt
import numpy as npdef getdata(filename):x = []y = []with open(filename) as file:for line in file:lineArr = line.strip().split('\t')x.append([float(lineArr[0]), float(lineArr[1])])  # 添加数据y.append(float(lineArr[2]))  # 添加标签return x, ydef drawdata(x, y):plus = []minus = []for i in range(len(x)):if y[i] > 0:plus.append(x[i])else:minus.append(x[i])plus_matrix = np.array(plus)minus_matrix = np.array(minus)plt.scatter(np.transpose(plus_matrix)[0], np.transpose(plus_matrix)[1])plt.scatter(np.transpose(minus_matrix)[0], np.transpose(minus_matrix)[1])plt.show()class SVM(object):"""参数:x: 数据y: 标签c: 松弛变量toler: 容错率n_iter: 最大迭代次数"""def __init__(self, c=0.6, toler=0.001, n_iter=40):self.c = cself.toler = tolerself.n_iter = n_iterself.alphas = np.array([])self.w_ = []self.b = 0def fit(self, x, y):# 转换为矩阵x_matrix = np.mat(x)y_matrix = np.mat(y).transpose()  # 矩阵转置# 利用SMO计算b和alphaself.b, self.alphas = self.smosimple(x_matrix, y_matrix, self.c, self.toler)self.w_ = np.zeros((x_matrix.shape[1], 1))for i in range(self.alphas.shape[0]):self.w_ += np.multiply(self.alphas[i] * y_matrix[i], x_matrix[i, :].T)return self# 简化版SMOdef smosimple(self, x_matrix, y_matrix, C, toler):# 初始化b参数b = 0# 统计x矩阵维度(m行n列)m, n = np.shape(x_matrix)# 初始化alpha参数alphas = np.mat(np.zeros((m, 1)))count = 0# alphas为矩阵,y为矩阵,x为矩阵,while count < self.n_iter:alphaschanged = 0for i in range(m):# 步骤1:计算误差E# Ei = (sum[aj * yj * K(xi,xj)] + b) - yi;误差 = 预测值 - 真实值fi = float(np.multiply(alphas, y_matrix).T * self.kernel(x_matrix[i, :], x_matrix)) + bEi = fi - float(y_matrix[i])# 优化alpha# 满足KKT条件if ((y_matrix[i] * Ei < -toler) and (alphas[i] < C)) or ((y_matrix[i] * Ei > toler) and (alphas[i] > 0)):# 随机选择另一个与 alpha_i 成对优化的 alpha_jj = self.selectJrand(i, m)fj = float(np.multiply(alphas, y_matrix).T * self.kernel(x_matrix[j, :], x_matrix)) + bEj = fj - float(y_matrix[j])alphaIold = alphas[i].copy()alphaJold = alphas[j].copy()  # 深拷贝,不随原数据修改而修改# 步骤2:计算上下界L和Hif y_matrix[i] != y_matrix[j]:L = max(0, alphas[j] - alphas[i])H = min(C, C + alphas[j] - alphas[i])else:L = max(0, alphas[j] + alphas[i] - C)H = min(C, alphas[j] + alphas[i])if L == H:continue# 步骤3:计算学习率# eta = K11 + K22 - 2*K12eta = (self.kernel(x_matrix[i, :], x_matrix[i, :])+ self.kernel(x_matrix[j, :], x_matrix[j, :])- 2.0 * self.kernel(x_matrix[i, :], x_matrix[j, :]))if eta <= 0:continue# 步骤4:更新 alpha_jalphas[j] += y_matrix[j] * (Ei - Ej) / eta# 步骤5:对alpha_j进行剪枝alphas[j] = self.clipper(alphas[j], H, L)# 步骤6:更新alpha_ialphas[i] += y_matrix[i] * y_matrix[j] * (alphaJold - alphas[j])# 步骤7:更新b1,b2,bb1 = (- Ei- y_matrix[i] * self.kernel(x_matrix[i, :], x_matrix[i, :]) * (alphas[i] - alphaIold)- y_matrix[j] * self.kernel(x_matrix[j, :], x_matrix[i, :]) * (alphas[j] - alphaJold)+ b)b2 = (- Ej- y_matrix[i] * self.kernel(x_matrix[i, :], x_matrix[j, :]) * (alphas[i] - alphaIold)- y_matrix[j] * self.kernel(x_matrix[j, :], x_matrix[j, :]) * (alphas[j] - alphaJold)+ b)if (0 < alphas[i]) and (C > alphas[i]):b = b1elif (0 < alphas[j]) and (C > alphas[j]):b = b2else:b = (b1 + b2) / 2.0alphaschanged += 1if alphaschanged == 0:count += 1return b, alphasdef kernel(self, xi, xj):return xj * xi.Tdef selectJrand(self, i, m):while True:j = int(random.uniform(0, m))if j != i:return jdef clipper(self, alphas, H, L):if alphas > H:return Helif L <= alphas <= H:return alphaselif alphas < L:return Ldef drawresult(self, x, y):# x = np.mat(x)# y = np.mat(y).transpose()plus = []minus = []for i in range(len(x)):if y[i] > 0:plus.append(x[i])else:minus.append(x[i])plus_matrix = np.array(plus)minus_matrix = np.array(minus)plt.scatter(np.transpose(plus_matrix)[0], np.transpose(plus_matrix)[1], s=30, alpha=0.7)plt.scatter(np.transpose(minus_matrix)[0], np.transpose(minus_matrix)[1], s=30, alpha=0.7)x1 = max(x)[0]x2 = min(x)[0]a1, a2 = self.w_b = float(self.b)a1 = float(a1[0])a2 = float(a2[0])y1 = (-b - a1 * x1) / a2y2 = (-b - a1 * x2) / a2plt.plot([x1, x2], [y1, y2])for i, alpha in enumerate(self.alphas):if abs(alpha) > 0:X, Y = x[i]plt.scatter([X], [Y], s=150, c='none', alpha=0.7, linewidth=1.5, edgecolor='red')plt.show()if __name__ == '__main__':filename = "../data/SVMTest.txt"x, y = getdata(filename)# drawdata(x, y)svm = SVM()svm.fit(x, y)# print(svm.w_)svm.drawresult(x, y)

Python实现SVM算法相关推荐

  1. opencv(python)使用svm算法识别手写数字

    svm算法是一种使用超平面将数据进行分类的算法. 关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析代码,由于这里主要研究knn算法,为了图简单,直接使用Kera ...

  2. svm算法python实现_(转载)python应用svm算法过程

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  3. python机器学习 | SVM算法介绍及实现

    本篇博客具体学习参考: 1 [机器学习]支持向量机SVM及实例应用 2 [ML]支持向量机(SVM)从入门到放弃再到掌握 这两篇文章讲得特别清楚,数学推导(第一篇)也能看明白,强烈推荐学习~~ 本篇博 ...

  4. 【python】SVM算法介绍

    支持向量机(support vector machines,SVM)是一种二分类模型,它将实例的特征向量映射为空间中的一些点,SVM的目的就是想要画出一条线,以"最好地"区分这两类 ...

  5. 使用Python+PCA+SVM算法实现人脸识别模型

    在本文中,我们将使用主成分分析和支持向量机来建立人脸识别模型. 首先,让我们了解PCA和SVM是什么: 主成分分析: 主成分分析(PCA)是一种机器学习算法,广泛应用于探索性数据分析和建立预测模型,它 ...

  6. svm算法python实现_手把手教你python实现SVM算法

    什么是机器学习 (Machine Learning) 机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能.它是人工智能的核心,是使计算 ...

  7. 学习笔记——Kaggle_Digit Recognizer (SVM算法 Python实现)

    本文是个人学习笔记,该篇主要学习SVM算法概念,并应用sklearn.svm算法包解决Kaggle入门级Digit Recognizer. SVM 简述 经典SVM思想 SVM 线性不可分 SVM 多 ...

  8. 支持向量机 SVM 算法推导优缺点 代码实现 in Python

    1.基本思想 前面讲到的Logistic Regression在拟合过程,实际上关注所有样本点的贡献,即寻找这么一个超平面,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练数据上达到这一目标 ...

  9. python SVM算法实例

    iris数据集是来自于Python自带的基础算法分析数据,主要作为算法分析和算法认识,是最为基础性的实例. 1.引入函数依赖 在这里使用了sklearn和numpy两个库作为基础依赖,算法选取了SVM ...

最新文章

  1. 可信计算 沈昌祥_沈昌祥院士在南宁开展网络安全前沿知识讲座
  2. python 日历_python中的日历和时间
  3. java正则表达式:查找所有{XXX}
  4. 目标检测学习笔记--DSSD算法
  5. python中digits什么意思_在Caffe中使用 DIGITS自定义Python层
  6. SAP Spartacus My Company list focus事件触发后,控件border的默认效果
  7. 各互联网公司延期上班一览
  8. Golang——string字符串常用函数(Contains、join、Index、Repeat、Replace、Split、Trim、Fields)
  9. squid代理简单应用
  10. 谷歌语音识别功能Live Transcribe,让AI帮助语言障碍者“说话”
  11. java获取发件人_如何获取发件人outlook / Exchange的SMTP地址
  12. hashCode 一致性hash 算法
  13. linux可视化界面改ip,Linux图形界面模式更改ip地址
  14. 等保二级需要测评吗?多久测评一次?
  15. 十大排行优惠券app,哪个更适合
  16. 162_apt-cyg安装
  17. 进程和线程的主仆问题
  18. 怎么恢复永久删除的文件
  19. 计算机C语言二级操作题之编程题
  20. 节日EDM系列:圣诞节如何进行EDM数据营销

热门文章

  1. [DDS直接数字频率合成]关于DDS技术产生调幅波的分析与思考
  2. Eclipse快捷键耍帅大全
  3. Android视图工作机制之measure、layout、draw
  4. 方舟生存进化联机显示没有找到服务器,方舟生存进化联机服务器怎么选_方舟生存进化联机服务器选择介绍-星芒手游网...
  5. 深入了解3D模型相关知识(建模、材质贴图、UV、法线),置换贴图、凹凸贴图与法线贴图的区别
  6. SRA数据库及其数据的下载
  7. 部署 Apache Camel K | 从 master 分支源码构建并部署 Camel K 平台
  8. java runnable 使用_如何调用java Runnable对象的其他方法?
  9. iOS学习笔记--Quartz2D
  10. mysql新增字段顺序_mysql 添加字段、删除字段、调整字段顺序 转