【机器学习1】支持向量机 (SVM)

支持向量机 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. 训练样本为线性 (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/

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split

http://blog.csdn.net/cherdw/article/details/54881167


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值