支持向量机是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。支持向量机的学习算法是求解凸二次规划的最优化算法。
在对线性可分数据集分类时,相对于感知机来说,SVM做出来的超平面是唯一的。
强烈推荐先看台湾大学机器学习技法(林轩田)前几节。
文中线性模型指的其实是直线,非线性模型指的是曲线。
关于点到超平面的距离的向量表示:
什么是函数间隔和几何间隔?
区别:函数间隔可以表示分类预测的正确性及确信度。但是只要成比例改变w和b,比如分别改为2w和2b,超平面没有变化,但是函数间隔却变为了原来的2倍。当我们对分离超平面的法向量w添加某些约束,如规范化,||w||=1,使得间隔是确定的。这时函数间隔就变为了几何间隔。
线性支持向量机及其软间隔最大化
为什么需要软间隔最大化?
因为线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,因为这时上述方法中的不等式约束并不能都成立。那为了解决线性不可分问题,引入松弛变量,使其变为软间隔最大化。
引入松弛变量后,约束条件和目标函数进行相应的变化:
然后即可以按照线性可分方法来考虑训练数据集线性不可分时的线性支持向量机学习问题。
支持向量:在线性可分情况下,训练数据集的样本点中与分离超平面距离最近的样本点的实例称为支持向量。
非线性支持向量机与核函数
核技巧是属于用线性分类方法来求解非线性分类问题:首先使用一个变换将原空间的数据映射到新空间,然后再新空间里用线性分类学习方法从训练数据中学习分类模型。
核技巧应用到支持向量机,其基本想法是通过一个非线性变换将输入空间(欧式空间或离散集合)对应于一个特征空间(希尔伯特空间),使得在输入空间中的超曲面模型对应于特征空间中的超平面模型(支持向量机)。这样分类问题的学习任务通过在特征空间中求解线性支持向量机就可以完成。
SMO算法原理
SMO算法表示:序列最小最优化(sequential minimal optimizationSMO)算法
这里看的不是很懂,公式看的有点晕。。。
e.逻辑回归与SVM的区别
1、两者的区别就在于逻辑回归采用的是 log loss(对数损失函数),SVM是最大化分类面间距。
其实,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。SVM的处理方法是只考虑支持向量,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重,两者的根本目的都是一样的。svm考虑局部支持向量,而logistic回归考虑全局,
2、损失函数的优化方法不一样,逻辑回归用剃度下降法优化,svm用smo方法进行优化
3、处理的数据规模不同。LR一般用来处理大规模的学习问题。如十亿级别的样本,亿级别的特征。
4、svm的基本思想是在样本点中找到一个最好的超平面
参考链接:
逻辑回归与SVM的区别:
调用机器学习包sklearn,来运用SVM
In [1]: import numpy as np
...: import pandas as pd
...: from sklearn.datasets import load_iris
...: from sklearn.cross_validation import train_test_split
...: import matplotlib.pyplot as plt
In [2]: # data
...: def create_data():
...: iris = load_iris()
...: df = pd.DataFrame(iris.data, columns=iris.feature_names)
...: df['label'] = iris.target
...: df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
...: data = np.array(df.iloc[:100, [0, 1, -1]])
...: for i in range(len(data)):
...: if data[i,-1] == 0:
...: data[i,-1] = -1
...: # print(data)
...: return data[:,:2], data[:,-1]
In [3]: X, y = create_data()
...: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
In [5]: from sklearn.svm import SVC
In [6]: clf = SVC()
In [7]: clf.fit(X_train,y_train)
Out[7]:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
In [8]: clf.score(X_test,y_test)
Out[8]: 1.0