﻿1
00:00:17,850 --> 00:00:18,920
大家好！

2
00:00:18,920 --> 00:00:23,350
在大多数的课程，都会有一个难点。

3
00:00:23,350 --> 00:00:27,480
前几节课，你接触了些你大概不愿意接触的数学知识，

4
00:00:27,480 --> 00:00:31,350
你可能认识到你可能永远都无法完全理解

5
00:00:31,350 --> 00:00:35,650
这些机器学习方法的工作细节。

6
00:00:35,650 --> 00:00:39,280
我希望你知道我想传达的是现代机器学习法的要领，

7
00:00:39,280 --> 00:00:41,710
而不是细节。

8
00:00:41,710 --> 00:00:44,800
重要的是，你可以使用它们，并且了解点

9
00:00:44,800 --> 00:00:47,170
它们主要工作原理。

10
00:00:47,170 --> 00:00:49,220
我们不再涉及数学了。

11
00:00:49,220 --> 00:00:53,650
所以，坚持；事情开始变得容易。无论如何，快了：

12
00:00:53,650 --> 00:00:55,610
还有几节课。

13
00:00:57,000 --> 00:00:59,210
我之前告诉过你我演奏音乐。

14
00:00:59,210 --> 00:01:02,300
昨天有人来到我家，带来了一个低音巴松管。

15
00:01:02,300 --> 00:01:07,550
它是管弦乐队中最低沉的乐器。

16
00:01:07,550 --> 00:01:08,870
你不常见到或者听到它。

17
00:01:08,870 --> 00:01:13,640
所以，这里，我试着第一次演奏低音巴松管。

18
00:01:27,000 --> 00:01:32,960
我认为这会是我们课程的最低点，数据挖掘和Weka！

19
00:01:32,960 --> 00:01:37,570
今天，我想要谈一下支持向量机，另一种先进的机器学习的

20
00:01:37,570 --> 00:01:41,040
技术。

21
00:01:41,040 --> 00:01:46,280
我们上节课学习了logistic回归，我们发现

22
00:01:46,280 --> 00:01:48,350
它在实例空间产生线性分界线。

23
00:01:48,350 --> 00:01:56,340
事实上，我们用Weka的分界可视化工具演示了logistic回归

24
00:01:56,340 --> 00:02:06,010
产生的分界（使用的是二维的鸢尾花数据，花瓣宽相对于花瓣长的）。

25
00:02:06,010 --> 00:02:13,010
这条黑线是红色的和绿色的类之间的分界线。

26
00:02:14,110 --> 00:02:18,280
它可能是更合理的，如果我们在这两个类之间划一条分界线，

27
00:02:18,280 --> 00:02:25,940
尽量让它通过两个类之间最宽的通道，尽可能地将

28
00:02:25,940 --> 00:02:28,760
每一类区别开来。

29
00:02:28,760 --> 00:02:36,290
这是一个示意图，黑色的线正好在

30
00:02:36,290 --> 00:02:37,620
两个类的通道的中间。

31
00:02:37,620 --> 00:02:46,130
实际上，数学上，我们可以通过两个关键成员找到这条线，

32
00:02:46,130 --> 00:02:52,130
每个类产生一个关键成员（它们叫做支持向量；这些是确定通道

33
00:02:52,130 --> 00:02:58,490
的关键点），采用两个支持向量的连接线的

34
00:02:58,490 --> 00:03:01,230
垂直平分线。

35
00:03:01,230 --> 00:03:03,220
这就是支持向量机的理念。

36
00:03:03,220 --> 00:03:08,330
在两个类之间划一条线，但是并不是像以前那样为了把它们分开。

37
00:03:08,330 --> 00:03:15,060
我们试着在两个类之间最宽的通道间划线。

38
00:03:15,060 --> 00:03:15,730
这是另一幅图。

39
00:03:15,730 --> 00:03:20,240
我们有两组点，用线沿着每一组的边缘把它们圈起来

40
00:03:20,240 --> 00:03:22,740
（绿色的一组和棕色的一组）。

41
00:03:22,740 --> 00:03:29,740
显然，内部的点不会影响这个超平面，这个平面，

42
00:03:30,040 --> 00:03:31,680
这个分界线。

43
00:03:31,680 --> 00:03:38,040
我把它叫做线，但是在多维的空间它可能是一个平面，或者一个

44
00:03:38,040 --> 00:03:39,830
四维甚至更多维的超平面。

45
00:03:39,830 --> 00:03:46,830
每个组只有几个点会限定分界线的位置：

46
00:03:46,980 --> 00:03:47,540
它们是支持向量。

47
00:03:47,540 --> 00:03:51,260
在这个例子中，有三个点。

48
00:03:51,260 --> 00:03:53,020
支持向量决定边界。

49
00:03:53,020 --> 00:03:57,420
训练数据集的其他全部实例都可以删除，而不会

50
00:03:57,420 --> 00:04:02,600
改变这个分割超平面的位置。

51
00:04:02,600 --> 00:04:07,720
这里有一个简单的方程，这是这部分课程最后一个方程了。

