Deeplearning Algorithms tutorial

谷歌的人工智能位于全球前列,在图像识别、语音识别、无人驾驶等技术上都已经落地。而百度实质意义上扛起了国内的人工智能的大旗,覆盖无人驾驶、智能助手、图像识别等许多层面。苹果业已开始全面拥抱机器学习,新产品进军家庭智能音箱并打造工作站级别Mac。另外,腾讯的深度学习平台Mariana已支持了微信语音识别的语音输入法、语音开放平台、长按语音消息转文本等产品,在微信图像识别中开始应用。全球前十大科技公司全部发力人工智能理论研究和应用的实现,虽然入门艰难,但是一旦入门,高手也就在你的不远处! AI的开发离不开算法那我们就接下来开始学习算法吧!

支持向量机(SVM)

支持向量机(Support Vector Machine,SVM)是Corinna Cortes和Vapnik在1995年首先提出的,是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。支持向量机属于一般化线性分类器,这族分类器的特点是他们能够同时最小化经验误差与最大化几何边缘区,因此支持向量机也被称为最大边缘区分类器。

在机器学习中,支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。 支持向量机方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折中,以求获得最好的推广能力 。

在机器学习中,支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。给定一组训练样本,每个标记为属于两类,一个SVM训练算法建立了一个模型,分配新的实例为一类或其他类,使其成为非概率二元线性分类。一个SVM模型的例子,如在空间中的点,映射,使得所述不同的类别的例子是由一个明显的差距是尽可能宽划分的表示。新的实施例则映射到相同的空间中,并预测基于它们落在所述间隙侧上属于一个类别。 除了进行线性分类,支持向量机可以使用所谓的核技巧,它们的输入隐含映射成高维特征空间中有效地进行非线性分类。

支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面。建立方向合适的分隔超平面使两个与之平行的超平面间的距离最大化。其假定为,平行超平面间的距离或差距越大,分类器的总误差越小。

支持向量机(SVM) - 图1

