文章目录
  1. 1. SVM算法描述
  2. 2. SVM解法
  3. 3. 示例
  4. 4. SVM源码

SVM算法描述


支持向量机是监督机器学习方法的一种,属于线性分类器一种。在数据线性可分的状况下,SVM在保证训练数据上分类正确的情况下,最大化分类间隔,使得模型的泛化能力更强,但数据无法线性可分时,模型为每个样本增加一个变量作为违背间隔的损失,最小化所有样本上的损失和最大化软间隔折中。SVM的分类边界只与支持向量有关。
数据在低维空间线性不可分,但是映射到高维空间可能线性可分,使用映射函数S计算得到新的特征,代入计算发现只和内积有关,因此定义kernel function为S(X)T*S(X)。

SVM解法


解最优化问题时,利用拉格朗日因子转化为对偶问题,在求解中,利用SMO每次变动两个变量,固定其余所有变量(因为等式约束使得无法只优化一个变量),每次优化都会使目标向极小值迈进一步,然后再对其他变量优化,使得满足KKT。
在优化变量选择上,第一个变量选择使KKT违反最严重的,第二个变量选择改进最大的。

示例


下面是一个垃圾短信识别的例子,利用word2vec作为特征,然后输入SVM判别是否为垃圾短信,这是一个小作业,可能因为老师给的数据源比较简单,垃圾和非垃圾区别很大,使得识别准确率在99%,但是代码效率不高,其中部分循环操作用numpy的矩阵运算,已提高一部分效率。

SVM源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#coding:utf-8
#输入一个string 首先分词,然后读取本地word2vec模型,计算向量,
#读取本地的svm模型,做预测
#返回预测结果
import warnings
warnings.filterwarnings("ignore")
import jieba
import numpy as np
from numpy import *
try:
import cPickle as pickle
except:
import pickle
import gensim
class svm_inter:
def __init__(self,sentence):
self.sentence = sentence
def feature(self):
word_model = gensim.models.Word2Vec.load_word2vec_format('../data/spam_word2vec_model',binary=True)
seg_list = jieba.cut(self.sentence, cut_all=False)
count = 0
for j in seg_list:
if j not in word_model:
continue
if count == 0:
old = word_model[j]
new = np.zeros(shape=old.shape)
else:
new = word_model[j]
old = old + new
count += 1
if (count != 0):
old = old * (1.0 / count)
self.x = list(old)
def kernel(self,x, y, sigma):
x = mat(x)
y = mat(y)
temp = x - y
return math.exp(temp * temp.T / (-2) * sigma * sigma)
def label(self, alphs_result, x_result, y_result, b):
num = len(alphs_result)
re = 0.0
for i in range(num):
re += alphs_result[i] * y_result[i] * self.kernel(x_result[i], self.x, 1)
re += b
if (re < 0):
return -1
else:
return 1
def get_label(self):
read_model = open("../data/svm_mode_1.txt",'r')
data_string = read_model.read().split("****&&")
alphs_result = pickle.loads(data_string[0])
x_result = pickle.loads(data_string[1])
y_result = pickle.loads(data_string[2])
b = pickle.loads(data_string[3])
read_model.close()
pre = self.label(alphs_result, x_result, y_result, b)
if(pre == 1):
print"垃圾短信"
else:
print "正常短信"
return pre
sentence = "我们小组是最棒的 每个人都很给力"
test = svm_inter(sentence)
test.feature()
print sentence
pre =test.get_label()
文章目录
  1. 1. SVM算法描述
  2. 2. SVM解法
  3. 3. 示例
  4. 4. SVM源码