支持向量机 Support Vector Machine
Part I 相关理论
简介:https://en.wikipedia.org/wiki/Support_vector_machine
属性:有监督学习;分类算法
应用:
- 文本分析:分类
- 图片分类
- 手写字符的识别
- 生物科学
算法实质:(线性/非线性)约束下的优化问题;目标函数就是我们想要求解的分类平面(i.e. 超平面 hyperplane)
分类及对应原理:
(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
(3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
理论部分参考资料(学习来源):
http://blog.pluskid.org/?page_id=683 Ps:该网站的博主是大神啊,公式、算法原理都整理得十分到位~
https://www.cnblogs.com/en-heng/p/5965438.html
http://blog.csdn.net/szlcw1/article/details/52259668
Part II 算法代码(基于Python)
例1:一个最简单的例子
# 导入相应package
from sklearn.svm import SVC
import numpy as np
# 数据
x=np.array([[-1,-1],[-2,-1],[1,1],[2,1]])
y=np.array([1,1,2,2])
# SVM核心语法
clf=SVC()
clf.fit(x,y)
print(clf.predict([[-0.8,-1]]))
说明:SVC参数解释
(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
(2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂;
(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features;
(5)coef0:核函数中的独立项,'RBF' and 'Poly'有效;
(6)probablity: 可能性估计是否使用(true or false);
(7)shrinking:是否进行启发式;
(8)tol(default = 1e - 3): svm结束标准的精度;
(9)cache_size: 制定训练所需要的内存(以MB为单位);
(10)class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应;
(11)verbose: 跟多线程有关,不大明白啥意思具体;
(12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited;
(13)decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多 or None 无, default=None
(14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。
ps:7,8,9一般不考虑。
(2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂;
(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features;
(5)coef0:核函数中的独立项,'RBF' and 'Poly'有效;
(6)probablity: 可能性估计是否使用(true or false);
(7)shrinking:是否进行启发式;
(8)tol(default = 1e - 3): svm结束标准的精度;
(9)cache_size: 制定训练所需要的内存(以MB为单位);
(10)class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应;
(11)verbose: 跟多线程有关,不大明白啥意思具体;
(12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited;
(13)decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多 or None 无, default=None
(14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。
ps:7,8,9一般不考虑。
例2. 训练样本为线性 (Jupyter NoteBook测试已通过)
## 导入相关的package
import pandas as pd
import numpy as np
from numpy.random import choice
from sklearn import svm, preprocessing
from sklearn.cross_validation import train_test_split
from sklearn import metrics
import matplotlib.pyplot as plt
## DataFrame的创建
feature1_close=[4,2,3,4,4,3,3,2]
feature2_volume=[1,2,0,1,2,0,1,0]
target=[1,0,0,1,1,1,0,1]
df=pd.DataFrame({"feature1_close":feature1_close,"feature2_volume":feature2_volume,"target":target})
df.as_matrix()
## 定义SVM类
class SVM:
def __init__(self):
self.data=df.as_matrix()
self.train_data,self.test_data=train_test_split(self.data,test_size=0.5,train_size=0.5) #将样本数据分为训练集和测试集
self.train_target_data=self.train_data[:,-1] #得到目标类别的训练集
self.test_target_data=self.test_data[:,-1] #得到目标类别的测试集
self.train_data=self.train_data[:,:-1] #得到特征值的训练集
self.test_data=self.test_data[:,:-1] #得到特征值的测试集
self.scalar=preprocessing.StandardScaler() #数据的标准化处理
self.train_data=self.scalar.fit_transform(self.train_data)
self.test_data=self.scalar.transform(self.test_data)
self.linear_svm=svm.LinearSVC() #进行SVM的线性拟合
self.linear_svm.fit(self.train_data,self.train_target_data)
def experiment1(self):
predicted=self.linear_svm.predict(self.test_data)
confidence=self.linear_svm.decision_function(self.test_data) #置信区间
accuracy=self.linear_svm.score(self.test_data,self.test_target_data) #准确率
recall=metrics.recall_score(self.test_target_data,predicted) #召回率
precision=metrics.precision_score(self.test_target_data,predicted) #精确率
fp_rate,tp_rate,thresholds=metrics.roc_curve(self.test_target_data,confidence) #ROC曲线
plt.clf()
plt.figure()
plt.plot(fp_rate, tp_rate, color='red', lw=2)
plt.plot([0, 1], [0, 1], color='blue', lw=2, linestyle='--')
plt.xlim([-0.05, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic Curve')
plt.show()
## 调用类函数
if __name__ == '__main__':
s=SVM()
s.experiment1()
说明:data是sklearn自带的一个数据结构,是一个字典结构,有5个keys,分别是: 'DESCR','data','feature_names','target','target_names'
代码部分参考资料(学习来源):
https://github.com/jerry81333/StockProdiction/