├── .gitignore
├── readme.md
├── dl1_Perceptron.ipynb
├── dl3_LinearUnit.ipynb
└── dl2_Perceptron_Classify.ipynb
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | .ipynb_checkpoints
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | bin/
11 | build/
12 | develop-eggs/
13 | dist/
14 | eggs/
15 | lib/
16 | lib64/
17 | parts/
18 | sdist/
19 | var/
20 | *.egg-info/
21 | .installed.cfg
22 | *.egg
23 |
24 | # Installer logs
25 | pip-log.txt
26 | pip-delete-this-directory.txt
27 |
28 | # Unit test / coverage reports
29 | .tox/
30 | .coverage
31 | .cache
32 | nosetests.xml
33 | coverage.xml
34 |
35 | # Translations
36 | *.mo
37 |
38 | # Mr Developer
39 | .mr.developer.cfg
40 | .project
41 | .pydevproject
42 |
43 | # Rope
44 | .ropeproject
45 |
46 | # Django stuff:
47 | *.log
48 | *.pot
49 |
50 | # Sphinx documentation
51 | docs/_build/
52 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #### AI圈是什么?
7 |
8 | 我们是一群通过数据竞赛认识的朋友,竞赛大佬们拿奖无数(不包括我)。比赛打累了,突然想做点情怀的事情。
9 |
10 | 以前我们一直孤独的在学习,直到我们相互遇见。所以我们想改变孤独,提供一个温暖的大家庭。
11 |
12 | 我们目前致力于提供一个非盈利平台一起集训学习编程、算法、数学、AI。这里没有小白歧视,大家一起互助共赢。
13 |
14 | 如果您有技术、运营、PS经历,可以公众号回复自己意愿和个人简介加入我们的核心团队。感谢阅读,感谢关注。
15 |
16 | #### 文集介绍
17 |
18 | 这是本系列文集暂定要写的内容:
19 |
20 | 
21 |
22 | [不用框架入门进阶深度学习](http://mp.weixin.qq.com/mp/homepage?__biz=MzU4OTczNTg2OQ==&hid=3&sn=e6b1edd8a4b35b5741873e4948495294&scene=18#wechat_redirect)
23 |
24 | - [不用框架入门进阶深度学习(0)-引言](https://mp.weixin.qq.com/s?__biz=MzU4OTczNTg2OQ==&mid=2247483697&idx=1&sn=7d3aa0cf5caaa463c76f7651cdf6cee7&scene=19&token=889866011&lang=zh_CN#wechat_redirect)
25 | - [不用框架入门进阶深度学习(1)-手写感知器](https://mp.weixin.qq.com/s?__biz=MzU4OTczNTg2OQ==&mid=2247483697&idx=1&sn=7d3aa0cf5caaa463c76f7651cdf6cee7&scene=19&token=889866011&lang=zh_CN#wechat_redirect)
26 | - [不用框架入门进阶深度学习(2)-手写感知器做分类任务](https://mp.weixin.qq.com/s?__biz=MzU4OTczNTg2OQ==&mid=2247483697&idx=1&sn=7d3aa0cf5caaa463c76f7651cdf6cee7&scene=19&token=889866011&lang=zh_CN#wechat_redirect)
27 | - [更新中](http://mp.weixin.qq.com/mp/homepage?__biz=MzU4OTczNTg2OQ==&hid=3&sn=e6b1edd8a4b35b5741873e4948495294&scene=18#wechat_redirect)
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/dl1_Perceptron.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## $$不用框架入门进阶深度学习(1)-手写感知器$$\n",
8 | "### 一、And 感知机\n",
9 | "\n",
10 | "And真值表:\n",
11 | "\n",
12 | "|$x_1$|$x_2$|$y$|\n",
13 | "|----|----|----|\n",
14 | "|1|1|1|\n",
15 | "|1|0|0|\n",
16 | "|0|1|0|\n",
17 | "|0|0|0|\n",
18 | "\n",
19 | "权重更新规则:\n",
20 | "$$\n",
21 | "\\begin{equation}\n",
22 | "\\begin{aligned}\n",
23 | "\\Delta b_i&=\\delta (y- \\widehat{y}) \\\\\n",
24 | "\\Delta w_i&=\\delta (y- \\widehat{y})x_i \\\\\n",
25 | "w_i&=w_i + \\Delta w_i\\\\\n",
26 | "b_i&=b_i + \\Delta b_i \n",
27 | "\\end{aligned}\n",
28 | "\\end{equation}\n",
29 | "$$\n",
30 | "\n",
31 | "其中$\\delta叫学习率$,y为正确的输出,$\\widehat{y}为感知机预测$的结果。\n",
32 | "\n"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 1,
38 | "metadata": {},
39 | "outputs": [],
40 | "source": [
41 | "import numpy as np\n",
42 | "\n",
43 | "class Perceptron(object):\n",
44 | " def __init__(self, input_feature_num, activation=None):\n",
45 | " self.activation = activation if activation else self.sign\n",
46 | " self.w = [0.0] * input_feature_num\n",
47 | " self.b = 0.0\n",
48 | "\n",
49 | " def sign(self, z):\n",
50 | " # 阶跃激活函数:\n",
51 | " # sign(z) = 1 if z > 0 \n",
52 | " # sign(z) = 0 otherwise\n",
53 | " return int(z>0)\n",
54 | " \n",
55 | " def predict(self, x):\n",
56 | " # 预测输出函数\n",
57 | " # y_hat = f(wx + b)\n",
58 | " return self.activation(\n",
59 | " np.dot(self.w, x) + self.b)\n",
60 | " \n",
61 | " def fit(self, x_train, y_train, iteration=10, learning_rate=0.1):\n",
62 | " # 训练函数\n",
63 | " for _ in range(iteration):\n",
64 | " for x, y in zip(x_train, y_train):\n",
65 | " y_hat = self.predict(x)\n",
66 | " self._update_weights(x, y, y_hat, learning_rate)\n",
67 | " print(self)\n",
68 | " \n",
69 | " def _update_weights(self, x, y, y_hat, learning_rate):\n",
70 | " # 权重更新, 对照公式查看\n",
71 | " delta = y - y_hat\n",
72 | " self.w = np.add(self.w,\n",
73 | " np.multiply(learning_rate * delta, x))\n",
74 | " self.b += learning_rate * delta\n",
75 | " \n",
76 | " def __str__(self):\n",
77 | " return 'weights: {}\\tbias: {}'.format(self.w, self.b)"
78 | ]
79 | },
80 | {
81 | "cell_type": "code",
82 | "execution_count": 2,
83 | "metadata": {},
84 | "outputs": [],
85 | "source": [
86 | "# 数据准备\n",
87 | "def get_and_training_dataset():\n",
88 | " x_train = [[0, 0], [0, 1], [1, 0], [1, 1]]\n",
89 | " y_train = [0, 0, 0, 1]\n",
90 | " return x_train, y_train"
91 | ]
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 3,
96 | "metadata": {},
97 | "outputs": [
98 | {
99 | "name": "stdout",
100 | "output_type": "stream",
101 | "text": [
102 | "weights: [ 0.2 0.1]\tbias: -0.2\n"
103 | ]
104 | }
105 | ],
106 | "source": [
107 | "# 拟合数据\n",
108 | "x_train, y_train = get_and_training_dataset()\n",
109 | "and_p = Perceptron(2)\n",
110 | "and_p.fit(x_train, y_train, iteration=5, learning_rate=0.1)"
111 | ]
112 | },
113 | {
114 | "cell_type": "code",
115 | "execution_count": 4,
116 | "metadata": {},
117 | "outputs": [
118 | {
119 | "name": "stdout",
120 | "output_type": "stream",
121 | "text": [
122 | "and 感知机权重:\n",
123 | " weights: [ 0.2 0.1]\tbias: -0.2 \n",
124 | "\n",
125 | "1 & 1 = 1\n",
126 | "1 & 0 = 0\n",
127 | "0 & 1 = 0\n",
128 | "0 & 0 = 0\n"
129 | ]
130 | }
131 | ],
132 | "source": [
133 | "# 预测数据\n",
134 | "print('and 感知机权重:\\n', and_p, '\\n')\n",
135 | "print('1 & 1 = %d' % and_p.predict([1, 1]))\n",
136 | "print('1 & 0 = %d' % and_p.predict([1, 0]))\n",
137 | "print('0 & 1 = %d' % and_p.predict([0, 1]))\n",
138 | "print('0 & 0 = %d' % and_p.predict([0, 0]))"
139 | ]
140 | },
141 | {
142 | "cell_type": "markdown",
143 | "metadata": {},
144 | "source": [
145 | "### 二、作业:Or 感知机\n",
146 | "\n",
147 | "Or真值表:\n",
148 | "\n",
149 | "|$x_1$|$x_2$|$y$|\n",
150 | "|----|----|----|\n",
151 | "|1|1|1|\n",
152 | "|1|0|1|\n",
153 | "|0|1|1|\n",
154 | "|0|0|0|"
155 | ]
156 | },
157 | {
158 | "cell_type": "code",
159 | "execution_count": 5,
160 | "metadata": {},
161 | "outputs": [],
162 | "source": [
163 | "def get_or_training_dataset():\n",
164 | " x_train = [[0, 0], [0, 1], [1, 0], [1, 1]]\n",
165 | " ## write code here:\n",
166 | " y_train = 'write code here'\n",
167 | " return x_train, y_train"
168 | ]
169 | },
170 | {
171 | "cell_type": "code",
172 | "execution_count": 6,
173 | "metadata": {},
174 | "outputs": [],
175 | "source": [
176 | "# x_train, y_train = get_or_training_dataset()\n",
177 | "# or_p = Perceptron(2)\n",
178 | "# or_p.fit(x_train, y_train, iteration=5, learning_rate=0.1)\n",
179 | "# print(x_train, y_train)"
180 | ]
181 | },
182 | {
183 | "cell_type": "code",
184 | "execution_count": 7,
185 | "metadata": {},
186 | "outputs": [],
187 | "source": [
188 | "# print('or 感知机权重:\\n', or_p, '\\n')\n",
189 | "# print('1 & 1 = %d' % or_p.predict([1, 1]))\n",
190 | "# print('1 & 0 = %d' % or_p.predict([1, 0]))\n",
191 | "# print('0 & 1 = %d' % or_p.predict([0, 1]))\n",
192 | "# print('0 & 0 = %d' % or_p.predict([0, 0]))"
193 | ]
194 | },
195 | {
196 | "cell_type": "code",
197 | "execution_count": null,
198 | "metadata": {},
199 | "outputs": [],
200 | "source": []
201 | }
202 | ],
203 | "metadata": {
204 | "kernelspec": {
205 | "display_name": "Python 3",
206 | "language": "python",
207 | "name": "python3"
208 | },
209 | "language_info": {
210 | "codemirror_mode": {
211 | "name": "ipython",
212 | "version": 3
213 | },
214 | "file_extension": ".py",
215 | "mimetype": "text/x-python",
216 | "name": "python",
217 | "nbconvert_exporter": "python",
218 | "pygments_lexer": "ipython3",
219 | "version": "3.6.4"
220 | }
221 | },
222 | "nbformat": 4,
223 | "nbformat_minor": 2
224 | }
225 |
--------------------------------------------------------------------------------
/dl3_LinearUnit.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## $$不用框架入门进阶深度学习(3)-线性单元、梯度下降与回归任务$$\n",
8 | "### 一、实现线性单元"
9 | ]
10 | },
11 | {
12 | "cell_type": "code",
13 | "execution_count": 5,
14 | "metadata": {},
15 | "outputs": [],
16 | "source": [
17 | "import numpy as np\n",
18 | "import matplotlib.pyplot as plt\n",
19 | "%matplotlib inline"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": 33,
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "class Perceptron(object):\n",
29 | " def __init__(self, input_feature_num, activation=None):\n",
30 | " self.activation = activation if activation else self.sign\n",
31 | " self.w = [0.0] * input_feature_num\n",
32 | " self.b = 0.0\n",
33 | "\n",
34 | " def predict(self, x):\n",
35 | " '''\n",
36 | " 预测输出函数:\n",
37 | " y_hat = f(wx + b)\n",
38 | " '''\n",
39 | " return self.activation(\n",
40 | " np.dot(self.w, x) + self.b)\n",
41 | " \n",
42 | " def sign(self, z):\n",
43 | " '''\n",
44 | " 阶跃激活函数:\n",
45 | " sign(z) = 1 if z > 0\n",
46 | " sign(z) = 0 if z <= 0\n",
47 | " '''\n",
48 | " return int(z>0)\n",
49 | " \n",
50 | " def fit(self, x_train, y_train, iteration=10, learning_rate=0.1):\n",
51 | " # 训练函数\n",
52 | " for _ in range(iteration):\n",
53 | " for x, y in zip(x_train, y_train):\n",
54 | " y_hat = self.predict(x)\n",
55 | " self._update_weights(x, y, y_hat, learning_rate)\n",
56 | " print(self)\n",
57 | " \n",
58 | " def _update_weights(self, x, y, y_hat, learning_rate):\n",
59 | " # 权重更新, 对照公式查看\n",
60 | " delta = y - y_hat\n",
61 | " self.w = np.add(self.w,\n",
62 | " np.multiply(learning_rate * delta, x))\n",
63 | " self.b += learning_rate * delta\n",
64 | " \n",
65 | " def __str__(self):\n",
66 | " return 'weights: {}\\tbias: {}'.format(self.w, self.b)"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": 34,
72 | "metadata": {},
73 | "outputs": [],
74 | "source": [
75 | "class LinearUnit(Perceptron):\n",
76 | " def __init__(self, input_feature_num, activation=None):\n",
77 | " self.activation = activation if activation else self.f\n",
78 | " Perceptron.__init__(self, input_feature_num, self.activation)\n",
79 | "\n",
80 | " def f(self, x):\n",
81 | " return x"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "metadata": {},
87 | "source": [
88 | "### 二、数据准备"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 74,
94 | "metadata": {},
95 | "outputs": [],
96 | "source": [
97 | "def get_training_dataset():\n",
98 | " '''\n",
99 | " 捏造5个人的工作年限与对应的收入数据\n",
100 | " '''\n",
101 | " # 输入列表,每一项表示工作年限\n",
102 | " x_train = [[5], [3], [8], [1.4], [10.1]]\n",
103 | " # 期望的输出列表,月薪,注意要与输入一一对应\n",
104 | " y_train = [55000, 23000, 76000, 18000, 114000]\n",
105 | " return x_train, y_train\n",
106 | "\n",
107 | "def get_test_dataset():\n",
108 | " '''\n",
109 | " 捏造5个人的工作年限,用模型预测结果\n",
110 | " '''\n",
111 | " # 输入列表,每一项表示工作年限\n",
112 | " x_test = [[1], [2], [4.3], [6.7], [9]]\n",
113 | " return x_test\n",
114 | " "
115 | ]
116 | },
117 | {
118 | "cell_type": "markdown",
119 | "metadata": {},
120 | "source": [
121 | "### 三、模型训练-小试调参"
122 | ]
123 | },
124 | {
125 | "cell_type": "code",
126 | "execution_count": 75,
127 | "metadata": {},
128 | "outputs": [
129 | {
130 | "name": "stdout",
131 | "output_type": "stream",
132 | "text": [
133 | "weights: [-43264.9316]\tbias: -6499.715999999998\n",
134 | "weights: [-748.21557461]\tbias: -7572.491525913667\n",
135 | "weights: [ 6269.1513987]\tbias: -7749.55269735544\n",
136 | "weights: [ 7427.36501069]\tbias: -7778.776572877447\n",
137 | "weights: [ 7618.52770407]\tbias: -7783.599961842798\n",
138 | "weights: [ 7650.07903015]\tbias: -7784.396060262173\n",
139 | "weights: [ 7655.28656389]\tbias: -7784.527455987858\n",
140 | "weights: [ 7656.14606526]\tbias: -7784.549142799826\n",
141 | "weights: [ 7656.28792561]\tbias: -7784.552722199454\n",
142 | "weights: [ 7656.31133961]\tbias: -7784.553312977943\n"
143 | ]
144 | },
145 | {
146 | "data": {
147 | "text/plain": [
148 | "[]"
149 | ]
150 | },
151 | "execution_count": 75,
152 | "metadata": {},
153 | "output_type": "execute_result"
154 | },
155 | {
156 | "data": {
157 | "image/png": "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\n",
158 | "text/plain": [
159 | ""
160 | ]
161 | },
162 | "metadata": {},
163 | "output_type": "display_data"
164 | }
165 | ],
166 | "source": [
167 | "'''\n",
168 | "学习率为0.1,收敛不到最优\n",
169 | "'''\n",
170 | "x_train, y_train = get_training_dataset()\n",
171 | "lu = LinearUnit(len(x_train[0]))\n",
172 | "lu.fit(x_train, y_train, iteration=10, learning_rate=0.1)\n",
173 | "\n",
174 | "plt.scatter(x_train, y_train)\n",
175 | "x_points = np.linspace(1, 11, 10)\n",
176 | "y_ = (lu.w[0] * x_points + lu.b)\n",
177 | "plt.plot(x_points, y_)"
178 | ]
179 | },
180 | {
181 | "cell_type": "code",
182 | "execution_count": 76,
183 | "metadata": {},
184 | "outputs": [
185 | {
186 | "name": "stdout",
187 | "output_type": "stream",
188 | "text": [
189 | "weights: [ 11240.88451468]\tbias: 1652.6044668000002\n",
190 | "weights: [ 11172.36246933]\tbias: 1548.4231937327545\n",
191 | "weights: [ 11181.77338601]\tbias: 1457.6193688248154\n",
192 | "weights: [ 11190.52576246]\tbias: 1367.958769494091\n",
193 | "weights: [ 11199.16365052]\tbias: 1279.5091539946984\n",
194 | "weights: [ 11207.68490221]\tbias: 1192.2535999327847\n",
195 | "weights: [ 11216.0911176]\tbias: 1106.1759915016578\n",
196 | "weights: [ 11224.38384951]\tbias: 1021.2604264670302\n",
197 | "weights: [ 11232.56462995]\tbias: 937.4912173015192\n",
198 | "weights: [ 11240.63497026]\tbias: 854.852888258384\n"
199 | ]
200 | },
201 | {
202 | "data": {
203 | "text/plain": [
204 | "[]"
205 | ]
206 | },
207 | "execution_count": 76,
208 | "metadata": {},
209 | "output_type": "execute_result"
210 | },
211 | {
212 | "data": {
213 | "image/png": "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\n",
214 | "text/plain": [
215 | ""
216 | ]
217 | },
218 | "metadata": {},
219 | "output_type": "display_data"
220 | }
221 | ],
222 | "source": [
223 | "'''\n",
224 | "学习率为0.01,收敛效果远远好于学习率为0.1\n",
225 | "'''\n",
226 | "lu = LinearUnit(len(x_train[0]))\n",
227 | "lu.fit(x_train, y_train, iteration=10, learning_rate=0.01)\n",
228 | "\n",
229 | "plt.scatter(x_train, y_train)\n",
230 | "x_points = np.linspace(1, 11, 10)\n",
231 | "y_ = (lu.w[0] * x_points + lu.b)\n",
232 | "plt.plot(x_points, y_)"
233 | ]
234 | },
235 | {
236 | "cell_type": "markdown",
237 | "metadata": {},
238 | "source": [
239 | "### 四、预测工资收入"
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": 77,
245 | "metadata": {},
246 | "outputs": [
247 | {
248 | "name": "stdout",
249 | "output_type": "stream",
250 | "text": [
251 | "[[1], [2], [4.3], [6.7], [9]]\n"
252 | ]
253 | }
254 | ],
255 | "source": [
256 | "x_test = get_test_dataset()\n",
257 | "print(x_test)"
258 | ]
259 | },
260 | {
261 | "cell_type": "code",
262 | "execution_count": 78,
263 | "metadata": {},
264 | "outputs": [
265 | {
266 | "name": "stdout",
267 | "output_type": "stream",
268 | "text": [
269 | "预测工作[1]年的AI工程师\t月薪12095.487858520604\n",
270 | "预测工作[2]年的AI工程师\t月薪23336.122828782827\n",
271 | "预测工作[4.3]年的AI工程师\t月薪49189.58326038593\n",
272 | "预测工作[6.7]年的AI工程师\t月薪76167.10718901527\n",
273 | "预测工作[9]年的AI工程师\t月薪102020.56762061837\n"
274 | ]
275 | }
276 | ],
277 | "source": [
278 | "prediction = []\n",
279 | "for t in x_test:\n",
280 | " prediction.append(lu.predict(t))\n",
281 | " print('预测工作{}年的AI工程师\\t月薪{}'.format(t, prediction[-1]))"
282 | ]
283 | },
284 | {
285 | "cell_type": "code",
286 | "execution_count": null,
287 | "metadata": {},
288 | "outputs": [],
289 | "source": []
290 | }
291 | ],
292 | "metadata": {
293 | "kernelspec": {
294 | "display_name": "Python 3",
295 | "language": "python",
296 | "name": "python3"
297 | },
298 | "language_info": {
299 | "codemirror_mode": {
300 | "name": "ipython",
301 | "version": 3
302 | },
303 | "file_extension": ".py",
304 | "mimetype": "text/x-python",
305 | "name": "python",
306 | "nbconvert_exporter": "python",
307 | "pygments_lexer": "ipython3",
308 | "version": "3.6.4"
309 | }
310 | },
311 | "nbformat": 4,
312 | "nbformat_minor": 2
313 | }
314 |
--------------------------------------------------------------------------------
/dl2_Perceptron_Classify.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "## $$不用框架入门进阶深度学习(2)-手写感知器做二分类$$\n",
8 | "### 一、鸢尾花数据集介绍"
9 | ]
10 | },
11 | {
12 | "cell_type": "code",
13 | "execution_count": 1,
14 | "metadata": {},
15 | "outputs": [],
16 | "source": [
17 | "import pandas as pd\n",
18 | "import numpy as np\n",
19 | "from sklearn.datasets import load_iris\n",
20 | "import matplotlib.pyplot as plt\n",
21 | "%matplotlib inline"
22 | ]
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": 2,
27 | "metadata": {},
28 | "outputs": [],
29 | "source": [
30 | "# 加载鸢尾花数据集\n",
31 | "iris = load_iris()\n",
32 | "# iris.data包含一个(150, 4)的数据,设置列名为iris.feature_names\n",
33 | "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
34 | "# iris.target为类别标签(150, 1)\n",
35 | "df['label'] = iris.target\n",
36 | "df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']"
37 | ]
38 | },
39 | {
40 | "cell_type": "code",
41 | "execution_count": 3,
42 | "metadata": {},
43 | "outputs": [
44 | {
45 | "name": "stdout",
46 | "output_type": "stream",
47 | "text": [
48 | "{'DESCR': 'Iris Plants Database\\n'\n",
49 | " '====================\\n'\n",
50 | " '\\n'\n",
51 | " 'Notes\\n'\n",
52 | " '-----\\n'\n",
53 | " 'Data Set Characteristics:\\n'\n",
54 | " ' :Number of Instances: 150 (50 in each of three classes)\\n'\n",
55 | " ' :Number of Attributes: 4 numeric, predictive attributes and the '\n",
56 | " 'class\\n'\n",
57 | " ' :Attribute Information:\\n'\n",
58 | " ' - sepal length in cm\\n'\n",
59 | " ' - sepal width in cm\\n'\n",
60 | " ' - petal length in cm\\n'\n",
61 | " ' - petal width in cm\\n'\n",
62 | " ' - class:\\n'\n",
63 | " ' - Iris-Setosa\\n'\n",
64 | " ' - Iris-Versicolour\\n'\n",
65 | " ' - Iris-Virginica\\n'\n",
66 | " ' :Summary Statistics:\\n'\n",
67 | " '\\n'\n",
68 | " ' ============== ==== ==== ======= ===== ====================\\n'\n",
69 | " ' Min Max Mean SD Class Correlation\\n'\n",
70 | " ' ============== ==== ==== ======= ===== ====================\\n'\n",
71 | " ' sepal length: 4.3 7.9 5.84 0.83 0.7826\\n'\n",
72 | " ' sepal width: 2.0 4.4 3.05 0.43 -0.4194\\n'\n",
73 | " ' petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)\\n'\n",
74 | " ' petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)\\n'\n",
75 | " ' ============== ==== ==== ======= ===== ====================\\n'\n",
76 | " '\\n'\n",
77 | " ' :Missing Attribute Values: None\\n'\n",
78 | " ' :Class Distribution: 33.3% for each of 3 classes.\\n'\n",
79 | " ' :Creator: R.A. Fisher\\n'\n",
80 | " ' :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\\n'\n",
81 | " ' :Date: July, 1988\\n'\n",
82 | " '\\n'\n",
83 | " 'This is a copy of UCI ML iris datasets.\\n'\n",
84 | " 'http://archive.ics.uci.edu/ml/datasets/Iris\\n'\n",
85 | " '\\n'\n",
86 | " 'The famous Iris database, first used by Sir R.A Fisher\\n'\n",
87 | " '\\n'\n",
88 | " 'This is perhaps the best known database to be found in the\\n'\n",
89 | " \"pattern recognition literature. Fisher's paper is a classic in the \"\n",
90 | " 'field and\\n'\n",
91 | " 'is referenced frequently to this day. (See Duda & Hart, for '\n",
92 | " 'example.) The\\n'\n",
93 | " 'data set contains 3 classes of 50 instances each, where each class '\n",
94 | " 'refers to a\\n'\n",
95 | " 'type of iris plant. One class is linearly separable from the other '\n",
96 | " '2; the\\n'\n",
97 | " 'latter are NOT linearly separable from each other.\\n'\n",
98 | " '\\n'\n",
99 | " 'References\\n'\n",
100 | " '----------\\n'\n",
101 | " ' - Fisher,R.A. \"The use of multiple measurements in taxonomic '\n",
102 | " 'problems\"\\n'\n",
103 | " ' Annual Eugenics, 7, Part II, 179-188 (1936); also in '\n",
104 | " '\"Contributions to\\n'\n",
105 | " ' Mathematical Statistics\" (John Wiley, NY, 1950).\\n'\n",
106 | " ' - Duda,R.O., & Hart,P.E. (1973) Pattern Classification and Scene '\n",
107 | " 'Analysis.\\n'\n",
108 | " ' (Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page '\n",
109 | " '218.\\n'\n",
110 | " ' - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New '\n",
111 | " 'System\\n'\n",
112 | " ' Structure and Classification Rule for Recognition in Partially '\n",
113 | " 'Exposed\\n'\n",
114 | " ' Environments\". IEEE Transactions on Pattern Analysis and '\n",
115 | " 'Machine\\n'\n",
116 | " ' Intelligence, Vol. PAMI-2, No. 1, 67-71.\\n'\n",
117 | " ' - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\". IEEE '\n",
118 | " 'Transactions\\n'\n",
119 | " ' on Information Theory, May 1972, 431-433.\\n'\n",
120 | " ' - See also: 1988 MLC Proceedings, 54-64. Cheeseman et al\"s '\n",
121 | " 'AUTOCLASS II\\n'\n",
122 | " ' conceptual clustering system finds 3 classes in the data.\\n'\n",
123 | " ' - Many, many more ...\\n',\n",
124 | " 'data': array([[ 5.1, 3.5, 1.4, 0.2],\n",
125 | " [ 4.9, 3. , 1.4, 0.2],\n",
126 | " [ 4.7, 3.2, 1.3, 0.2],\n",
127 | " [ 4.6, 3.1, 1.5, 0.2],\n",
128 | " [ 5. , 3.6, 1.4, 0.2],\n",
129 | " [ 5.4, 3.9, 1.7, 0.4],\n",
130 | " [ 4.6, 3.4, 1.4, 0.3],\n",
131 | " [ 5. , 3.4, 1.5, 0.2],\n",
132 | " [ 4.4, 2.9, 1.4, 0.2],\n",
133 | " [ 4.9, 3.1, 1.5, 0.1],\n",
134 | " [ 5.4, 3.7, 1.5, 0.2],\n",
135 | " [ 4.8, 3.4, 1.6, 0.2],\n",
136 | " [ 4.8, 3. , 1.4, 0.1],\n",
137 | " [ 4.3, 3. , 1.1, 0.1],\n",
138 | " [ 5.8, 4. , 1.2, 0.2],\n",
139 | " [ 5.7, 4.4, 1.5, 0.4],\n",
140 | " [ 5.4, 3.9, 1.3, 0.4],\n",
141 | " [ 5.1, 3.5, 1.4, 0.3],\n",
142 | " [ 5.7, 3.8, 1.7, 0.3],\n",
143 | " [ 5.1, 3.8, 1.5, 0.3],\n",
144 | " [ 5.4, 3.4, 1.7, 0.2],\n",
145 | " [ 5.1, 3.7, 1.5, 0.4],\n",
146 | " [ 4.6, 3.6, 1. , 0.2],\n",
147 | " [ 5.1, 3.3, 1.7, 0.5],\n",
148 | " [ 4.8, 3.4, 1.9, 0.2],\n",
149 | " [ 5. , 3. , 1.6, 0.2],\n",
150 | " [ 5. , 3.4, 1.6, 0.4],\n",
151 | " [ 5.2, 3.5, 1.5, 0.2],\n",
152 | " [ 5.2, 3.4, 1.4, 0.2],\n",
153 | " [ 4.7, 3.2, 1.6, 0.2],\n",
154 | " [ 4.8, 3.1, 1.6, 0.2],\n",
155 | " [ 5.4, 3.4, 1.5, 0.4],\n",
156 | " [ 5.2, 4.1, 1.5, 0.1],\n",
157 | " [ 5.5, 4.2, 1.4, 0.2],\n",
158 | " [ 4.9, 3.1, 1.5, 0.1],\n",
159 | " [ 5. , 3.2, 1.2, 0.2],\n",
160 | " [ 5.5, 3.5, 1.3, 0.2],\n",
161 | " [ 4.9, 3.1, 1.5, 0.1],\n",
162 | " [ 4.4, 3. , 1.3, 0.2],\n",
163 | " [ 5.1, 3.4, 1.5, 0.2],\n",
164 | " [ 5. , 3.5, 1.3, 0.3],\n",
165 | " [ 4.5, 2.3, 1.3, 0.3],\n",
166 | " [ 4.4, 3.2, 1.3, 0.2],\n",
167 | " [ 5. , 3.5, 1.6, 0.6],\n",
168 | " [ 5.1, 3.8, 1.9, 0.4],\n",
169 | " [ 4.8, 3. , 1.4, 0.3],\n",
170 | " [ 5.1, 3.8, 1.6, 0.2],\n",
171 | " [ 4.6, 3.2, 1.4, 0.2],\n",
172 | " [ 5.3, 3.7, 1.5, 0.2],\n",
173 | " [ 5. , 3.3, 1.4, 0.2],\n",
174 | " [ 7. , 3.2, 4.7, 1.4],\n",
175 | " [ 6.4, 3.2, 4.5, 1.5],\n",
176 | " [ 6.9, 3.1, 4.9, 1.5],\n",
177 | " [ 5.5, 2.3, 4. , 1.3],\n",
178 | " [ 6.5, 2.8, 4.6, 1.5],\n",
179 | " [ 5.7, 2.8, 4.5, 1.3],\n",
180 | " [ 6.3, 3.3, 4.7, 1.6],\n",
181 | " [ 4.9, 2.4, 3.3, 1. ],\n",
182 | " [ 6.6, 2.9, 4.6, 1.3],\n",
183 | " [ 5.2, 2.7, 3.9, 1.4],\n",
184 | " [ 5. , 2. , 3.5, 1. ],\n",
185 | " [ 5.9, 3. , 4.2, 1.5],\n",
186 | " [ 6. , 2.2, 4. , 1. ],\n",
187 | " [ 6.1, 2.9, 4.7, 1.4],\n",
188 | " [ 5.6, 2.9, 3.6, 1.3],\n",
189 | " [ 6.7, 3.1, 4.4, 1.4],\n",
190 | " [ 5.6, 3. , 4.5, 1.5],\n",
191 | " [ 5.8, 2.7, 4.1, 1. ],\n",
192 | " [ 6.2, 2.2, 4.5, 1.5],\n",
193 | " [ 5.6, 2.5, 3.9, 1.1],\n",
194 | " [ 5.9, 3.2, 4.8, 1.8],\n",
195 | " [ 6.1, 2.8, 4. , 1.3],\n",
196 | " [ 6.3, 2.5, 4.9, 1.5],\n",
197 | " [ 6.1, 2.8, 4.7, 1.2],\n",
198 | " [ 6.4, 2.9, 4.3, 1.3],\n",
199 | " [ 6.6, 3. , 4.4, 1.4],\n",
200 | " [ 6.8, 2.8, 4.8, 1.4],\n",
201 | " [ 6.7, 3. , 5. , 1.7],\n",
202 | " [ 6. , 2.9, 4.5, 1.5],\n",
203 | " [ 5.7, 2.6, 3.5, 1. ],\n",
204 | " [ 5.5, 2.4, 3.8, 1.1],\n",
205 | " [ 5.5, 2.4, 3.7, 1. ],\n",
206 | " [ 5.8, 2.7, 3.9, 1.2],\n",
207 | " [ 6. , 2.7, 5.1, 1.6],\n",
208 | " [ 5.4, 3. , 4.5, 1.5],\n",
209 | " [ 6. , 3.4, 4.5, 1.6],\n",
210 | " [ 6.7, 3.1, 4.7, 1.5],\n",
211 | " [ 6.3, 2.3, 4.4, 1.3],\n",
212 | " [ 5.6, 3. , 4.1, 1.3],\n",
213 | " [ 5.5, 2.5, 4. , 1.3],\n",
214 | " [ 5.5, 2.6, 4.4, 1.2],\n",
215 | " [ 6.1, 3. , 4.6, 1.4],\n",
216 | " [ 5.8, 2.6, 4. , 1.2],\n",
217 | " [ 5. , 2.3, 3.3, 1. ],\n",
218 | " [ 5.6, 2.7, 4.2, 1.3],\n",
219 | " [ 5.7, 3. , 4.2, 1.2],\n",
220 | " [ 5.7, 2.9, 4.2, 1.3],\n",
221 | " [ 6.2, 2.9, 4.3, 1.3],\n",
222 | " [ 5.1, 2.5, 3. , 1.1],\n",
223 | " [ 5.7, 2.8, 4.1, 1.3],\n",
224 | " [ 6.3, 3.3, 6. , 2.5],\n",
225 | " [ 5.8, 2.7, 5.1, 1.9],\n",
226 | " [ 7.1, 3. , 5.9, 2.1],\n",
227 | " [ 6.3, 2.9, 5.6, 1.8],\n",
228 | " [ 6.5, 3. , 5.8, 2.2],\n",
229 | " [ 7.6, 3. , 6.6, 2.1],\n",
230 | " [ 4.9, 2.5, 4.5, 1.7],\n",
231 | " [ 7.3, 2.9, 6.3, 1.8],\n",
232 | " [ 6.7, 2.5, 5.8, 1.8],\n",
233 | " [ 7.2, 3.6, 6.1, 2.5],\n",
234 | " [ 6.5, 3.2, 5.1, 2. ],\n",
235 | " [ 6.4, 2.7, 5.3, 1.9],\n",
236 | " [ 6.8, 3. , 5.5, 2.1],\n",
237 | " [ 5.7, 2.5, 5. , 2. ],\n",
238 | " [ 5.8, 2.8, 5.1, 2.4],\n",
239 | " [ 6.4, 3.2, 5.3, 2.3],\n",
240 | " [ 6.5, 3. , 5.5, 1.8],\n",
241 | " [ 7.7, 3.8, 6.7, 2.2],\n",
242 | " [ 7.7, 2.6, 6.9, 2.3],\n",
243 | " [ 6. , 2.2, 5. , 1.5],\n",
244 | " [ 6.9, 3.2, 5.7, 2.3],\n",
245 | " [ 5.6, 2.8, 4.9, 2. ],\n",
246 | " [ 7.7, 2.8, 6.7, 2. ],\n",
247 | " [ 6.3, 2.7, 4.9, 1.8],\n",
248 | " [ 6.7, 3.3, 5.7, 2.1],\n",
249 | " [ 7.2, 3.2, 6. , 1.8],\n",
250 | " [ 6.2, 2.8, 4.8, 1.8],\n",
251 | " [ 6.1, 3. , 4.9, 1.8],\n",
252 | " [ 6.4, 2.8, 5.6, 2.1],\n",
253 | " [ 7.2, 3. , 5.8, 1.6],\n",
254 | " [ 7.4, 2.8, 6.1, 1.9],\n",
255 | " [ 7.9, 3.8, 6.4, 2. ],\n",
256 | " [ 6.4, 2.8, 5.6, 2.2],\n",
257 | " [ 6.3, 2.8, 5.1, 1.5],\n",
258 | " [ 6.1, 2.6, 5.6, 1.4],\n",
259 | " [ 7.7, 3. , 6.1, 2.3],\n",
260 | " [ 6.3, 3.4, 5.6, 2.4],\n",
261 | " [ 6.4, 3.1, 5.5, 1.8],\n",
262 | " [ 6. , 3. , 4.8, 1.8],\n",
263 | " [ 6.9, 3.1, 5.4, 2.1],\n",
264 | " [ 6.7, 3.1, 5.6, 2.4],\n",
265 | " [ 6.9, 3.1, 5.1, 2.3],\n",
266 | " [ 5.8, 2.7, 5.1, 1.9],\n",
267 | " [ 6.8, 3.2, 5.9, 2.3],\n",
268 | " [ 6.7, 3.3, 5.7, 2.5],\n",
269 | " [ 6.7, 3. , 5.2, 2.3],\n",
270 | " [ 6.3, 2.5, 5. , 1.9],\n",
271 | " [ 6.5, 3. , 5.2, 2. ],\n",
272 | " [ 6.2, 3.4, 5.4, 2.3],\n",
273 | " [ 5.9, 3. , 5.1, 1.8]]),\n",
274 | " 'feature_names': ['sepal length (cm)',\n",
275 | " 'sepal width (cm)',\n",
276 | " 'petal length (cm)',\n",
277 | " 'petal width (cm)'],\n",
278 | " 'target': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
279 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
280 | " 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
281 | " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
282 | " 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
283 | " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
284 | " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]),\n",
285 | " 'target_names': array(['setosa', 'versicolor', 'virginica'],\n",
286 | " dtype='\n",
315 | "\n",
328 | "\n",
329 | " \n",
330 | " \n",
331 | " | \n",
332 | " sepal length | \n",
333 | " sepal width | \n",
334 | " petal length | \n",
335 | " petal width | \n",
336 | " label | \n",
337 | "
\n",
338 | " \n",
339 | " \n",
340 | " \n",
341 | " | 0 | \n",
342 | " 5.1 | \n",
343 | " 3.5 | \n",
344 | " 1.4 | \n",
345 | " 0.2 | \n",
346 | " 0 | \n",
347 | "
\n",
348 | " \n",
349 | " | 1 | \n",
350 | " 4.9 | \n",
351 | " 3.0 | \n",
352 | " 1.4 | \n",
353 | " 0.2 | \n",
354 | " 0 | \n",
355 | "
\n",
356 | " \n",
357 | " | 2 | \n",
358 | " 4.7 | \n",
359 | " 3.2 | \n",
360 | " 1.3 | \n",
361 | " 0.2 | \n",
362 | " 0 | \n",
363 | "
\n",
364 | " \n",
365 | " | 3 | \n",
366 | " 4.6 | \n",
367 | " 3.1 | \n",
368 | " 1.5 | \n",
369 | " 0.2 | \n",
370 | " 0 | \n",
371 | "
\n",
372 | " \n",
373 | " | 4 | \n",
374 | " 5.0 | \n",
375 | " 3.6 | \n",
376 | " 1.4 | \n",
377 | " 0.2 | \n",
378 | " 0 | \n",
379 | "
\n",
380 | " \n",
381 | "
\n",
382 | ""
383 | ],
384 | "text/plain": [
385 | " sepal length sepal width petal length petal width label\n",
386 | "0 5.1 3.5 1.4 0.2 0\n",
387 | "1 4.9 3.0 1.4 0.2 0\n",
388 | "2 4.7 3.2 1.3 0.2 0\n",
389 | "3 4.6 3.1 1.5 0.2 0\n",
390 | "4 5.0 3.6 1.4 0.2 0"
391 | ]
392 | },
393 | "execution_count": 4,
394 | "metadata": {},
395 | "output_type": "execute_result"
396 | }
397 | ],
398 | "source": [
399 | "# 数据集查看\n",
400 | "print(df.label.value_counts())\n",
401 | "df.head()"
402 | ]
403 | },
404 | {
405 | "cell_type": "markdown",
406 | "metadata": {},
407 | "source": [
408 | "### 二、特征选择"
409 | ]
410 | },
411 | {
412 | "cell_type": "code",
413 | "execution_count": 5,
414 | "metadata": {},
415 | "outputs": [
416 | {
417 | "data": {
418 | "text/plain": [
419 | ""
420 | ]
421 | },
422 | "execution_count": 5,
423 | "metadata": {},
424 | "output_type": "execute_result"
425 | },
426 | {
427 | "data": {
428 | "image/png": "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\n",
429 | "text/plain": [
430 | ""
431 | ]
432 | },
433 | "metadata": {},
434 | "output_type": "display_data"
435 | }
436 | ],
437 | "source": [
438 | "# 萼片组['sepal length','sepal width']特征分布查看\n",
439 | "plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')\n",
440 | "plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')\n",
441 | "\n",
442 | "plt.xlabel('sepal length')\n",
443 | "plt.ylabel('sepal width')\n",
444 | "plt.legend()"
445 | ]
446 | },
447 | {
448 | "cell_type": "markdown",
449 | "metadata": {},
450 | "source": [
451 | "### 三、Perceptron-用感知器完成二分类"
452 | ]
453 | },
454 | {
455 | "cell_type": "markdown",
456 | "metadata": {},
457 | "source": [
458 | "\n",
459 | "权重更新规则:\n",
460 | "$$\n",
461 | "\\begin{equation}\n",
462 | "\\begin{aligned}\n",
463 | "\\Delta b_i&=\\delta (y- \\widehat{y}) \\\\\n",
464 | "\\Delta w_i&=\\delta (y- \\widehat{y})x_i \\\\\n",
465 | "w_i&=w_i + \\Delta w_i\\\\\n",
466 | "b_i&=b_i + \\Delta b_i \n",
467 | "\\end{aligned}\n",
468 | "\\end{equation}\n",
469 | "$$\n",
470 | "\n",
471 | "其中$\\delta叫学习率$,y为正确的输出,$\\widehat{y}为感知机预测$的结果。\n",
472 | "\n",
473 | "\n"
474 | ]
475 | },
476 | {
477 | "cell_type": "code",
478 | "execution_count": 6,
479 | "metadata": {},
480 | "outputs": [],
481 | "source": [
482 | "class Perceptron(object):\n",
483 | " def __init__(self, input_feature_num, activation=None):\n",
484 | " self.activation = activation if activation else self.sign\n",
485 | " self.w = [0.0] * input_feature_num\n",
486 | " self.b = 0.0\n",
487 | "\n",
488 | " def sign(self, z):\n",
489 | " # 阶跃激活函数:\n",
490 | " # sign(z) = 1 if z > 0 \n",
491 | " # sign(z) = 0 otherwise\n",
492 | " return int(z>0)\n",
493 | " \n",
494 | " def predict(self, x):\n",
495 | " # 预测输出函数\n",
496 | " # y_hat = f(wx + b)\n",
497 | " return self.activation(\n",
498 | " np.dot(self.w, x) + self.b)\n",
499 | " \n",
500 | " def fit(self, x_train, y_train, iteration=10, learning_rate=0.1):\n",
501 | " # 训练函数\n",
502 | " for _ in range(iteration):\n",
503 | " for x, y in zip(x_train, y_train):\n",
504 | " y_hat = self.predict(x)\n",
505 | " self._update_weights(x, y, y_hat, learning_rate)\n",
506 | " print(self)\n",
507 | " \n",
508 | " def _update_weights(self, x, y, y_hat, learning_rate):\n",
509 | " # 权重更新, 对照公式查看\n",
510 | " delta = y - y_hat\n",
511 | " self.w = np.add(self.w,\n",
512 | " np.multiply(learning_rate * delta, x))\n",
513 | " self.b += learning_rate * delta\n",
514 | " \n",
515 | " def __str__(self):\n",
516 | " return 'weights: {}\\tbias: {}'.format(self.w, self.b)"
517 | ]
518 | },
519 | {
520 | "cell_type": "code",
521 | "execution_count": 7,
522 | "metadata": {},
523 | "outputs": [],
524 | "source": [
525 | "# 训练数据准备\n",
526 | "data = np.array(df.iloc[:100, [0, 1, -1]])\n",
527 | "X, y = data[:,:-1], data[:,-1]"
528 | ]
529 | },
530 | {
531 | "cell_type": "code",
532 | "execution_count": 8,
533 | "metadata": {},
534 | "outputs": [
535 | {
536 | "name": "stdout",
537 | "output_type": "stream",
538 | "text": [
539 | "weights: [ 3.87 -5.8 ]\tbias: -2.600000000000001\n"
540 | ]
541 | }
542 | ],
543 | "source": [
544 | "# 训练模型\n",
545 | "perceptron = Perceptron(input_feature_num=X.shape[1])\n",
546 | "perceptron.fit(X, y, iteration=100, learning_rate=0.1)"
547 | ]
548 | },
549 | {
550 | "cell_type": "code",
551 | "execution_count": 9,
552 | "metadata": {},
553 | "outputs": [
554 | {
555 | "data": {
556 | "text/plain": [
557 | ""
558 | ]
559 | },
560 | "execution_count": 9,
561 | "metadata": {},
562 | "output_type": "execute_result"
563 | },
564 | {
565 | "data": {
566 | "image/png": "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\n",
567 | "text/plain": [
568 | ""
569 | ]
570 | },
571 | "metadata": {},
572 | "output_type": "display_data"
573 | }
574 | ],
575 | "source": [
576 | "x_points = np.linspace(4, 7, 10)\n",
577 | "y_ = -(perceptron.w[0]*x_points + perceptron.b)/perceptron.w[1]\n",
578 | "plt.plot(x_points, y_)\n",
579 | "\n",
580 | "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
581 | "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
582 | "plt.xlabel('sepal length')\n",
583 | "plt.ylabel('sepal width')\n",
584 | "plt.legend()"
585 | ]
586 | },
587 | {
588 | "cell_type": "markdown",
589 | "metadata": {},
590 | "source": [
591 | "#### 对比sklearn"
592 | ]
593 | },
594 | {
595 | "cell_type": "code",
596 | "execution_count": 10,
597 | "metadata": {},
598 | "outputs": [
599 | {
600 | "name": "stdout",
601 | "output_type": "stream",
602 | "text": [
603 | "[[ 74.6 -127.2]] [ 0.]\n"
604 | ]
605 | }
606 | ],
607 | "source": [
608 | "from sklearn.linear_model import Perceptron as SPerceptron\n",
609 | "clf = SPerceptron(fit_intercept=False, max_iter=1000, shuffle=False)\n",
610 | "clf.fit(X, y)\n",
611 | "print(clf.coef_, clf.intercept_) # 打印权重"
612 | ]
613 | },
614 | {
615 | "cell_type": "code",
616 | "execution_count": 11,
617 | "metadata": {},
618 | "outputs": [
619 | {
620 | "data": {
621 | "text/plain": [
622 | ""
623 | ]
624 | },
625 | "execution_count": 11,
626 | "metadata": {},
627 | "output_type": "execute_result"
628 | },
629 | {
630 | "data": {
631 | "image/png": "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\n",
632 | "text/plain": [
633 | ""
634 | ]
635 | },
636 | "metadata": {},
637 | "output_type": "display_data"
638 | }
639 | ],
640 | "source": [
641 | "x_points = np.linspace(4, 7,10)\n",
642 | "y_ = -(perceptron.w[0]*x_points + perceptron.b)/perceptron.w[1]\n",
643 | "plt.plot(x_points, y_)\n",
644 | "\n",
645 | "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
646 | "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
647 | "plt.xlabel('sepal length')\n",
648 | "plt.ylabel('sepal width')\n",
649 | "plt.legend()"
650 | ]
651 | },
652 | {
653 | "cell_type": "markdown",
654 | "metadata": {},
655 | "source": [
656 | "### 四、作业:用petal组特征完成二分类(重点)"
657 | ]
658 | },
659 | {
660 | "cell_type": "code",
661 | "execution_count": 12,
662 | "metadata": {},
663 | "outputs": [
664 | {
665 | "data": {
666 | "text/plain": [
667 | ""
668 | ]
669 | },
670 | "execution_count": 12,
671 | "metadata": {},
672 | "output_type": "execute_result"
673 | },
674 | {
675 | "data": {
676 | "image/png": "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\n",
677 | "text/plain": [
678 | ""
679 | ]
680 | },
681 | "metadata": {},
682 | "output_type": "display_data"
683 | }
684 | ],
685 | "source": [
686 | "# 花瓣组['petal length','petal width']特征分布查看\n",
687 | "plt.scatter(df[:50]['petal length'], df[:50]['petal width'], label='0')\n",
688 | "plt.scatter(df[50:100]['petal length'], df[50:100]['petal width'], label='1')\n",
689 | "\n",
690 | "plt.xlabel('petal length')\n",
691 | "plt.ylabel('petal width')\n",
692 | "plt.legend()"
693 | ]
694 | },
695 | {
696 | "cell_type": "code",
697 | "execution_count": 13,
698 | "metadata": {},
699 | "outputs": [],
700 | "source": [
701 | "# 训练数据准备\n",
702 | "data = np.array(df.iloc[:100, [2, 3, -1]])\n",
703 | "X, y = data[:,:-1], data[:,-1]"
704 | ]
705 | },
706 | {
707 | "cell_type": "code",
708 | "execution_count": 14,
709 | "metadata": {},
710 | "outputs": [],
711 | "source": [
712 | "# Write Code here\n"
713 | ]
714 | },
715 | {
716 | "cell_type": "code",
717 | "execution_count": null,
718 | "metadata": {},
719 | "outputs": [],
720 | "source": []
721 | }
722 | ],
723 | "metadata": {
724 | "kernelspec": {
725 | "display_name": "Python 3",
726 | "language": "python",
727 | "name": "python3"
728 | },
729 | "language_info": {
730 | "codemirror_mode": {
731 | "name": "ipython",
732 | "version": 3
733 | },
734 | "file_extension": ".py",
735 | "mimetype": "text/x-python",
736 | "name": "python",
737 | "nbconvert_exporter": "python",
738 | "pygments_lexer": "ipython3",
739 | "version": "3.6.4"
740 | }
741 | },
742 | "nbformat": 4,
743 | "nbformat_minor": 2
744 | }
745 |
--------------------------------------------------------------------------------