52
00:04:07,720 --> 00:04:15,570
这个简单的方程以支持向量的和的形式给出了

53
00:04:15,570 --> 00:04:17,460
最大边缘超平面的公式。

54
00:04:17,460 --> 00:04:23,960
这些是每一个支持向量的向量积的总和。

55
00:04:23,960 --> 00:04:30,030
计算最大边缘超平面会变得非常简单，只要你知道

56
00:04:30,030 --> 00:04:30,930
支持向量。

57
00:04:30,930 --> 00:04:35,090
这是一个简单的求和，就像我说的，它只取决于支持向量。

58
00:04:35,090 --> 00:04:41,960
其他的点都不会参与计算。

59
00:04:41,960 --> 00:04:48,130
现在，在现实生活中，你也许无法在类之间划出一条直线。

60
00:04:48,130 --> 00:04:52,880
如果两个类之间存在一条可以将它们分开的直线，

61
00:04:52,880 --> 00:04:54,750
它们称为“线形可分离”的，

62
00:04:54,750 --> 00:04:58,940
这幅图里，这两个类就不是线形可分离的。

63
00:04:58,940 --> 00:05:03,140
这也许不太好看出来，但是线这边绿色的区域有一些蓝色的点，

64
00:05:03,140 --> 00:05:07,060
线那边蓝色的区域有一些绿色的点。

65
00:05:07,060 --> 00:05:13,190
这不可能得出一条直线作为分界线。

66
00:05:13,190 --> 00:05:18,370
这使得支持向量机（的数学知识）有点复杂。

67
00:05:18,370 --> 00:05:25,370
但是，在这种条件下找到最大边缘超平面还是可能的。

68
00:05:27,280 --> 00:05:30,340
这就是支持向量机。

69
00:05:30,340 --> 00:05:32,710
这是一个线形的决策分界。

70
00:05:32,710 --> 00:05:38,000
实际上，有一种更聪明的技术可以让你得到更复杂的分界。

71
00:05:38,000 --> 00:05:41,880
它叫做“Kernel trick”（核技巧）。

72
00:05:41,880 --> 00:05:47,900
使用不同的"kernel"公式（Weka中你只需从

73
00:05:47,900 --> 00:05:54,730
提供的kernels中选择），你会得到不同形状的分界线，而不仅仅是直线。

74
00:05:54,730 --> 00:06:01,420
支持向量机很神奇，因为可以避免过度拟合。

75
00:06:01,420 --> 00:06:08,240
分界取决于数据集中数量极少的几个点。

76
00:06:08,240 --> 00:06:12,120
所以，它不会过度拟合数据集，因为它与大多数

77
00:06:12,120 --> 00:06:17,720
数据集中的点没有关系，只取决于几个关键点（支持向量）。

78
00:06:17,720 --> 00:06:23,800
所以它不会发生过度拟合，即使有非常多的属性。

79
00:06:23,800 --> 00:06:28,290
Weka有一些支持向量机的实现。

80
00:06:28,290 --> 00:06:31,650
我们可以看functions目录下的SMO。

81
00:06:31,650 --> 00:06:36,630
让我们去看看。

82
00:06:36,630 --> 00:06:51,060
看一下functions目录下的SMO，它实现了一种

83
00:06:51,060 --> 00:06:54,110
用于训练支持向量机分类器的，叫做序列最小优化算法（Sequential Minimal Optimization）。

84
00:06:55,720 --> 00:07:00,160
这里有几个参数，例如包括，核的不同选择。

85
00:07:00,160 --> 00:07:04,540
你可以选择不同的核：你可以尝试不同的东西。

86
00:07:04,540 --> 00:07:07,060
还有一些其他的参数。

87
00:07:07,060 --> 00:07:12,310
实际上，SMO算法只能用于二类的问题，所以只能用于

88
00:07:12,310 --> 00:07:15,040
二类的数据集。

89
00:07:15,040 --> 00:07:20,930
Weka还有一些更加复杂的支持向量机的实现方法。

90
00:07:20,930 --> 00:07:29,430
有一个叫做LibSVM的库，是一个外部库，Weka与这个库之间有一个接口。

91
00:07:29,430 --> 00:07:34,940
这是LibSVM工具的包装类。

92
00:07:34,940 --> 00:07:39,680
你需要分别从Weka下载这些，并把它们放在正确的Java classpath。

93
00:07:39,680 --> 00:07:44,960
你可以看到这里有许多不同的参数，事实上，

94
00:07:44,960 --> 00:07:51,930
许多关于这个支持向量机工具包的信息。

95
00:07:51,930 --> 00:07:55,090
这就是支持向量机。

96
00:07:55,090 --> 00:07:56,380
你可以阅读课本的6.4节了解更多内容。

97
00:07:56,380 --> 00:08:01,850
请完成本课的相关练习。

98
00:08:01,850 --> 00:08:04,940
这部分的最后一节课再见！

99
00:08:04,940 --> 00:08:05,800
再见！