应用示例

  1. # coding: utf8
  2. # svm/smo.py
  3. import numpy as np
  4. from sklearn.metrics.pairwise import rbf_kernel
  5. """
  6. svm模型
  7. """
  8. def linearKernel():
  9. """线性核函数
  10. """
  11. def calc(X, A):
  12. return X * A.T
  13. return calc
  14. def rbfKernel(delta):
  15. """rbf核函数
  16. """
  17. gamma = 1.0 / (2 * delta**2)
  18. def calc(X, A):
  19. return np.mat(rbf_kernel(X, A, gamma=gamma))
  20. return calc
  21. def getSmo(X, y, C, tol, maxIter, kernel=linearKernel()):
  22. """SMO
  23. Args:
  24. X 训练样本
  25. y 标签集
  26. C 正规化参数
  27. tol 容忍值
  28. maxIter 最大迭代次数
  29. K 所用核函数
  30. Returns:
  31. trainSimple 简化版训练算法
  32. train 完整版训练算法
  33. predict 预测函数
  34. """
  35. # 存放核函数的转化结果
  36. K = kernel(X, X)
  37. # Cache存放预测误差,用以加快计算速度
  38. ECache = np.zeros((m,2))
  39. def predict(X, alphas, b, supportVectorsIndex, supportVectors):
  40. """计算权值向量
  41. Args:
  42. X 预测矩阵
  43. alphas alphas
  44. b b
  45. supportVectorsIndex 支持向量坐标集
  46. supportVectors 支持向量
  47. Returns:
  48. predicts 预测结果
  49. """
  50. Ks = kernel(supportVectors, X)
  51. predicts = (np.multiply(alphas[supportVectorsIndex], y[
  52. supportVectorsIndex]).T * Ks + b).T
  53. predicts = np.sign(predicts)
  54. return predicts
  55. def w(alphas, b, supportVectorsIndex, supportVectors):
  56. """计算权值
  57. Args:
  58. alphas alphas
  59. b b
  60. supportVectorsIndex 支持向量坐标
  61. supportVectors 支持向量
  62. Returns:
  63. w 权值向量
  64. """
  65. return (np.multiply(alphas[supportVectorsIndex], y[
  66. supportVectorsIndex]).T * supportVectors).T
  67. def E(i, alphas, b):
  68. """计算预测误差
  69. Args:
  70. i i
  71. alphas alphas
  72. b b
  73. Returns:
  74. E_i 第i个样本的预测误差
  75. """
  76. FXi = float(np.multiply(alphas, y).T * K[:, i]) + b
  77. E = FXi - float(y[i])
  78. return E
  79. def updateE(i, alphas, b):
  80. ECache[i] = [1, E(i, alphas, b)]
  81. def selectJRand(i):
  82. """
  83. """
  84. j = i
  85. while j == i:
  86. j = int(np.random.uniform(0, m))
  87. return j
  88. def selectJ(i, Ei, alphas, b):
  89. """选择权值 {% math %}\alpha^{(i)}{% endmath %}
  90. """
  91. maxJ = 0; maxDist=0; Ej = 0
  92. ECache[i] = [1, Ei]
  93. validCaches = np.nonzero(ECache[:, 0])[0]
  94. if len(validCaches) > 1:
  95. for k in validCaches:
  96. if k==i: continue
  97. Ek = E(k, alphas, b)
  98. dist = np.abs(abs(Ei-Ek))
  99. if maxDist < dist:
  100. Ej = Ek
  101. maxJ = k
  102. maxDist = dist
  103. return maxJ, Ej
  104. else:
  105. ### 随机选择
  106. j = selectJRand(i)
  107. Ej = E(j, alphas, b)
  108. return j, Ej
  109. def select(i, alphas, b):
  110. """alpha对选择
  111. """
  112. Ei = E(i, alphas, b)
  113. # 选择违背KKT条件的,作为alpha2
  114. Ri = y[i] * Ei
  115. if (Ri < -tol and alphas[i] < C) or \
  116. (Ri > tol and alphas[i] > 0):
  117. # 选择第二个参数
  118. j = selectJRand(i)
  119. Ej = E(j, alphas, b)
  120. # j, Ej = selectJ(i, Ei, alphas, b)
  121. # get bounds
  122. if y[i] != y[j]:
  123. L = max(0, alphas[j] - alphas[i])
  124. H = min(C, C + alphas[j] - alphas[i])
  125. else:
  126. L = max(0, alphas[j] + alphas[i] - C)
  127. H = min(C, alphas[j] + alphas[i])
  128. if L == H:
  129. return 0, alphas, b
  130. Kii = K[i, i]
  131. Kjj = K[j, j]
  132. Kij = K[i, j]
  133. eta = 2.0 * Kij - Kii - Kjj
  134. if eta >= 0:
  135. return 0, alphas, b
  136. iOld = alphas[i].copy()
  137. jOld = alphas[j].copy()
  138. alphas[j] = jOld - y[j] * (Ei - Ej) / eta
  139. if alphas[j] > H:
  140. alphas[j] = H
  141. elif alphas[j] < L:
  142. alphas[j] = L
  143. if abs(alphas[j] - jOld) < tol:
  144. alphas[j] = jOld
  145. return 0, alphas, b
  146. alphas[i] = iOld + y[i] * y[j] * (jOld - alphas[j])
  147. # update ECache
  148. updateE(i, alphas, b)
  149. updateE(j, alphas, b)
  150. # update b
  151. bINew = b - Ei - y[i] * (alphas[i] - iOld) * Kii - y[j] * \
  152. (alphas[j] - jOld) * Kij
  153. bJNew = b - Ej - y[i] * (alphas[i] - iOld) * Kij - y[j] * \
  154. (alphas[j] - jOld) * Kjj
  155. if alphas[i] > 0 and alphas[i] < C:
  156. bNew = bINew
  157. elif alphas[j] > 0 and alphas[j] < C:
  158. bNew = bJNew
  159. else:
  160. bNew = (bINew + bJNew) / 2
  161. return 1, alphas, b
  162. else:
  163. return 0, alphas, b
  164. def train():
  165. """完整版训练算法
  166. Returns:
  167. alphas alphas
  168. w w
  169. b b
  170. supportVectorsIndex 支持向量的坐标集
  171. supportVectors 支持向量
  172. iterCount 迭代次数
  173. """
  174. numChanged = 0
  175. examineAll = True
  176. iterCount = 0
  177. alphas = np.mat(np.zeros((m, 1)))
  178. b = 0
  179. # 如果所有alpha都遵从 KKT 条件,则在整个训练集上迭代
  180. # 否则在处于边界内 (0, C) 的 alpha 中迭代
  181. while (numChanged > 0 or examineAll) and (iterCount < maxIter):
  182. numChanged = 0
  183. if examineAll:
  184. for i in range(m):
  185. changed, alphas, b = select(i, alphas, b)
  186. numChanged += changed
  187. else:
  188. nonBoundIds = np.nonzero((alphas.A > 0) * (alphas.A < C))[0]
  189. for i in nonBoundIds:
  190. changed, alphas, b = select(i, alphas, b)
  191. numChanged += changed
  192. iterCount += 1
  193. if examineAll:
  194. examineAll = False
  195. elif numChanged == 0:
  196. examineAll = True
  197. supportVectorsIndex = np.nonzero(alphas.A > 0)[0]
  198. supportVectors = np.mat(X[supportVectorsIndex])
  199. return alphas, w(alphas, b, supportVectorsIndex, supportVectors), b, \
  200. supportVectorsIndex, supportVectors, iterCount
  201. def trainSimple():
  202. """简化版训练算法
  203. Returns:
  204. alphas alphas
  205. w w
  206. b b
  207. supportVectorsIndex 支持向量的坐标集
  208. supportVectors 支持向量
  209. iterCount 迭代次数
  210. """
  211. numChanged = 0
  212. iterCount = 0
  213. alphas = np.mat(np.zeros((m, 1)))
  214. b = 0
  215. L = 0
  216. H = 0
  217. while iterCount < maxIter:
  218. numChanged = 0
  219. for i in range(m):
  220. Ei = E(i, alphas, b)
  221. Ri = y[i] * Ei
  222. # 选择违背KKT条件的,作为alpha2
  223. if (Ri < -tol and alphas[i] < C) or \
  224. (Ri > tol and alphas[i] > 0):
  225. # 选择第二个参数
  226. j = selectJRand(i)
  227. Ej = E(j, alphas, b)
  228. # get bounds
  229. if y[i] != y[j]:
  230. L = max(0, alphas[j] - alphas[i])
  231. H = min(C, C + alphas[j] - alphas[i])
  232. else:
  233. L = max(0, alphas[j] + alphas[i] - C)
  234. H = min(C, alphas[j] + alphas[i])
  235. if L == H:
  236. continue
  237. Kii = K[i, i]
  238. Kjj = K[j, j]
  239. Kij = K[i, j]
  240. eta = 2.0 * Kij - Kii - Kjj
  241. if eta >= 0:
  242. continue
  243. iOld = alphas[i].copy();
  244. jOld = alphas[j].copy()
  245. alphas[j] = jOld - y[j] * (Ei - Ej) / eta
  246. if alphas[j] > H:
  247. alphas[j] = H
  248. elif alphas[j] < L:
  249. alphas[j] = L
  250. if abs(alphas[j] - jOld) < tol:
  251. alphas[j] = jOld
  252. continue
  253. alphas[i] = iOld + y[i] * y[j] * (jOld - alphas[j])
  254. # update b
  255. bINew = b - Ei - y[i] * (alphas[i] - iOld) * Kii - y[j] * \
  256. (alphas[j] - jOld) * Kij
  257. bJNew = b - Ej - y[i] * (alphas[i] - iOld) * Kij - y[j] * \
  258. (alphas[j] - jOld) * Kjj
  259. if alphas[i] > 0 and alphas[i] < C:
  260. b = bINew
  261. elif alphas[j] > 0 and alphas[j] < C:
  262. b = bJNew
  263. else:
  264. b = (bINew + bJNew) / 2.0
  265. numChanged += 1
  266. if numChanged == 0:
  267. iterCount += 1
  268. else:
  269. iterCount = 0
  270. supportVectorsIndex = np.nonzero(alphas.A > 0)[0]
  271. supportVectors = np.mat(X[supportVectorsIndex])
  272. return alphas, w(alphas, b, supportVectorsIndex, supportVectors), b, \
  273. supportVectorsIndex, supportVectors, iterCount
  274. return trainSimple, train, predict

相比于神经网络这样更先进的算法,支持向量机有两大主要优势:更高的速度、用更少的样本(千以内)取得更好的表现。这使得该算法非常适合文本分类问题。