├── README.md
├── 决策树
├── .ipynb_checkpoints
│ └── DescideTree-checkpoint.ipynb
├── DescideTree.ipynb
└── Image
│ └── 1.jpg
├── 支持向量机
└── Support_Vector_Machine.ipynb
├── 神经网络
├── .ipynb_checkpoints
│ └── NeuralNetwork-checkpoint.ipynb
└── NeuralNetwork.ipynb
├── 线性模型
├── .ipynb_checkpoints
│ ├── LinearRegression-checkpoint.ipynb
│ ├── LogisticRegression-checkpoint.ipynb
│ ├── untitled-checkpoint.txt
│ └── untitled1-checkpoint.txt
├── Images
│ ├── 1.jpg
│ ├── 2.jpg
│ ├── 2_01.jpg
│ ├── 2_1.jpg
│ └── 3.jpg
├── LinearRegression.ipynb
└── LogisticRegression.ipynb
└── 逻辑回归模型
├── Images
├── 1.jpg
├── 2.jpg
├── 2_01.jpg
├── 2_1.jpg
└── 3.jpg
└── LogisticRegression.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # Machine_learning_notes
2 | 机器学习笔记和算法的python代码实现,学习的课程包括Andrew Ng 和林轩田的Machine Learning的课程,以及周志华的《机器学习》和李航的《统计学习方法》等电子书。
3 | HELL
4 |
--------------------------------------------------------------------------------
/决策树/.ipynb_checkpoints/DescideTree-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "\n",
8 | "# 3 决策树(decision tree)\n",
9 | " 决策树是一种基本的分类和回归方法,决策树呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。决策树学习主要包括3个步骤:特征选择、决策树的生成和决策树的修剪。下图是一个决策树的示意图,图中圆和方框分别表示内部节点和叶节点。\n",
10 | "
\n",
11 | "

\n",
12 | "
\n",
13 | "## 3.1 决策树学习\n",
14 | " 决策树学习,假设给定训练数据集\n",
15 | "$$D={(x_1,y_1), (x_2, y_2),...,(x_n, y_n)}$$\n",
16 | "其中,$x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T为输入实例,n为特征个数,$y_i\\in {1,2,...,K}$为类标记,学习的目的是根据给定训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。\n",
17 | "## 3.2 特征选择\n"
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 32,
23 | "metadata": {},
24 | "outputs": [],
25 | "source": [
26 | "import numpy as np\n",
27 | "import pandas as pd\n",
28 | "import matplotlib.pyplot as plt\n",
29 | "%matplotlib inline\n",
30 | "from math import log"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 4,
36 | "metadata": {},
37 | "outputs": [],
38 | "source": [
39 | "def create_data():\n",
40 | " dataset = [['青绿','蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好'],\n",
41 | " ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好'],\n",
42 | " ['乌黑',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '好'],\n",
43 | " ['青绿',' 蜷缩',' 沉闷',' 清晰',' 凹陷', '硬滑', '好'],\n",
44 | " ['浅白',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '好'],\n",
45 | " ['青绿',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '好'],\n",
46 | " ['乌黑',' 稍蜷',' 浊响',' 稍糊',' 稍凹', '软粘', '好'], \n",
47 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '硬滑', '好'],\n",
48 | " ['乌黑',' 稍蜷',' 沉闷',' 稍糊',' 稍凹', '硬滑', '坏'],\n",
49 | " ['青绿',' 硬挺',' 清脆',' 清晰',' 平坦', '软粘', '坏'],\n",
50 | " ['浅白',' 硬挺',' 清脆',' 模糊',' 平坦', '硬滑', '坏'], \n",
51 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '软粘', '坏'],\n",
52 | " ['青绿',' 稍蜷',' 浊响',' 稍糊',' 凹陷', '硬滑', '坏'],\n",
53 | " ['浅白',' 稍蜷',' 沉闷',' 稍糊',' 凹陷', '硬滑', '坏'],\n",
54 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '坏'],\n",
55 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '硬滑', '坏'],\n",
56 | " ['青绿',' 蜷缩',' 沉闷',' 稍糊',' 稍凹', '硬滑', '坏']\n",
57 | " ]\n",
58 | " \n",
59 | " labels = ['色泽', '根底', '敲声', '纹理', '脐部', '触感', '好瓜']\n",
60 | " return dataset, labels\n",
61 | " "
62 | ]
63 | },
64 | {
65 | "cell_type": "code",
66 | "execution_count": null,
67 | "metadata": {},
68 | "outputs": [],
69 | "source": []
70 | },
71 | {
72 | "cell_type": "code",
73 | "execution_count": 5,
74 | "metadata": {},
75 | "outputs": [
76 | {
77 | "data": {
78 | "text/plain": [
79 | "[['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好'],\n",
80 | " ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好'],\n",
81 | " ['乌黑', ' 蜷缩', ' 浊响', ' 清晰', ' 凹陷', '硬滑', '好'],\n",
82 | " ['青绿', ' 蜷缩', ' 沉闷', ' 清晰', ' 凹陷', '硬滑', '好'],\n",
83 | " ['浅白', ' 蜷缩', ' 浊响', ' 清晰', ' 凹陷', '硬滑', '好'],\n",
84 | " ['青绿', ' 稍蜷', ' 浊响', ' 清晰', ' 稍凹', '软粘', '好'],\n",
85 | " ['乌黑', ' 稍蜷', ' 浊响', ' 稍糊', ' 稍凹', '软粘', '好'],\n",
86 | " ['乌黑', ' 稍蜷', ' 浊响', ' 清晰', ' 稍凹', '硬滑', '好'],\n",
87 | " ['乌黑', ' 稍蜷', ' 沉闷', ' 稍糊', ' 稍凹', '硬滑', '坏'],\n",
88 | " ['青绿', ' 硬挺', ' 清脆', ' 清晰', ' 平坦', '软粘', '坏'],\n",
89 | " ['浅白', ' 硬挺', ' 清脆', ' 模糊', ' 平坦', '硬滑', '坏'],\n",
90 | " ['浅白', ' 蜷缩', ' 浊响', ' 模糊', ' 平坦', '软粘', '坏'],\n",
91 | " ['青绿', ' 稍蜷', ' 浊响', ' 稍糊', ' 凹陷', '硬滑', '坏'],\n",
92 | " ['浅白', ' 稍蜷', ' 沉闷', ' 稍糊', ' 凹陷', '硬滑', '坏'],\n",
93 | " ['乌黑', ' 稍蜷', ' 浊响', ' 清晰', ' 稍凹', '软粘', '坏'],\n",
94 | " ['浅白', ' 蜷缩', ' 浊响', ' 模糊', ' 平坦', '硬滑', '坏'],\n",
95 | " ['青绿', ' 蜷缩', ' 沉闷', ' 稍糊', ' 稍凹', '硬滑', '坏']]"
96 | ]
97 | },
98 | "execution_count": 5,
99 | "metadata": {},
100 | "output_type": "execute_result"
101 | }
102 | ],
103 | "source": [
104 | "train_data, labels = create_data()\n",
105 | "train_data"
106 | ]
107 | },
108 | {
109 | "cell_type": "code",
110 | "execution_count": 6,
111 | "metadata": {},
112 | "outputs": [
113 | {
114 | "data": {
115 | "text/plain": [
116 | "17"
117 | ]
118 | },
119 | "execution_count": 6,
120 | "metadata": {},
121 | "output_type": "execute_result"
122 | }
123 | ],
124 | "source": [
125 | "len(train_data)\n"
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "execution_count": null,
131 | "metadata": {},
132 | "outputs": [],
133 | "source": []
134 | },
135 | {
136 | "cell_type": "code",
137 | "execution_count": 7,
138 | "metadata": {},
139 | "outputs": [],
140 | "source": [
141 | "# 计算熵\n",
142 | "def ent_calc(dataset):\n",
143 | " length = len(dataset)\n",
144 | " label_count = {}\n",
145 | " for i in range(length):\n",
146 | " label = dataset[i][-1]\n",
147 | " if label not in label_count:\n",
148 | " label_count[label] = 0\n",
149 | " label_count[label] += 1\n",
150 | " ent = -sum([pk/length*np.log2(pk/length) for pk in label_count.values()])\n",
151 | " return ent\n",
152 | "\n",
153 | "# 计算经验熵\n",
154 | "def ent_resid(dataset, axis=0):\n",
155 | " length = len(dataset)\n",
156 | " feature_set = {}\n",
157 | " for i in range(length):\n",
158 | " f = dataset[i][axis]\n",
159 | " if f not in feature_set:\n",
160 | " feature_set[f] = []\n",
161 | " feature_set[f].append(dataset[i])\n",
162 | "# for p in feature_set.values():\n",
163 | "# print(p)\n",
164 | "# print('\\n\\n')\n",
165 | "# print(ent_calc(p))\n",
166 | "\n",
167 | " ent = sum([len(p)/length*ent_calc(p)for p in feature_set.values()])\n",
168 | " return ent\n",
169 | "\n",
170 | "def info_gain(ent_calc, ent_resid):\n",
171 | " return ent_calc-ent_resid\n",
172 | "\n",
173 | "def info_gain_train(dataset):\n",
174 | " columns = len(dataset[0])-1\n",
175 | " ent = ent_calc(dataset)\n",
176 | " best_feature = []\n",
177 | " for i in range(columns):\n",
178 | " cond_ent = ent_resid(dataset, axis=i)\n",
179 | " gain = info_gain(ent, cond_ent)\n",
180 | " best_feature.append((labels[i], gain))\n",
181 | " print(best_feature)\n",
182 | " best_ = max(best_feature, key = lambda x: x[-1])\n",
183 | " return best_"
184 | ]
185 | },
186 | {
187 | "cell_type": "code",
188 | "execution_count": 8,
189 | "metadata": {},
190 | "outputs": [
191 | {
192 | "data": {
193 | "text/plain": [
194 | "0.99750254636911528"
195 | ]
196 | },
197 | "execution_count": 8,
198 | "metadata": {},
199 | "output_type": "execute_result"
200 | }
201 | ],
202 | "source": [
203 | "ent_calc(train_data)"
204 | ]
205 | },
206 | {
207 | "cell_type": "code",
208 | "execution_count": 9,
209 | "metadata": {},
210 | "outputs": [
211 | {
212 | "data": {
213 | "text/plain": [
214 | "0.88937738110374998"
215 | ]
216 | },
217 | "execution_count": 9,
218 | "metadata": {},
219 | "output_type": "execute_result"
220 | }
221 | ],
222 | "source": [
223 | "ent_resid(train_data)"
224 | ]
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": 10,
229 | "metadata": {},
230 | "outputs": [
231 | {
232 | "name": "stdout",
233 | "output_type": "stream",
234 | "text": [
235 | "[('色泽', 0.10812516526536531), ('根底', 0.23887919623736464), ('敲声', 0.28192625011143702), ('纹理', 0.42976816669833717), ('脐部', 0.3589876656471539), ('触感', 0.0060464891765655837)]\n"
236 | ]
237 | },
238 | {
239 | "data": {
240 | "text/plain": [
241 | "('纹理', 0.42976816669833717)"
242 | ]
243 | },
244 | "execution_count": 10,
245 | "metadata": {},
246 | "output_type": "execute_result"
247 | }
248 | ],
249 | "source": [
250 | "info_gain_train(train_data)"
251 | ]
252 | },
253 | {
254 | "cell_type": "code",
255 | "execution_count": 11,
256 | "metadata": {},
257 | "outputs": [],
258 | "source": [
259 | "class Node:\n",
260 | " def __init__(self, root=True, label=None, feature_name=None, feature=None):\n",
261 | " self.root = root\n",
262 | " self.label = label\n",
263 | " self.feature_name = feature_name \n",
264 | " self.feature = feature\n",
265 | " self.tree = {}\n",
266 | " self.result = {'label':self.label, 'feature':self.feature, 'tree':self.tree}\n",
267 | " def add_node(self, val, node):\n",
268 | " self.tree[val] = node\n",
269 | " \n",
270 | " def predict(self, features):\n",
271 | " if self.root is True:\n",
272 | " return self.label\n",
273 | " return self.tree[features[self.feature]].predict(features)"
274 | ]
275 | },
276 | {
277 | "cell_type": "code",
278 | "execution_count": 24,
279 | "metadata": {},
280 | "outputs": [],
281 | "source": [
282 | "class DecisionTree:\n",
283 | " def __init__(self, epsilon=0.1):\n",
284 | " self.epsilon = epsilon\n",
285 | " self._tree = {}\n",
286 | " \n",
287 | "# 计算熵\n",
288 | " def ent_calc(self,dataset):\n",
289 | " length = len(dataset)\n",
290 | " label_count = {}\n",
291 | " for i in range(length):\n",
292 | " label = dataset[i][-1]\n",
293 | " if label not in label_count:\n",
294 | " label_count[label] = 0\n",
295 | " label_count[label] += 1\n",
296 | " ent = -sum([pk/length*np.log2(pk/length) for pk in label_count.values()])\n",
297 | " return ent\n",
298 | "\n",
299 | "# 计算经验熵\n",
300 | " def ent_resid(self,dataset, axis=0):\n",
301 | " length = len(dataset)\n",
302 | " feature_set = {}\n",
303 | " for i in range(length):\n",
304 | " f = dataset[i][axis]\n",
305 | " if f not in feature_set:\n",
306 | " feature_set[f] = []\n",
307 | " feature_set[f].append(dataset[i])\n",
308 | " ent = sum([len(p)/length*ent_calc(p)for p in feature_set.values()])\n",
309 | " return ent\n",
310 | "\n",
311 | "# 信息增益\n",
312 | " def info_gain(self, ent_calc, ent_resid):\n",
313 | " return ent_calc-ent_resid\n",
314 | "\n",
315 | "# \n",
316 | " def info_gain_train(self, dataset):\n",
317 | " columns = len(dataset[0])-1\n",
318 | " ent = ent_calc(dataset)\n",
319 | " best_feature = []\n",
320 | " for i in range(columns):\n",
321 | " cond_ent = ent_resid(dataset, axis=i)\n",
322 | " gain = info_gain(ent, cond_ent)\n",
323 | " best_feature.append((i, gain))\n",
324 | " print(best_feature)\n",
325 | " best_ = max(best_feature, key = lambda x: x[-1])\n",
326 | " return best_\n",
327 | "# \n",
328 | " def train(self, train_data):\n",
329 | " _, y_train, features = train_data.iloc[:, :-1], train_data.iloc[:, -1], train_data.columns[:-1]\n",
330 | " \n",
331 | " if len(y_train.value_counts()) == 1:\n",
332 | " return Node(root=True, label=y_train.iloc[0])\n",
333 | " \n",
334 | " if len(features) == 0:\n",
335 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
336 | " # 计算最大信息增益,\n",
337 | " max_feature, max_info_gain = self.info_gain_train(train_data.as_matrix())\n",
338 | " max_feature_name = features[max_feature]\n",
339 | " \n",
340 | " # 4.Ag的信息增益小于阈值\n",
341 | " if max_info_gain < self.epsilon:\n",
342 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
343 | " \n",
344 | " # 5. 构建Ag子集\n",
345 | " node_tree = Node(root=False, feature_name=max_feature_name, feature=max_feature)\n",
346 | " \n",
347 | " feature_list = train_data[max_feature_name].value_counts().index\n",
348 | " for f in feature_list:\n",
349 | " sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)\n",
350 | " \n",
351 | " sub_tree = self.train(sub_train_df)\n",
352 | " node_tree.add_node(f, sub_tree)\n",
353 | " return node_tree\n",
354 | " def fit(self, train_data):\n",
355 | " self._tree = self.train(train_data)\n",
356 | " return self._tree\n",
357 | " \n",
358 | " def predict(self, x_test):\n",
359 | " return self._tree.predict(x_test)\n",
360 | " \n",
361 | " \n",
362 | " \n",
363 | " "
364 | ]
365 | },
366 | {
367 | "cell_type": "code",
368 | "execution_count": 25,
369 | "metadata": {},
370 | "outputs": [],
371 | "source": [
372 | "datasets, labels = create_data()\n",
373 | "datasets = pd.DataFrame(datasets, columns=labels)"
374 | ]
375 | },
376 | {
377 | "cell_type": "code",
378 | "execution_count": 27,
379 | "metadata": {},
380 | "outputs": [
381 | {
382 | "name": "stdout",
383 | "output_type": "stream",
384 | "text": [
385 | "[(0, 0.10812516526536531), (1, 0.23887919623736464), (2, 0.28192625011143702), (3, 0.42976816669833717), (4, 0.3589876656471539), (5, 0.0060464891765655837)]\n",
386 | "[(0, 0.0760098536627829), (1, 0.46956521111470695), (2, 0.34745764364708642), (3, 0.46956521111470695), (4, 0.46956521111470695)]\n",
387 | "[(0, 0.25162916738782293), (1, 0.0), (2, 0.0), (3, 0.25162916738782293)]\n",
388 | "[(0, 0.0), (1, 0.0), (2, 1.0)]\n",
389 | "[(0, 0.32192809488736229), (1, 0.072905595320056027), (2, 0.32192809488736229), (3, 0.17095059445466865), (4, 0.72192809488736231)]\n"
390 | ]
391 | }
392 | ],
393 | "source": [
394 | "dt = DecisionTree()\n",
395 | "tree = dt.fit(datasets)"
396 | ]
397 | },
398 | {
399 | "cell_type": "code",
400 | "execution_count": 29,
401 | "metadata": {},
402 | "outputs": [
403 | {
404 | "name": "stdout",
405 | "output_type": "stream",
406 | "text": [
407 | "<__main__.Node object at 0x000001C078DECB00>\n"
408 | ]
409 | }
410 | ],
411 | "source": [
412 | "print(tree)"
413 | ]
414 | },
415 | {
416 | "cell_type": "code",
417 | "execution_count": 33,
418 | "metadata": {},
419 | "outputs": [],
420 | "source": [
421 | "# 定义节点类 二叉树\n",
422 | "class Node:\n",
423 | " def __init__(self, root=True, label=None, feature_name=None, feature=None):\n",
424 | " self.root = root\n",
425 | " self.label = label\n",
426 | " self.feature_name = feature_name\n",
427 | " self.feature = feature\n",
428 | " self.tree = {}\n",
429 | " self.result = {'label:': self.label, 'feature': self.feature, 'tree': self.tree}\n",
430 | "\n",
431 | " def __repr__(self):\n",
432 | " return '{}'.format(self.result)\n",
433 | "\n",
434 | " def add_node(self, val, node):\n",
435 | " self.tree[val] = node\n",
436 | "\n",
437 | " def predict(self, features):\n",
438 | " if self.root is True:\n",
439 | " return self.label\n",
440 | " return self.tree[features[self.feature]].predict(features)\n",
441 | " \n",
442 | "class DTree:\n",
443 | " def __init__(self, epsilon=0.1):\n",
444 | " self.epsilon = epsilon\n",
445 | " self._tree = {}\n",
446 | "\n",
447 | " # 熵\n",
448 | " @staticmethod\n",
449 | " def calc_ent(datasets):\n",
450 | " data_length = len(datasets)\n",
451 | " label_count = {}\n",
452 | " for i in range(data_length):\n",
453 | " label = datasets[i][-1]\n",
454 | " if label not in label_count:\n",
455 | " label_count[label] = 0\n",
456 | " label_count[label] += 1\n",
457 | " ent = -sum([(p/data_length)*log(p/data_length, 2) for p in label_count.values()])\n",
458 | " return ent\n",
459 | "\n",
460 | " # 经验条件熵\n",
461 | " def cond_ent(self, datasets, axis=0):\n",
462 | " data_length = len(datasets)\n",
463 | " feature_sets = {}\n",
464 | " for i in range(data_length):\n",
465 | " feature = datasets[i][axis]\n",
466 | " if feature not in feature_sets:\n",
467 | " feature_sets[feature] = []\n",
468 | " feature_sets[feature].append(datasets[i])\n",
469 | " cond_ent = sum([(len(p)/data_length)*self.calc_ent(p) for p in feature_sets.values()])\n",
470 | " return cond_ent\n",
471 | "\n",
472 | " # 信息增益\n",
473 | " @staticmethod\n",
474 | " def info_gain(ent, cond_ent):\n",
475 | " return ent - cond_ent\n",
476 | "\n",
477 | " def info_gain_train(self, datasets):\n",
478 | " count = len(datasets[0]) - 1\n",
479 | " ent = self.calc_ent(datasets)\n",
480 | " best_feature = []\n",
481 | " for c in range(count):\n",
482 | " c_info_gain = self.info_gain(ent, self.cond_ent(datasets, axis=c))\n",
483 | " best_feature.append((c, c_info_gain))\n",
484 | " # 比较大小\n",
485 | " best_ = max(best_feature, key=lambda x: x[-1])\n",
486 | " return best_\n",
487 | "\n",
488 | " def train(self, train_data):\n",
489 | " \"\"\"\n",
490 | " input:数据集D(DataFrame格式),特征集A,阈值eta\n",
491 | " output:决策树T\n",
492 | " \"\"\"\n",
493 | " _, y_train, features = train_data.iloc[:, :-1], train_data.iloc[:, -1], train_data.columns[:-1]\n",
494 | " # 1,若D中实例属于同一类Ck,则T为单节点树,并将类Ck作为结点的类标记,返回T\n",
495 | " if len(y_train.value_counts()) == 1:\n",
496 | " return Node(root=True,\n",
497 | " label=y_train.iloc[0])\n",
498 | "\n",
499 | " # 2, 若A为空,则T为单节点树,将D中实例树最大的类Ck作为该节点的类标记,返回T\n",
500 | " if len(features) == 0:\n",
501 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
502 | "\n",
503 | " # 3,计算最大信息增益 同5.1,Ag为信息增益最大的特征\n",
504 | " max_feature, max_info_gain = self.info_gain_train(np.array(train_data))\n",
505 | " max_feature_name = features[max_feature]\n",
506 | "\n",
507 | " # 4,Ag的信息增益小于阈值eta,则置T为单节点树,并将D中是实例数最大的类Ck作为该节点的类标记,返回T\n",
508 | " if max_info_gain < self.epsilon:\n",
509 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
510 | "\n",
511 | " # 5,构建Ag子集\n",
512 | " node_tree = Node(root=False, feature_name=max_feature_name, feature=max_feature)\n",
513 | "\n",
514 | " feature_list = train_data[max_feature_name].value_counts().index\n",
515 | " for f in feature_list:\n",
516 | " sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)\n",
517 | "\n",
518 | " # 6, 递归生成树\n",
519 | " sub_tree = self.train(sub_train_df)\n",
520 | " node_tree.add_node(f, sub_tree)\n",
521 | "\n",
522 | " # pprint.pprint(node_tree.tree)\n",
523 | " return node_tree\n",
524 | "\n",
525 | " def fit(self, train_data):\n",
526 | " self._tree = self.train(train_data)\n",
527 | " return self._tree\n",
528 | "\n",
529 | " def predict(self, X_test):\n",
530 | " return self._tree.predict(X_test)"
531 | ]
532 | },
533 | {
534 | "cell_type": "code",
535 | "execution_count": 34,
536 | "metadata": {},
537 | "outputs": [],
538 | "source": [
539 | "def create_():\n",
540 | " dataset = [ ['青绿','蜷缩', '浊响', '清晰', '凹陷', '硬滑', '1'],\n",
541 | " ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '1'],\n",
542 | " ['乌黑',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '1'],\n",
543 | " ['青绿',' 蜷缩',' 沉闷',' 清晰',' 凹陷', '硬滑', '1'],\n",
544 | " ['浅白',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '1'],\n",
545 | " ['青绿',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '1'],\n",
546 | " ['乌黑',' 稍蜷',' 浊响',' 稍糊',' 稍凹', '软粘', '1'], \n",
547 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '硬滑', '1'],\n",
548 | " ['乌黑',' 稍蜷',' 沉闷',' 稍糊',' 稍凹', '硬滑', '0'],\n",
549 | " ['青绿',' 硬挺',' 清脆',' 清晰',' 平坦', '软粘', '0'],\n",
550 | " ['浅白',' 硬挺',' 清脆',' 模糊',' 平坦', '硬滑', '0'], \n",
551 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '软粘', '0'],\n",
552 | " ['青绿',' 稍蜷',' 浊响',' 稍糊',' 凹陷', '硬滑', '0'],\n",
553 | " ['浅白',' 稍蜷',' 沉闷',' 稍糊',' 凹陷', '硬滑', '0'],\n",
554 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '0'],\n",
555 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '硬滑', '0'],\n",
556 | " ['青绿',' 蜷缩',' 沉闷',' 稍糊',' 稍凹', '硬滑', '0']\n",
557 | " ]\n",
558 | " \n",
559 | " labels = ['色泽', '根底', '敲声', '纹理', '脐部', '触感', '好瓜']\n",
560 | " return pd.DataFrame(dataset, columns=labels)\n",
561 | " "
562 | ]
563 | },
564 | {
565 | "cell_type": "code",
566 | "execution_count": 35,
567 | "metadata": {},
568 | "outputs": [],
569 | "source": [
570 | "\n",
571 | "datasets, labels = create_data()\n",
572 | "data_df = pd.DataFrame(datasets, columns=labels)\n",
573 | "dt = DTree()\n",
574 | "tree = dt.fit(data_df)"
575 | ]
576 | },
577 | {
578 | "cell_type": "code",
579 | "execution_count": 36,
580 | "metadata": {},
581 | "outputs": [
582 | {
583 | "data": {
584 | "text/plain": [
585 | "{'label:': None, 'feature': 3, 'tree': {' 清晰': {'label:': None, 'feature': 1, 'tree': {' 蜷缩': {'label:': '好', 'feature': None, 'tree': {}}, ' 稍蜷': {'label:': None, 'feature': 0, 'tree': {'乌黑': {'label:': None, 'feature': 2, 'tree': {'硬滑': {'label:': '好', 'feature': None, 'tree': {}}, '软粘': {'label:': '坏', 'feature': None, 'tree': {}}}}, '青绿': {'label:': '好', 'feature': None, 'tree': {}}}}, ' 硬挺': {'label:': '坏', 'feature': None, 'tree': {}}}}, ' 稍糊': {'label:': None, 'feature': 4, 'tree': {'硬滑': {'label:': '坏', 'feature': None, 'tree': {}}, '软粘': {'label:': '好', 'feature': None, 'tree': {}}}}, ' 模糊': {'label:': '坏', 'feature': None, 'tree': {}}, '清晰': {'label:': '好', 'feature': None, 'tree': {}}}}"
586 | ]
587 | },
588 | "execution_count": 36,
589 | "metadata": {},
590 | "output_type": "execute_result"
591 | }
592 | ],
593 | "source": [
594 | "tree"
595 | ]
596 | },
597 | {
598 | "cell_type": "code",
599 | "execution_count": null,
600 | "metadata": {},
601 | "outputs": [],
602 | "source": []
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": null,
607 | "metadata": {},
608 | "outputs": [],
609 | "source": []
610 | },
611 | {
612 | "cell_type": "code",
613 | "execution_count": null,
614 | "metadata": {},
615 | "outputs": [],
616 | "source": []
617 | },
618 | {
619 | "cell_type": "code",
620 | "execution_count": null,
621 | "metadata": {},
622 | "outputs": [],
623 | "source": []
624 | }
625 | ],
626 | "metadata": {
627 | "kernelspec": {
628 | "display_name": "Python 3",
629 | "language": "python",
630 | "name": "python3"
631 | },
632 | "language_info": {
633 | "codemirror_mode": {
634 | "name": "ipython",
635 | "version": 3
636 | },
637 | "file_extension": ".py",
638 | "mimetype": "text/x-python",
639 | "name": "python",
640 | "nbconvert_exporter": "python",
641 | "pygments_lexer": "ipython3",
642 | "version": "3.6.1"
643 | }
644 | },
645 | "nbformat": 4,
646 | "nbformat_minor": 2
647 | }
648 |
--------------------------------------------------------------------------------
/决策树/DescideTree.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "\n",
8 | "# 3 决策树(decision tree)\n",
9 | " 决策树是一种基本的分类和回归方法,决策树呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。决策树学习主要包括3个步骤:特征选择、决策树的生成和决策树的修剪。下图是一个决策树的示意图,图中圆和方框分别表示内部节点和叶节点。\n",
10 | "\n",
11 | "

\n",
12 | "
\n",
13 | "## 3.1 决策树学习\n",
14 | " 决策树学习,假设给定训练数据集\n",
15 | "$$D={(x_1,y_1), (x_2, y_2),...,(x_n, y_n)}$$\n",
16 | "其中,$x_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T为输入实例,n为特征个数,$y_i\\in {1,2,...,K}$为类标记,学习的目的是根据给定训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。\n",
17 | "## 3.2 特征选择\n"
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 32,
23 | "metadata": {},
24 | "outputs": [],
25 | "source": [
26 | "import numpy as np\n",
27 | "import pandas as pd\n",
28 | "import matplotlib.pyplot as plt\n",
29 | "%matplotlib inline\n",
30 | "from math import log"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 4,
36 | "metadata": {},
37 | "outputs": [],
38 | "source": [
39 | "def create_data():\n",
40 | " dataset = [['青绿','蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好'],\n",
41 | " ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好'],\n",
42 | " ['乌黑',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '好'],\n",
43 | " ['青绿',' 蜷缩',' 沉闷',' 清晰',' 凹陷', '硬滑', '好'],\n",
44 | " ['浅白',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '好'],\n",
45 | " ['青绿',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '好'],\n",
46 | " ['乌黑',' 稍蜷',' 浊响',' 稍糊',' 稍凹', '软粘', '好'], \n",
47 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '硬滑', '好'],\n",
48 | " ['乌黑',' 稍蜷',' 沉闷',' 稍糊',' 稍凹', '硬滑', '坏'],\n",
49 | " ['青绿',' 硬挺',' 清脆',' 清晰',' 平坦', '软粘', '坏'],\n",
50 | " ['浅白',' 硬挺',' 清脆',' 模糊',' 平坦', '硬滑', '坏'], \n",
51 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '软粘', '坏'],\n",
52 | " ['青绿',' 稍蜷',' 浊响',' 稍糊',' 凹陷', '硬滑', '坏'],\n",
53 | " ['浅白',' 稍蜷',' 沉闷',' 稍糊',' 凹陷', '硬滑', '坏'],\n",
54 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '坏'],\n",
55 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '硬滑', '坏'],\n",
56 | " ['青绿',' 蜷缩',' 沉闷',' 稍糊',' 稍凹', '硬滑', '坏']\n",
57 | " ]\n",
58 | " \n",
59 | " labels = ['色泽', '根底', '敲声', '纹理', '脐部', '触感', '好瓜']\n",
60 | " return dataset, labels\n",
61 | " "
62 | ]
63 | },
64 | {
65 | "cell_type": "code",
66 | "execution_count": null,
67 | "metadata": {},
68 | "outputs": [],
69 | "source": []
70 | },
71 | {
72 | "cell_type": "code",
73 | "execution_count": 5,
74 | "metadata": {},
75 | "outputs": [
76 | {
77 | "data": {
78 | "text/plain": [
79 | "[['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好'],\n",
80 | " ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好'],\n",
81 | " ['乌黑', ' 蜷缩', ' 浊响', ' 清晰', ' 凹陷', '硬滑', '好'],\n",
82 | " ['青绿', ' 蜷缩', ' 沉闷', ' 清晰', ' 凹陷', '硬滑', '好'],\n",
83 | " ['浅白', ' 蜷缩', ' 浊响', ' 清晰', ' 凹陷', '硬滑', '好'],\n",
84 | " ['青绿', ' 稍蜷', ' 浊响', ' 清晰', ' 稍凹', '软粘', '好'],\n",
85 | " ['乌黑', ' 稍蜷', ' 浊响', ' 稍糊', ' 稍凹', '软粘', '好'],\n",
86 | " ['乌黑', ' 稍蜷', ' 浊响', ' 清晰', ' 稍凹', '硬滑', '好'],\n",
87 | " ['乌黑', ' 稍蜷', ' 沉闷', ' 稍糊', ' 稍凹', '硬滑', '坏'],\n",
88 | " ['青绿', ' 硬挺', ' 清脆', ' 清晰', ' 平坦', '软粘', '坏'],\n",
89 | " ['浅白', ' 硬挺', ' 清脆', ' 模糊', ' 平坦', '硬滑', '坏'],\n",
90 | " ['浅白', ' 蜷缩', ' 浊响', ' 模糊', ' 平坦', '软粘', '坏'],\n",
91 | " ['青绿', ' 稍蜷', ' 浊响', ' 稍糊', ' 凹陷', '硬滑', '坏'],\n",
92 | " ['浅白', ' 稍蜷', ' 沉闷', ' 稍糊', ' 凹陷', '硬滑', '坏'],\n",
93 | " ['乌黑', ' 稍蜷', ' 浊响', ' 清晰', ' 稍凹', '软粘', '坏'],\n",
94 | " ['浅白', ' 蜷缩', ' 浊响', ' 模糊', ' 平坦', '硬滑', '坏'],\n",
95 | " ['青绿', ' 蜷缩', ' 沉闷', ' 稍糊', ' 稍凹', '硬滑', '坏']]"
96 | ]
97 | },
98 | "execution_count": 5,
99 | "metadata": {},
100 | "output_type": "execute_result"
101 | }
102 | ],
103 | "source": [
104 | "train_data, labels = create_data()\n",
105 | "train_data"
106 | ]
107 | },
108 | {
109 | "cell_type": "code",
110 | "execution_count": 6,
111 | "metadata": {},
112 | "outputs": [
113 | {
114 | "data": {
115 | "text/plain": [
116 | "17"
117 | ]
118 | },
119 | "execution_count": 6,
120 | "metadata": {},
121 | "output_type": "execute_result"
122 | }
123 | ],
124 | "source": [
125 | "len(train_data)\n"
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "execution_count": null,
131 | "metadata": {},
132 | "outputs": [],
133 | "source": []
134 | },
135 | {
136 | "cell_type": "code",
137 | "execution_count": 7,
138 | "metadata": {},
139 | "outputs": [],
140 | "source": [
141 | "# 计算熵\n",
142 | "def ent_calc(dataset):\n",
143 | " length = len(dataset)\n",
144 | " label_count = {}\n",
145 | " for i in range(length):\n",
146 | " label = dataset[i][-1]\n",
147 | " if label not in label_count:\n",
148 | " label_count[label] = 0\n",
149 | " label_count[label] += 1\n",
150 | " ent = -sum([pk/length*np.log2(pk/length) for pk in label_count.values()])\n",
151 | " return ent\n",
152 | "\n",
153 | "# 计算经验熵\n",
154 | "def ent_resid(dataset, axis=0):\n",
155 | " length = len(dataset)\n",
156 | " feature_set = {}\n",
157 | " for i in range(length):\n",
158 | " f = dataset[i][axis]\n",
159 | " if f not in feature_set:\n",
160 | " feature_set[f] = []\n",
161 | " feature_set[f].append(dataset[i])\n",
162 | "# for p in feature_set.values():\n",
163 | "# print(p)\n",
164 | "# print('\\n\\n')\n",
165 | "# print(ent_calc(p))\n",
166 | "\n",
167 | " ent = sum([len(p)/length*ent_calc(p)for p in feature_set.values()])\n",
168 | " return ent\n",
169 | "\n",
170 | "def info_gain(ent_calc, ent_resid):\n",
171 | " return ent_calc-ent_resid\n",
172 | "\n",
173 | "def info_gain_train(dataset):\n",
174 | " columns = len(dataset[0])-1\n",
175 | " ent = ent_calc(dataset)\n",
176 | " best_feature = []\n",
177 | " for i in range(columns):\n",
178 | " cond_ent = ent_resid(dataset, axis=i)\n",
179 | " gain = info_gain(ent, cond_ent)\n",
180 | " best_feature.append((labels[i], gain))\n",
181 | " print(best_feature)\n",
182 | " best_ = max(best_feature, key = lambda x: x[-1])\n",
183 | " return best_"
184 | ]
185 | },
186 | {
187 | "cell_type": "code",
188 | "execution_count": 8,
189 | "metadata": {},
190 | "outputs": [
191 | {
192 | "data": {
193 | "text/plain": [
194 | "0.99750254636911528"
195 | ]
196 | },
197 | "execution_count": 8,
198 | "metadata": {},
199 | "output_type": "execute_result"
200 | }
201 | ],
202 | "source": [
203 | "ent_calc(train_data)"
204 | ]
205 | },
206 | {
207 | "cell_type": "code",
208 | "execution_count": 9,
209 | "metadata": {},
210 | "outputs": [
211 | {
212 | "data": {
213 | "text/plain": [
214 | "0.88937738110374998"
215 | ]
216 | },
217 | "execution_count": 9,
218 | "metadata": {},
219 | "output_type": "execute_result"
220 | }
221 | ],
222 | "source": [
223 | "ent_resid(train_data)"
224 | ]
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": 10,
229 | "metadata": {},
230 | "outputs": [
231 | {
232 | "name": "stdout",
233 | "output_type": "stream",
234 | "text": [
235 | "[('色泽', 0.10812516526536531), ('根底', 0.23887919623736464), ('敲声', 0.28192625011143702), ('纹理', 0.42976816669833717), ('脐部', 0.3589876656471539), ('触感', 0.0060464891765655837)]\n"
236 | ]
237 | },
238 | {
239 | "data": {
240 | "text/plain": [
241 | "('纹理', 0.42976816669833717)"
242 | ]
243 | },
244 | "execution_count": 10,
245 | "metadata": {},
246 | "output_type": "execute_result"
247 | }
248 | ],
249 | "source": [
250 | "info_gain_train(train_data)"
251 | ]
252 | },
253 | {
254 | "cell_type": "code",
255 | "execution_count": 11,
256 | "metadata": {},
257 | "outputs": [],
258 | "source": [
259 | "class Node:\n",
260 | " def __init__(self, root=True, label=None, feature_name=None, feature=None):\n",
261 | " self.root = root\n",
262 | " self.label = label\n",
263 | " self.feature_name = feature_name \n",
264 | " self.feature = feature\n",
265 | " self.tree = {}\n",
266 | " self.result = {'label':self.label, 'feature':self.feature, 'tree':self.tree}\n",
267 | " def add_node(self, val, node):\n",
268 | " self.tree[val] = node\n",
269 | " \n",
270 | " def predict(self, features):\n",
271 | " if self.root is True:\n",
272 | " return self.label\n",
273 | " return self.tree[features[self.feature]].predict(features)"
274 | ]
275 | },
276 | {
277 | "cell_type": "code",
278 | "execution_count": 24,
279 | "metadata": {},
280 | "outputs": [],
281 | "source": [
282 | "class DecisionTree:\n",
283 | " def __init__(self, epsilon=0.1):\n",
284 | " self.epsilon = epsilon\n",
285 | " self._tree = {}\n",
286 | " \n",
287 | "# 计算熵\n",
288 | " def ent_calc(self,dataset):\n",
289 | " length = len(dataset)\n",
290 | " label_count = {}\n",
291 | " for i in range(length):\n",
292 | " label = dataset[i][-1]\n",
293 | " if label not in label_count:\n",
294 | " label_count[label] = 0\n",
295 | " label_count[label] += 1\n",
296 | " ent = -sum([pk/length*np.log2(pk/length) for pk in label_count.values()])\n",
297 | " return ent\n",
298 | "\n",
299 | "# 计算经验熵\n",
300 | " def ent_resid(self,dataset, axis=0):\n",
301 | " length = len(dataset)\n",
302 | " feature_set = {}\n",
303 | " for i in range(length):\n",
304 | " f = dataset[i][axis]\n",
305 | " if f not in feature_set:\n",
306 | " feature_set[f] = []\n",
307 | " feature_set[f].append(dataset[i])\n",
308 | " ent = sum([len(p)/length*ent_calc(p)for p in feature_set.values()])\n",
309 | " return ent\n",
310 | "\n",
311 | "# 信息增益\n",
312 | " def info_gain(self, ent_calc, ent_resid):\n",
313 | " return ent_calc-ent_resid\n",
314 | "\n",
315 | "# \n",
316 | " def info_gain_train(self, dataset):\n",
317 | " columns = len(dataset[0])-1\n",
318 | " ent = ent_calc(dataset)\n",
319 | " best_feature = []\n",
320 | " for i in range(columns):\n",
321 | " cond_ent = ent_resid(dataset, axis=i)\n",
322 | " gain = info_gain(ent, cond_ent)\n",
323 | " best_feature.append((i, gain))\n",
324 | " print(best_feature)\n",
325 | " best_ = max(best_feature, key = lambda x: x[-1])\n",
326 | " return best_\n",
327 | "# \n",
328 | " def train(self, train_data):\n",
329 | " _, y_train, features = train_data.iloc[:, :-1], train_data.iloc[:, -1], train_data.columns[:-1]\n",
330 | " \n",
331 | " if len(y_train.value_counts()) == 1:\n",
332 | " return Node(root=True, label=y_train.iloc[0])\n",
333 | " \n",
334 | " if len(features) == 0:\n",
335 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
336 | " # 计算最大信息增益,\n",
337 | " max_feature, max_info_gain = self.info_gain_train(train_data.as_matrix())\n",
338 | " max_feature_name = features[max_feature]\n",
339 | " \n",
340 | " # 4.Ag的信息增益小于阈值\n",
341 | " if max_info_gain < self.epsilon:\n",
342 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
343 | " \n",
344 | " # 5. 构建Ag子集\n",
345 | " node_tree = Node(root=False, feature_name=max_feature_name, feature=max_feature)\n",
346 | " \n",
347 | " feature_list = train_data[max_feature_name].value_counts().index\n",
348 | " for f in feature_list:\n",
349 | " sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)\n",
350 | " \n",
351 | " sub_tree = self.train(sub_train_df)\n",
352 | " node_tree.add_node(f, sub_tree)\n",
353 | " return node_tree\n",
354 | " def fit(self, train_data):\n",
355 | " self._tree = self.train(train_data)\n",
356 | " return self._tree\n",
357 | " \n",
358 | " def predict(self, x_test):\n",
359 | " return self._tree.predict(x_test)\n",
360 | " \n",
361 | " \n",
362 | " \n",
363 | " "
364 | ]
365 | },
366 | {
367 | "cell_type": "code",
368 | "execution_count": 25,
369 | "metadata": {},
370 | "outputs": [],
371 | "source": [
372 | "datasets, labels = create_data()\n",
373 | "datasets = pd.DataFrame(datasets, columns=labels)"
374 | ]
375 | },
376 | {
377 | "cell_type": "code",
378 | "execution_count": 27,
379 | "metadata": {},
380 | "outputs": [
381 | {
382 | "name": "stdout",
383 | "output_type": "stream",
384 | "text": [
385 | "[(0, 0.10812516526536531), (1, 0.23887919623736464), (2, 0.28192625011143702), (3, 0.42976816669833717), (4, 0.3589876656471539), (5, 0.0060464891765655837)]\n",
386 | "[(0, 0.0760098536627829), (1, 0.46956521111470695), (2, 0.34745764364708642), (3, 0.46956521111470695), (4, 0.46956521111470695)]\n",
387 | "[(0, 0.25162916738782293), (1, 0.0), (2, 0.0), (3, 0.25162916738782293)]\n",
388 | "[(0, 0.0), (1, 0.0), (2, 1.0)]\n",
389 | "[(0, 0.32192809488736229), (1, 0.072905595320056027), (2, 0.32192809488736229), (3, 0.17095059445466865), (4, 0.72192809488736231)]\n"
390 | ]
391 | }
392 | ],
393 | "source": [
394 | "dt = DecisionTree()\n",
395 | "tree = dt.fit(datasets)"
396 | ]
397 | },
398 | {
399 | "cell_type": "code",
400 | "execution_count": 29,
401 | "metadata": {},
402 | "outputs": [
403 | {
404 | "name": "stdout",
405 | "output_type": "stream",
406 | "text": [
407 | "<__main__.Node object at 0x000001C078DECB00>\n"
408 | ]
409 | }
410 | ],
411 | "source": [
412 | "print(tree)"
413 | ]
414 | },
415 | {
416 | "cell_type": "code",
417 | "execution_count": 33,
418 | "metadata": {},
419 | "outputs": [],
420 | "source": [
421 | "# 定义节点类 二叉树\n",
422 | "class Node:\n",
423 | " def __init__(self, root=True, label=None, feature_name=None, feature=None):\n",
424 | " self.root = root\n",
425 | " self.label = label\n",
426 | " self.feature_name = feature_name\n",
427 | " self.feature = feature\n",
428 | " self.tree = {}\n",
429 | " self.result = {'label:': self.label, 'feature': self.feature, 'tree': self.tree}\n",
430 | "\n",
431 | " def __repr__(self):\n",
432 | " return '{}'.format(self.result)\n",
433 | "\n",
434 | " def add_node(self, val, node):\n",
435 | " self.tree[val] = node\n",
436 | "\n",
437 | " def predict(self, features):\n",
438 | " if self.root is True:\n",
439 | " return self.label\n",
440 | " return self.tree[features[self.feature]].predict(features)\n",
441 | " \n",
442 | "class DTree:\n",
443 | " def __init__(self, epsilon=0.1):\n",
444 | " self.epsilon = epsilon\n",
445 | " self._tree = {}\n",
446 | "\n",
447 | " # 熵\n",
448 | " @staticmethod\n",
449 | " def calc_ent(datasets):\n",
450 | " data_length = len(datasets)\n",
451 | " label_count = {}\n",
452 | " for i in range(data_length):\n",
453 | " label = datasets[i][-1]\n",
454 | " if label not in label_count:\n",
455 | " label_count[label] = 0\n",
456 | " label_count[label] += 1\n",
457 | " ent = -sum([(p/data_length)*log(p/data_length, 2) for p in label_count.values()])\n",
458 | " return ent\n",
459 | "\n",
460 | " # 经验条件熵\n",
461 | " def cond_ent(self, datasets, axis=0):\n",
462 | " data_length = len(datasets)\n",
463 | " feature_sets = {}\n",
464 | " for i in range(data_length):\n",
465 | " feature = datasets[i][axis]\n",
466 | " if feature not in feature_sets:\n",
467 | " feature_sets[feature] = []\n",
468 | " feature_sets[feature].append(datasets[i])\n",
469 | " cond_ent = sum([(len(p)/data_length)*self.calc_ent(p) for p in feature_sets.values()])\n",
470 | " return cond_ent\n",
471 | "\n",
472 | " # 信息增益\n",
473 | " @staticmethod\n",
474 | " def info_gain(ent, cond_ent):\n",
475 | " return ent - cond_ent\n",
476 | "\n",
477 | " def info_gain_train(self, datasets):\n",
478 | " count = len(datasets[0]) - 1\n",
479 | " ent = self.calc_ent(datasets)\n",
480 | " best_feature = []\n",
481 | " for c in range(count):\n",
482 | " c_info_gain = self.info_gain(ent, self.cond_ent(datasets, axis=c))\n",
483 | " best_feature.append((c, c_info_gain))\n",
484 | " # 比较大小\n",
485 | " best_ = max(best_feature, key=lambda x: x[-1])\n",
486 | " return best_\n",
487 | "\n",
488 | " def train(self, train_data):\n",
489 | " \"\"\"\n",
490 | " input:数据集D(DataFrame格式),特征集A,阈值eta\n",
491 | " output:决策树T\n",
492 | " \"\"\"\n",
493 | " _, y_train, features = train_data.iloc[:, :-1], train_data.iloc[:, -1], train_data.columns[:-1]\n",
494 | " # 1,若D中实例属于同一类Ck,则T为单节点树,并将类Ck作为结点的类标记,返回T\n",
495 | " if len(y_train.value_counts()) == 1:\n",
496 | " return Node(root=True,\n",
497 | " label=y_train.iloc[0])\n",
498 | "\n",
499 | " # 2, 若A为空,则T为单节点树,将D中实例树最大的类Ck作为该节点的类标记,返回T\n",
500 | " if len(features) == 0:\n",
501 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
502 | "\n",
503 | " # 3,计算最大信息增益 同5.1,Ag为信息增益最大的特征\n",
504 | " max_feature, max_info_gain = self.info_gain_train(np.array(train_data))\n",
505 | " max_feature_name = features[max_feature]\n",
506 | "\n",
507 | " # 4,Ag的信息增益小于阈值eta,则置T为单节点树,并将D中是实例数最大的类Ck作为该节点的类标记,返回T\n",
508 | " if max_info_gain < self.epsilon:\n",
509 | " return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])\n",
510 | "\n",
511 | " # 5,构建Ag子集\n",
512 | " node_tree = Node(root=False, feature_name=max_feature_name, feature=max_feature)\n",
513 | "\n",
514 | " feature_list = train_data[max_feature_name].value_counts().index\n",
515 | " for f in feature_list:\n",
516 | " sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)\n",
517 | "\n",
518 | " # 6, 递归生成树\n",
519 | " sub_tree = self.train(sub_train_df)\n",
520 | " node_tree.add_node(f, sub_tree)\n",
521 | "\n",
522 | " # pprint.pprint(node_tree.tree)\n",
523 | " return node_tree\n",
524 | "\n",
525 | " def fit(self, train_data):\n",
526 | " self._tree = self.train(train_data)\n",
527 | " return self._tree\n",
528 | "\n",
529 | " def predict(self, X_test):\n",
530 | " return self._tree.predict(X_test)"
531 | ]
532 | },
533 | {
534 | "cell_type": "code",
535 | "execution_count": 34,
536 | "metadata": {},
537 | "outputs": [],
538 | "source": [
539 | "def create_():\n",
540 | " dataset = [ ['青绿','蜷缩', '浊响', '清晰', '凹陷', '硬滑', '1'],\n",
541 | " ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '1'],\n",
542 | " ['乌黑',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '1'],\n",
543 | " ['青绿',' 蜷缩',' 沉闷',' 清晰',' 凹陷', '硬滑', '1'],\n",
544 | " ['浅白',' 蜷缩',' 浊响',' 清晰',' 凹陷', '硬滑', '1'],\n",
545 | " ['青绿',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '1'],\n",
546 | " ['乌黑',' 稍蜷',' 浊响',' 稍糊',' 稍凹', '软粘', '1'], \n",
547 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '硬滑', '1'],\n",
548 | " ['乌黑',' 稍蜷',' 沉闷',' 稍糊',' 稍凹', '硬滑', '0'],\n",
549 | " ['青绿',' 硬挺',' 清脆',' 清晰',' 平坦', '软粘', '0'],\n",
550 | " ['浅白',' 硬挺',' 清脆',' 模糊',' 平坦', '硬滑', '0'], \n",
551 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '软粘', '0'],\n",
552 | " ['青绿',' 稍蜷',' 浊响',' 稍糊',' 凹陷', '硬滑', '0'],\n",
553 | " ['浅白',' 稍蜷',' 沉闷',' 稍糊',' 凹陷', '硬滑', '0'],\n",
554 | " ['乌黑',' 稍蜷',' 浊响',' 清晰',' 稍凹', '软粘', '0'],\n",
555 | " ['浅白',' 蜷缩',' 浊响',' 模糊',' 平坦', '硬滑', '0'],\n",
556 | " ['青绿',' 蜷缩',' 沉闷',' 稍糊',' 稍凹', '硬滑', '0']\n",
557 | " ]\n",
558 | " \n",
559 | " labels = ['色泽', '根底', '敲声', '纹理', '脐部', '触感', '好瓜']\n",
560 | " return pd.DataFrame(dataset, columns=labels)\n",
561 | " "
562 | ]
563 | },
564 | {
565 | "cell_type": "code",
566 | "execution_count": 35,
567 | "metadata": {},
568 | "outputs": [],
569 | "source": [
570 | "\n",
571 | "datasets, labels = create_data()\n",
572 | "data_df = pd.DataFrame(datasets, columns=labels)\n",
573 | "dt = DTree()\n",
574 | "tree = dt.fit(data_df)"
575 | ]
576 | },
577 | {
578 | "cell_type": "code",
579 | "execution_count": 36,
580 | "metadata": {},
581 | "outputs": [
582 | {
583 | "data": {
584 | "text/plain": [
585 | "{'label:': None, 'feature': 3, 'tree': {' 清晰': {'label:': None, 'feature': 1, 'tree': {' 蜷缩': {'label:': '好', 'feature': None, 'tree': {}}, ' 稍蜷': {'label:': None, 'feature': 0, 'tree': {'乌黑': {'label:': None, 'feature': 2, 'tree': {'硬滑': {'label:': '好', 'feature': None, 'tree': {}}, '软粘': {'label:': '坏', 'feature': None, 'tree': {}}}}, '青绿': {'label:': '好', 'feature': None, 'tree': {}}}}, ' 硬挺': {'label:': '坏', 'feature': None, 'tree': {}}}}, ' 稍糊': {'label:': None, 'feature': 4, 'tree': {'硬滑': {'label:': '坏', 'feature': None, 'tree': {}}, '软粘': {'label:': '好', 'feature': None, 'tree': {}}}}, ' 模糊': {'label:': '坏', 'feature': None, 'tree': {}}, '清晰': {'label:': '好', 'feature': None, 'tree': {}}}}"
586 | ]
587 | },
588 | "execution_count": 36,
589 | "metadata": {},
590 | "output_type": "execute_result"
591 | }
592 | ],
593 | "source": [
594 | "tree"
595 | ]
596 | },
597 | {
598 | "cell_type": "code",
599 | "execution_count": null,
600 | "metadata": {},
601 | "outputs": [],
602 | "source": []
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": null,
607 | "metadata": {},
608 | "outputs": [],
609 | "source": []
610 | },
611 | {
612 | "cell_type": "code",
613 | "execution_count": null,
614 | "metadata": {},
615 | "outputs": [],
616 | "source": []
617 | },
618 | {
619 | "cell_type": "code",
620 | "execution_count": null,
621 | "metadata": {},
622 | "outputs": [],
623 | "source": []
624 | }
625 | ],
626 | "metadata": {
627 | "kernelspec": {
628 | "display_name": "Python 3",
629 | "language": "python",
630 | "name": "python3"
631 | },
632 | "language_info": {
633 | "codemirror_mode": {
634 | "name": "ipython",
635 | "version": 3
636 | },
637 | "file_extension": ".py",
638 | "mimetype": "text/x-python",
639 | "name": "python",
640 | "nbconvert_exporter": "python",
641 | "pygments_lexer": "ipython3",
642 | "version": "3.6.1"
643 | }
644 | },
645 | "nbformat": 4,
646 | "nbformat_minor": 2
647 | }
648 |
--------------------------------------------------------------------------------
/决策树/Image/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/决策树/Image/1.jpg
--------------------------------------------------------------------------------
/神经网络/.ipynb_checkpoints/NeuralNetwork-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 神经网络\n"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 106,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import numpy as np\n",
17 | "import pandas as pd\n",
18 | "import matplotlib.pyplot as plt\n",
19 | "%matplotlib inline"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": 107,
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "# 感知机实现或、与、非运算\n",
29 | "\n",
30 | "def sigmoid(x):\n",
31 | " return 1/(1+np.exp(-x))\n",
32 | "\n",
33 | "def sgn(x):\n",
34 | " if x >= 0:\n",
35 | " return 1\n",
36 | " if x < 0:\n",
37 | " return 0\n",
38 | "\n",
39 | "def perceptron(x, w, theata):\n",
40 | " length = len(x)\n",
41 | " g = sum([wi*xi for xi, wi in zip(x, w)])-theata\n",
42 | " return sigmoid(g)"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 108,
48 | "metadata": {},
49 | "outputs": [
50 | {
51 | "data": {
52 | "text/plain": [
53 | "0.5"
54 | ]
55 | },
56 | "execution_count": 108,
57 | "metadata": {},
58 | "output_type": "execute_result"
59 | }
60 | ],
61 | "source": [
62 | "# 与运算\n",
63 | "x = [1, 1]\n",
64 | "w = [1, 1]\n",
65 | "theata = 2\n",
66 | "perceptron(x, w, theata)"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": 109,
72 | "metadata": {},
73 | "outputs": [
74 | {
75 | "data": {
76 | "text/plain": [
77 | "0.62245933120185459"
78 | ]
79 | },
80 | "execution_count": 109,
81 | "metadata": {},
82 | "output_type": "execute_result"
83 | }
84 | ],
85 | "source": [
86 | "# 或运算\n",
87 | "x = [1, 0]\n",
88 | "w = [1, 1]\n",
89 | "theata = 0.5\n",
90 | "perceptron(x, w, theata)"
91 | ]
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 110,
96 | "metadata": {},
97 | "outputs": [
98 | {
99 | "data": {
100 | "text/plain": [
101 | "0.62245933120185459"
102 | ]
103 | },
104 | "execution_count": 110,
105 | "metadata": {},
106 | "output_type": "execute_result"
107 | }
108 | ],
109 | "source": [
110 | "# 非运算\n",
111 | "x = [0, 0]\n",
112 | "w = [-0.6, 0]\n",
113 | "theata = -0.5\n",
114 | "perceptron(x, w, theata)"
115 | ]
116 | },
117 | {
118 | "cell_type": "code",
119 | "execution_count": 111,
120 | "metadata": {},
121 | "outputs": [],
122 | "source": [
123 | "def two_perceptron(x, w, theata):\n",
124 | " x0 = perceptron(x, w[0], 0.5) \n",
125 | " x1 = perceptron(x, w[1], 0.5)\n",
126 | " return perceptron([x0, x1], w[2], 0.5)\n",
127 | "\n",
128 | "\n",
129 | " "
130 | ]
131 | },
132 | {
133 | "cell_type": "code",
134 | "execution_count": 112,
135 | "metadata": {},
136 | "outputs": [
137 | {
138 | "name": "stdout",
139 | "output_type": "stream",
140 | "text": [
141 | "[1, -1]\n"
142 | ]
143 | },
144 | {
145 | "data": {
146 | "text/plain": [
147 | "0.56342679354672753"
148 | ]
149 | },
150 | "execution_count": 112,
151 | "metadata": {},
152 | "output_type": "execute_result"
153 | }
154 | ],
155 | "source": [
156 | "# 异或XOR运算\n",
157 | "x = [1, 1]\n",
158 | "w = [[1, -1], [-1, 1], [1, 1]]\n",
159 | "print(w[0])\n",
160 | "two_perceptron(x, w, 0.5)"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 113,
166 | "metadata": {},
167 | "outputs": [],
168 | "source": [
169 | "from sklearn.datasets import make_blobs"
170 | ]
171 | },
172 | {
173 | "cell_type": "code",
174 | "execution_count": 114,
175 | "metadata": {},
176 | "outputs": [
177 | {
178 | "data": {
179 | "text/plain": [
180 | ""
181 | ]
182 | },
183 | "execution_count": 114,
184 | "metadata": {},
185 | "output_type": "execute_result"
186 | },
187 | {
188 | "data": {
189 | "image/png": "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\n",
190 | "text/plain": [
191 | ""
192 | ]
193 | },
194 | "metadata": {},
195 | "output_type": "display_data"
196 | }
197 | ],
198 | "source": [
199 | "x, y = make_blobs(n_samples=40, n_features=2, centers=2)\n",
200 | "plt.scatter(x[:, 0], x[:, 1], c=y, cmap='autumn')"
201 | ]
202 | },
203 | {
204 | "cell_type": "code",
205 | "execution_count": 120,
206 | "metadata": {},
207 | "outputs": [],
208 | "source": [
209 | "def sigmoid(x):\n",
210 | " return 1/(1+np.exp(-x))\n",
211 | "def foward(x, w, b, n_hidden=0, hidden_q=0, out_l=1):\n",
212 | " hidden_input = np.array(x)\n",
213 | " Wout = np.array(w[-1])\n",
214 | " Bout = np.array(b[-1])\n",
215 | " for h in range(n_hidden):\n",
216 | " wh = np.array(w[h])\n",
217 | " bh = b[h]\n",
218 | " hidden = []\n",
219 | " for i in range(hidden_q):\n",
220 | " wi = np.array(wh[i, :])\n",
221 | " ah = np.dot(hidden_input, wi)-np.array(bh)[i]\n",
222 | " hidden.append(sigmoid(ah))\n",
223 | " hidden_input = np.array(hidden)\n",
224 | " output = []\n",
225 | " for j in range(out_l):\n",
226 | " print(j, hidden_input, Wout[j, :], Bout[j])\n",
227 | " wj = Wout[j, :]\n",
228 | " bj = np.dot(hidden_input, wj)-Bout[j]\n",
229 | " output.append(sigmoid(bj))\n",
230 | " output = np.array(output)\n",
231 | " return output"
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": 121,
237 | "metadata": {},
238 | "outputs": [
239 | {
240 | "name": "stdout",
241 | "output_type": "stream",
242 | "text": [
243 | "0 [1 0] [1 1] 0.5\n"
244 | ]
245 | }
246 | ],
247 | "source": [
248 | "x = [1, 0]\n",
249 | "w = np.array([\n",
250 | " [[1, 1]]\n",
251 | "])\n",
252 | "theata = [[0.5]]\n",
253 | "a=foward(x, w, theata, n_hidden=0, hidden_q=0, out_l=1 )"
254 | ]
255 | },
256 | {
257 | "cell_type": "code",
258 | "execution_count": 125,
259 | "metadata": {},
260 | "outputs": [
261 | {
262 | "name": "stdout",
263 | "output_type": "stream",
264 | "text": [
265 | "0 [ 0.62245933 0.62245933 0.62245933] [1 1 1] 0.5\n"
266 | ]
267 | },
268 | {
269 | "data": {
270 | "text/plain": [
271 | "array([ 0.7969562])"
272 | ]
273 | },
274 | "execution_count": 125,
275 | "metadata": {},
276 | "output_type": "execute_result"
277 | }
278 | ],
279 | "source": [
280 | "x = [1, 1, 1]\n",
281 | "w = np.array([\n",
282 | " [[1, -1, 1],[-1, 1, 1], [1, 1, -1]],\n",
283 | " [[1, 1, 1]]\n",
284 | "])\n",
285 | "theata = np.array([\n",
286 | " [0.5, 0.5, 0.5],\n",
287 | " [0.5]\n",
288 | "])\n",
289 | "foward(x, w, theata, n_hidden=1, hidden_q=3, out_l=1 )"
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "execution_count": null,
295 | "metadata": {},
296 | "outputs": [],
297 | "source": []
298 | }
299 | ],
300 | "metadata": {
301 | "kernelspec": {
302 | "display_name": "Python 3",
303 | "language": "python",
304 | "name": "python3"
305 | },
306 | "language_info": {
307 | "codemirror_mode": {
308 | "name": "ipython",
309 | "version": 3
310 | },
311 | "file_extension": ".py",
312 | "mimetype": "text/x-python",
313 | "name": "python",
314 | "nbconvert_exporter": "python",
315 | "pygments_lexer": "ipython3",
316 | "version": "3.6.1"
317 | }
318 | },
319 | "nbformat": 4,
320 | "nbformat_minor": 2
321 | }
322 |
--------------------------------------------------------------------------------
/神经网络/NeuralNetwork.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 神经网络\n"
8 | ]
9 | },
10 | {
11 | "cell_type": "code",
12 | "execution_count": 106,
13 | "metadata": {},
14 | "outputs": [],
15 | "source": [
16 | "import numpy as np\n",
17 | "import pandas as pd\n",
18 | "import matplotlib.pyplot as plt\n",
19 | "%matplotlib inline"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": 107,
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "# 感知机实现或、与、非运算\n",
29 | "\n",
30 | "def sigmoid(x):\n",
31 | " return 1/(1+np.exp(-x))\n",
32 | "\n",
33 | "def sgn(x):\n",
34 | " if x >= 0:\n",
35 | " return 1\n",
36 | " if x < 0:\n",
37 | " return 0\n",
38 | "\n",
39 | "def perceptron(x, w, theata):\n",
40 | " length = len(x)\n",
41 | " g = sum([wi*xi for xi, wi in zip(x, w)])-theata\n",
42 | " return sigmoid(g)"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 108,
48 | "metadata": {},
49 | "outputs": [
50 | {
51 | "data": {
52 | "text/plain": [
53 | "0.5"
54 | ]
55 | },
56 | "execution_count": 108,
57 | "metadata": {},
58 | "output_type": "execute_result"
59 | }
60 | ],
61 | "source": [
62 | "# 与运算\n",
63 | "x = [1, 1]\n",
64 | "w = [1, 1]\n",
65 | "theata = 2\n",
66 | "perceptron(x, w, theata)"
67 | ]
68 | },
69 | {
70 | "cell_type": "code",
71 | "execution_count": 109,
72 | "metadata": {},
73 | "outputs": [
74 | {
75 | "data": {
76 | "text/plain": [
77 | "0.62245933120185459"
78 | ]
79 | },
80 | "execution_count": 109,
81 | "metadata": {},
82 | "output_type": "execute_result"
83 | }
84 | ],
85 | "source": [
86 | "# 或运算\n",
87 | "x = [1, 0]\n",
88 | "w = [1, 1]\n",
89 | "theata = 0.5\n",
90 | "perceptron(x, w, theata)"
91 | ]
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 110,
96 | "metadata": {},
97 | "outputs": [
98 | {
99 | "data": {
100 | "text/plain": [
101 | "0.62245933120185459"
102 | ]
103 | },
104 | "execution_count": 110,
105 | "metadata": {},
106 | "output_type": "execute_result"
107 | }
108 | ],
109 | "source": [
110 | "# 非运算\n",
111 | "x = [0, 0]\n",
112 | "w = [-0.6, 0]\n",
113 | "theata = -0.5\n",
114 | "perceptron(x, w, theata)"
115 | ]
116 | },
117 | {
118 | "cell_type": "code",
119 | "execution_count": 111,
120 | "metadata": {},
121 | "outputs": [],
122 | "source": [
123 | "def two_perceptron(x, w, theata):\n",
124 | " x0 = perceptron(x, w[0], 0.5) \n",
125 | " x1 = perceptron(x, w[1], 0.5)\n",
126 | " return perceptron([x0, x1], w[2], 0.5)\n",
127 | "\n",
128 | "\n",
129 | " "
130 | ]
131 | },
132 | {
133 | "cell_type": "code",
134 | "execution_count": 112,
135 | "metadata": {},
136 | "outputs": [
137 | {
138 | "name": "stdout",
139 | "output_type": "stream",
140 | "text": [
141 | "[1, -1]\n"
142 | ]
143 | },
144 | {
145 | "data": {
146 | "text/plain": [
147 | "0.56342679354672753"
148 | ]
149 | },
150 | "execution_count": 112,
151 | "metadata": {},
152 | "output_type": "execute_result"
153 | }
154 | ],
155 | "source": [
156 | "# 异或XOR运算\n",
157 | "x = [1, 1]\n",
158 | "w = [[1, -1], [-1, 1], [1, 1]]\n",
159 | "print(w[0])\n",
160 | "two_perceptron(x, w, 0.5)"
161 | ]
162 | },
163 | {
164 | "cell_type": "code",
165 | "execution_count": 113,
166 | "metadata": {},
167 | "outputs": [],
168 | "source": [
169 | "from sklearn.datasets import make_blobs"
170 | ]
171 | },
172 | {
173 | "cell_type": "code",
174 | "execution_count": 114,
175 | "metadata": {},
176 | "outputs": [
177 | {
178 | "data": {
179 | "text/plain": [
180 | ""
181 | ]
182 | },
183 | "execution_count": 114,
184 | "metadata": {},
185 | "output_type": "execute_result"
186 | },
187 | {
188 | "data": {
189 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHhFJREFUeJzt3Xl8VfWZx/HPQ4AsLCISh1axwQWnuKA0UuuMVgUttuLS\n2tbiMo5jUWesVZyqqLV26qitU9xqp8W6tfoa7VQs1q1al1pFkai4L6UqiigEAUUSCCS/+eNJhiT3\nZrm5555zc+73/XrlBTm5Offhkjznd3/n+T0/CyEgIiLpMSDpAEREJFpK7CIiKaPELiKSMkrsIiIp\no8QuIpIySuwiIimjxC4ikjJK7CIiKaPELiKSMgOTeNJRo0aFmpqaJJ5aRKTfeuaZZ1aGEKp7elwi\nib2mpoa6uroknlpEpN8ysyW9eZymYkREUkaJXUQkZZTYRURSRoldRCRllNhFRFKmRBL7AmASUAaM\nBC4ENiUakYhIoSRS7hivV4HJwLrWz1cDPwWWAb9KKigRkYIpgRH7pcD6TscagFuB+vjDEREpsBJI\n7IuA5izHy4E3Y45FRKTwSiCx74HPrXe2Adg+5lhERAqvBBL7ufjovL0qYDrQY8sFEZF+pwQS+3jg\nIaAW/+eOAGYCv0wyKBGRgimBqhiAvYGFSQchIhKLEhixi4iUFiV2EZGUUWIXEUkZJXYRkZRRYhcR\nSRkldhGRlFFi73ca8cZma5IORESKVGSJ3czKzOw5M7s7qnNKewFvaFYNfB4YDfwz0JRkUCJShKJc\noPRdfCg5PMJzyv/7DXAx3pmyze14e4RrE4lIRIpTJCN2M9sW+ApqcF5Al9IxqYNPy9yANzQTEXFR\nTcVcCZwNtER0PsmwvIvjAVgbZyAiUuTyTuxmdiiwIoTwTA+Pm2FmdWZWV1+vDS5y9wXAshwfCWwV\ncyy9sRA4DfgX4I/4BUhE4hDFiP0fgMPM7G3gNuBAM7ul84NCCHNCCLUhhNrqarXLzd2lwBA6/pdV\nAVeTPeEn6RJgf+C/8amirwHHouQuEo+8E3sIYVYIYdsQQg1wNPBwCOHYvCMTYCWwovXvuwNPA18H\nxgJTgHuBo5IJrUvvAj/C7we0zcytA+YBf47h+QPwv8ABwF7AbDLvTYikW4m07e1vFuMbgTyPj8b/\nHt+jdRf8TVExu5/s44UG4E58JF9IpwM3snnz8peBW4CngMEFfm6R4hDpAqUQwqMhhEOjPGfpWY/P\nbtXhNeobgBeA/egfN0mryP5jVYZPJRXSW3hh1rp2xxqBN/BRvEhp0MrTovN7fHTbfj464An+9kQi\nys00ss+lDwKOL/BzP072N6Hr8HcSIqVBib3gVgNz8cTSm1WiS/BRe2frgLejC6tghuP/3iHAMGAo\nUAFcgU8pFVI12W8kDwI+XeDnFikemmMvqF8CZ7B5bncAcA+wTzffsxeeCD/pdHwY3kqgGLXgo+UP\n8Wmkg/G6+/vxdxoHA6NiiGMKfkH5hI7vGgYB347h+UWKgxJ7wbwInImPvtuPwL8MfIAn72wOAHYD\nnmv3feXADq3fW2z+iifU1fhouQk4B7gIL3OM00DgUXw6aBk+r18G3AzsGHMsIsnRVEzB3Ej2qZcW\nup/vNeAhfCHvZ4Ax+AXiL3iSKiYBv9i8i9/Y/Ri/GP0XcF9CMe0MvA4sAB7E3zlMSygWkWRoxF4w\na4DmLMd70wKgEvhh60cclgNP4CtY96X31/vngffJvFm6Dm9MdkhUAebI8NJQkdKkEXvBHInfOOxs\nEz51USwuAmrwFsDT8HcJb/Tye9fS9buI1fkGJiJ9pMReMF/BR79ttduG13h/H/hUUkF1cj8+bbIe\nn0ZZC7yHT6/0Zvl/Ldn7vlUC34woRhHJlRJ7wQwA/oDfuPsGPiJ+EDgvyaA6uZaOi3nAE/pyYFEv\nvr8S+Dl+wWobuVcBOwEnRRSjiORKc+wFVYZXhsRdHdJbXU2XDMBH8L1xHN7H5ud4tc9hwDF0XfUj\nIoWmxF5ymoDHgI3AEXhZZecmWS3ApBzOOQGv2ReRYqDEXlKewG+QbsLn/DcCW+NdJNfh7zDK8dF3\nZUIxiki+lNhLxjq8/LBzqeVyvDLmKXyD7FPwEbiI9FdK7CXjD10cb2ZzS10RSQMl9pLxEdkXTG0k\nuZrzFcBvgHfwtsSHox9Jkfzpt6hkTCF7zfkQklly/yTeHGwTXkd/A14m+RcK37ddJN1Ux14ydsA3\nl26fNIfgTccmxxxLwHdR/ITNjc4+AV7F2/uKSD6U2EvKT/C59G/i0x434Bt7xP1jsBivxOlsPb4F\noIjkQ1MxJcWAg1o/kjSIrlsWDIozEJFU0ohdElADbE/mbkdVwMmxR5O/ZnyB1h542+Dv0/uVuyLR\nU2KXhNyBb2U3DG8/UIW/k+ic2B8HpuL3CI7Be60Xm+OBmXgb4zfwxmp7k32LQ5HC01SMJGRnfIOO\nu/HdjvYBJnZ6zFy8F01by4O3gbuA+fguU8XgNfy+RWO7Y+vxEs7/xeMXiZdG7JKgwcBX8Wqdzkk9\nAN+hYx+bFnwF7TmxRNc7T5L912gdvhOWSPyU2KVIrSJ75UzA2x8Ui0+T/deoHL+XIBI/JXYpUkPp\n+sdz6zgD6cEUYASZsQ4E/iX+cERQYpeiVY5vTtK5y2QVcG784XSpDPgzXhHTdhN4G+AefCNykfjp\n5qkUsSvwuerf4vXtzcAs4J+SDCqLscAz+M3gRrw1QudSTpH49KMR+2PAgfic5peABX08TyPeqrY3\ne3pKssrxrQWX4Tcp64ELKN6kOQYYR/HGJ6WinyT2+/Ba5keA94EH8CT/5xzO0QicAGwJfAbYFrWq\n7S+2BHbBpzlEpCd5J3YzG2Nmj5jZK2b2spl9N4rAOjqdjnXC4GVwM3M4x/HA7cCG1o9lwLEUV4WF\nJG8jWlgk/V0UI/ZNwFkhhPH4crt/M7PxEZy3VTPeNCqbF3t5juX4QpjOv7CNwKV9jEvSZTXwDbzj\n5VB8z9cXEo1IpK/yTuwhhPdDCM+2/n0t3nt1m3zPu9kAvJwsm96WvS3FF8N0Fuj6oiGlI+Bli/Pw\nEXszsBDYFx8UiPQvkc6xm1kNsCdZ7mya2QwzqzOzuvr6+lzOCpxF5vxqLmVv4/Bf2M4G4kvZpbQt\nwHu8NHU63gRcF384InmKLLGb2VC8s9MZIYSM1nYhhDkhhNoQQm11dXWOZz8PX15ehb9VHoIvK/+3\nXn7/MODf6XhxsNbPZ+UYi6RPV+/a1gMvxRmISCQiSexmNghP6reGEOZGcc6OBgCX4UvMXwI+BC4k\nt7KyHwLXAn8PbAUcATyNt4+V0rY72bcNrAI+H3MsIvnLe4GSmRlwPfBqCGF2/iF1p5K+998wvNzx\nhIhikfTYHfhHfK1E2w32Mvwm6j8nFZRIn0UxYv8HvDfpgWa2qPXjyxGcVyRG84Az2Nwj/mtAHV3f\nuBcpXnmP2EMIj6OldtLvVeClryp/lf5PvWISFfCKjAX4cvRDyV6WKSLSe0rsiWnCE/l8fI3XYLza\n53F8GzgRkb7pJ71i0mg2nsTX4S0O1gIrgKOTDEpEUkCJPTHXk9n/pgVvk6DVjsWhAbgY3591PL5J\ndedFTCLFR1MxidnUxXEj+ypZiVczcADeL6atBPJC4I94d1HVC0jx0og9MdPxfuOd1eAthSVZ9wOv\n0LFxXCPeF35+IhGJ9JYSe2LOxXvYDG39vAoYDtyaWETdWws8iLc5zrZKM22eAD7JcrwJT+4ixUtT\nMYkZhm+ndheeRGrw/vAjE4ypK3PwxTuD8KQ+Eh/RfjbJoApsDH6xbeh0vIJIm5eKFICFEP8WcbW1\ntaGuri7255W+qAO+SMcEZ/gWhe+Q3jd9a/Cdttr3szO8z9A7ZG6yLVJ4ZvZMCKG2p8el9bdSIvML\nMjcoCXjCezz+cGIzAt+KcUc8iVfglTGPoaQuxU5TMdKDerLPqRuwKuZY4jYR79P+Nt4UbLtEoxHp\nLY3YpQdH4CtiO2vCdxhKOwPGoqQu/YkSu/RgOr5Ap/0mJVXAD/D5ZhEpNpqKkR6U41U7NwG/wyti\nTsUX74hIMVJil16oAE5p/ejKErwEshI4DPUxF0mOpmIkAhfjWw6eie9Duw2e5EUkCRqxS54W4ptT\ndC6JPAr4gM0ra0UkLhqxS6tGvG1wrgvWbiYzqYP/aGnULpIEJfaS14hv8L0lXtI3BvhDDt+/ga57\nx6jFrUgSlNhL3rHA7XiC3gC8h2/28XQvv/8bZK9z3wh8KYoARSRHSuwl7QPgXjKnUhqBy3p5jinA\nV/Hkbvhtm0rgalTnLpIM3Twtae/iderZesG80ctzGD7PfhIwD1+8dCy+qElEkqDEXtJ2xqdfOhsI\n/GMO5zFgv9YPEUmapmJK2nDgLDq2C7DWz89JJCIRyZ8Se8n7EXANPnrfCm/69TTe+EpE+iNNxZQ8\nA05s/RCRNNCIXUQkZZTYRURSJpLEbmZTzex1M1tsZudGcU4REembvBO7mZUB1wKH4JtCfsvMxud7\nXhER6ZsoRuyTgMUhhDdDCE3AbcDhEZxXRET6IIrEvg2+hLHN0tZjIiKSgNhunprZDDOrM7O6+vr6\nuJ5WRKTkRJHY38N7vbbZtvVYByGEOSGE2hBCbXV1dQRPKyIi2USR2BcCO5nZWDMbjPd8vSuC84qI\nSB/kvfI0hLDJzE4D/giUATeEEF7OOzIREemTSFoKhBDuxRt7i4hIwrTyVEQkZZTYRURSRoldRCRl\nlNhFRFJGiV1EJGWU2EVEUkaJXUQkZZTYRURSRoldRCRllNhFRFJGiV1EJGWU2EVEUkaJXUQkZZTY\nRURSRoldRCRllNhFRFJGiV1EJGWU2EVEUkaJXUQkZZTYRURSRoldRCRllNhFRFJGiV1EJGWU2EVE\nUmZg0gGISMSefBLuuAPKy2H6dNhll6QjkpgpsYukyb/+K9x8MzQ2woABcMUVcMklcMYZSUcmMdJU\njEhazJ/vSb2hAUKA5mZP8LNmwXvvJR2dxEiJXSQt7rjDE3lnAwbAvffGH48kRoldJC3Kyz2JdzZg\nAAweHH88kpi8EruZXW5mr5nZC2Z2p5mNiCowEcnR9OnZE3hzM0ybFn88kph8R+wPAruGEHYH3gBm\n5R+SiPTJrrvCxRdDRQVUVcHQoVBZCbfcAiNHJh2dxCivqpgQwgPtPn0KOCq/cEQkLzNnwje/Cffc\n46P3ww5TUi9BUZY7ngjc3tUXzWwGMANgu+22i/BpRaSDbbaBGTOSjkIS1GNiN7M/AaOzfOn8EMK8\n1secD2wCbu3qPCGEOcAcgNra2tCnaEVEpEc9JvYQwpTuvm5mJwCHApNDCErYIiIJy2sqxsymAmcD\nXwwhNEQTkoiI5CPfqpifAcOAB81skZn9IoKYREQkD/lWxewYVSAiIhINrTwVEUkZJXYRkZRRYhcR\nSRkldhGRlFFiFxFJGSV2EZGUUWIXEUkZJXaRJLS0wGuvwTvvJB2JpJASu0jcHn4YxoyB2lrYeWf4\n3OfgrbeSjkpSRIldJE5LlniP9GXLYN06WL8eFi2C/ff3nY5EIqDELhKn666DjRs7HmtpgdWrfSQv\nEgEldpE4vfMONDVlHg8B3n8//ngklZTYReJ04IEwZEjm8eZm2Hvv+OORVFJiF4nT0Uf7jdOKis3H\nhgyBr38dxo1LLi5JFSV2kThVVMCCBfC973ki33NPuOIKuPHGpCOTFIlyM2sR6Y1hw+D44+G442DH\nHcEs6YgkZTRiF4nT88/7SH3CBNhjD0/szz6bdFSSMkrsInH55BOvV1+8GBoa/OPNN/2G6kcfJR2d\nV+tccAGMGgWVlTB1Krz+etJRZXr1VTjoICgvh622gvPPz15pVMKU2EXi8rvfwaZNmcc3bYLf/jb3\n823YAC+95BeHV1+Fjz/OL75jjoHZs+HDD33h1AMPwOc/74upisXSpV499NBDnsxXrfJ7FMcck3Rk\nRUWJXSQu778PjY2Zxxsacq9h/8UvoLra2xHssAPsthtsvTWcdlr2i0dP3noL7r67Y3wheIK/5prc\nz1co11zjMYWw+Vhjo8f+9tuJhVVslNhF4rLPPh3LHNsMGeJf660HHoCzzoK1azdPQTQ3+wj+xhvh\nwgtzj+2VV3xqo7MNG2DhwtzPVyhPP5192qW83N+1CKDELhKf/fbzqY2qqs3HKith4kSYPLn357ns\nMh/lZ9PQ4KPalpbcYttpp+wJc9Ag2H333M5VSHvs4TF11tTk/wYBlNhF4mMG990HP/iBd3XcZRe4\n+GIfgedS8vjee91/vaEhsx9NT8aNg333zXxHUV4Op5+e27kK6bvfzXxnUVEBBxzgFUYCKLGLxGfj\nRpg5Ey66CN591xN0ZWX2KZDuTJ6cfdTaZvvtcz8nwJ13en19RQUMGOBthR95BGpqcj9XodTUwKOP\nwqRJfjGsrIQTT/Qb0/L/LLS/CRGT2traUFdXF/vziiTq9NPh+us7TqNUVcFvfgNf/Wrvz7N0qdfB\nf/RRZqvfykqYO9dLFfuqpcXP293Fo7cWLYIXXvBpkr33jnYxVnOzX4BKaIGXmT0TQqjt8XFK7CIx\nWL8eRo7MXhUzYYInwFy8+y7853/61E5Dgye4iRP9xukXvhBNzLkKwT8GDPB/56GHwlNP+ech+PTT\nQw/BiBHJxJcCvU3saikgEoc1azqW6LW3dGnu5xszxksei8HHH/u7kdtu8+mmfff16aD58/2C1ual\nl+DUU+F//ie5WEuEErtIHKqrYejQjokOfBphr72SiSkKIcDBB8Nzz22uqnnsMf/ofCFraoI77vA6\n+4FKPYUUyc1TMzvLzIKZjYrifCKpU1YGl1/esdSx7ebfJZckF1e+6up8JN6+VLJtSiab5ubcSzEl\nZ3kndjMbAxwMaLt1ke6ccIK3Dpg0Cf7u7+DLX4YnnvDWvf3Va6/1/ualmdfxDx5c2JgkkqmYK4Cz\ngXkRnEsk3b7yFf9Ii113zT4CLy/36ZYQ/OZuRYUfu+66+GMsQXkldjM7HHgvhPC8lVDJkYi02nNP\nv0ewYMHm+wcDBvj9hIULYd48bwOw225w0kl+r0EKrsfEbmZ/AkZn+dL5wHn4NEyPzGwGMANgu+22\nyyFEESlq99wDs2bBzTd7b5mDDoKrroKxY+GMM/p2zuZmePJJP98++/i9COm1Ptexm9luwENA22qL\nbYFlwKQQwgfdfa/q2EW6EQIsX+5z0SNHJh1N/BYu9Br4xkafl29p8eZmRx2VdGSJ620de59vnoYQ\nXgwhbB1CqAkh1ABLgYk9JXUR6cbChfDZz/rS+U99yhuH9aXOvb9qbPTyyRUrvHvlxx/7BiXHHw9/\n+1vS0fUb6hUjUiyWL/fdlF5/3acgmpp8kc9++2W2Dkire+/N/m/dtAluuin2cPqryBJ768h9ZVTn\nEyk5N96YuUlGczOsXAkPP5xMTHFbvTp7Yt+4Eerr44+nn9KIXaRY/PWvmStTwRPdkiXxx5OEAw7I\nXj45dKjPu0uvKLGLJK2x0StAdtzRd1PKpj+3HcjFDjt4P5n2r8OQIb6w6ZBDkourn1FiF0nSr37l\ntd1Tp8KPfuRTDu3b5VZW+rz7hAnJxRi3n/7UV+gecYTfSP35z72LZVlZ4Z/7lVfga1+DbbbxNsN3\n31345ywAte0VScr8+V7z3b4/e1mZt7UtL/fVmiefDGeeGU1vdOneq696u4eGhs3TQVVVcOWV8O1v\nR3P+Vat8UVf7nkE5KHi5o4h0I4Sem11ddVVmf/bmZp9nv+8+L+87++zCJ/W1az2Wgw/21aHPP1/Y\n5ytW3/8+rFvX8f+tocH/D3LdarC9to1Ramu9P1B1Nfzyl/nH2w0ldpEobdwI554LW2zhvVImTIC/\n/CX7Y5cty94FceDA+CpA1qzxGM87Dx580Ctz9tnHp0JKzfz52f8/Nm7seZ/ZroTg9wZeftkvEh9/\n7H/OnOkN4ApEiV0kSiefDFdf7aPgEHxbuKlT/c/Opk3LvlR+wwYf3cVh9my/wLRNB7W0+N9PPrlj\nK95SMGZM9uPNzTCqjx3JX3wR3nors4SzsdHfJRWIErtIVFau9N2BOk+vrF8Pl16a+fhTToHRo30u\nvc2QIfAf/+Ej/jj8/vd+IemsudlHmaXkggsy574rK+GYY7zcsi9Wrsy+qUgI8P77fTtnLyixi0Tl\nrbey9xpvafGRW2fDh8Ozz/o0SG2tv2WfOxe+973Cx9pmyy2zH9+0qeeLy+LF8J3vwJQpvtfqihXR\nxxenadP8HcyIEX6BraiAb30Lrr227+esrc3+zqeysqB1+aqKEYnKqlVeJtd5kVFZGUyfDr/+dTJx\ndWfuXO/Dsm7d5mNlZT7v/swzXX/f44/7FNOGDX4RKC/3UW1dnfe56c/a5tS32gqGDcv/fLNn+43Z\ntumuigrvA7RokV/cc6CqGJG4jRwJJ56Y+Xa+osLb2hajI4/01roVFZ5khg6FceO8j3p3TjrJLwZt\nLRA2bPB2AOecU/iYC23QIL84RZHUwW+UzpvnI/RJk3zK57nnck7qudCIXSRKzc3w4x/7jbHVq33F\n6JVXFv/K0RUrfEOM0aPhc5/rfru7NWtg662zlwCOGOH/bimI3o7YldhFJDfr1/v8e7a54zFj4B1t\nf1womooRkcKoqPApnPLyjserquC005KJSTqIYjNrEYlCCL7RxpIlPh2y/fZJR9S1OXPggw98+mbQ\nIB+9H3UUnHVW0pEJSuwixaG+3ssG33zTN4NuavJmVDffHE/zq1wNHw6PPupNs95+G3bdFbSXcdFQ\nYhcpBscd502i2t+QvPNOr4Pu64bQcRg/3j+kqGiOXSRpa9bAI49kVpk0NOS3OEZKlhK7SNIaG336\nJZtPPok3FkkFJXaRpI0eDZ/+dObxgQPh8MPjj0f6PSV2kaSZwU03eX+Stt7rlZW+COiii5KMTPop\n3TwVKQb77gsvveRz6m+8Afvv7+0J4uryKKmixC5SLGpq4PLLk45CUkBTMSKSnGXL4NRT/aI2cSLc\nckv2XYwkJxqxi0gy6ut9Y+dVq7xL5JIlvvnIiy96IzXpM43YRSQZV18NH320ufUveCvgq6+GDz9M\nLq4UUGIXkWQ88kj2bfnKy+H55+OPJ0WU2EUkGWPHZl+Y1dTkO1FJn+Wd2M3sO2b2mpm9bGY/iSIo\nESkBM2d23MgbvI5/4kTYeedkYkqJvBK7mR0AHA5MCCHsAvxXJFGJSPrtuadXwVRX++Ks8nKYPBnu\nuivpyPq9fKtiTgUuCyFsAAgh9PNtykUkVkceCYcd5q1/t9gCRo1KOqJUyHcqZhywr5ktMLM/m1mR\nb+woIkWnrAx22EFJPUI9jtjN7E/A6CxfOr/1+0cCewN7Ab81s+1Dlo1UzWwGMANgOzXkFxEpmB4T\newhhSldfM7NTgbmtifxpM2sBRgH1Wc4zB5gDvpl1nyMWEZFu5TsV83vgAAAzGwcMBlbmG5SIiPRd\nvjdPbwBuMLOXgCbgn7JNw4iISHzySuwhhCbg2IhiERGRCFgSA2wzqweWFPApRqEpofb0emTSa9KR\nXo9MxfiafCaEUN3TgxJJ7IVmZnUhhNqk4ygWej0y6TXpSK9Hpv78mqhXjIhIyiixi4ikTFoT+5yk\nAygyej0y6TXpSK9Hpn77mqRyjl1EpJSldcQuIlKyUpnYzWwPM3vKzBaZWZ2ZTUo6pmKg3vmZzOws\nMwtmVvIdqMzs8tafjxfM7E4zG5F0TEkws6lm9rqZLTazc5OOpy9SmdiBnwA/DCHsAVzY+nlJU+/8\nTGY2BjgYeCfpWIrEg8CuIYTdgTeAWQnHEzszKwOuBQ4BxgPfMrPxyUaVu7Qm9gAMb/37FsCyBGMp\nFuqdn+kK4Gz856XkhRAeCCG07Sz9FLBtkvEkZBKwOITwZuvK+tvwAVG/ktbEfgZwuZm9i49MS27k\nkYV657djZocD74UQtGtydicC9yUdRAK2Ad5t9/nS1mP9Sr5NwBLTQ5/4ycCZIYQ7zOwbwPVAl+2H\n0yKq3vlp0cPrcR4+DVNSuntNQgjzWh9zPrAJuDXO2CQ6qSx3NLOPgBEhhGBmBnwUQhje0/elmZnd\nD/w4hPBI6+d/A/YOIWT0zk87M9sNeAhoaD20LT5dNymE8EFigRUBMzsBOBmYHEJo6OHhqWNmXwAu\nCiF8qfXzWQAhhEsTDSxHaZ2KWQZ8sfXvBwJ/TTCWYqHe+a1CCC+GELYOIdSEEGrwt9sTldRtKn7P\n4bBSTOqtFgI7mdlYMxsMHA30u921++1UTA++DVxlZgOB9bRuyVfi1DtfevIzoBx40N/o8lQI4ZRk\nQ4pXCGGTmZ0G/BEoA24IIbyccFg5S+VUjIhIKUvrVIyISMlSYhcRSRkldhGRlFFiFxFJGSV2EZGU\nUWIXEUkZJXYRkZRRYhcRSZn/AzdntXmdz74MAAAAAElFTkSuQmCC\n",
190 | "text/plain": [
191 | ""
192 | ]
193 | },
194 | "metadata": {},
195 | "output_type": "display_data"
196 | }
197 | ],
198 | "source": [
199 | "x, y = make_blobs(n_samples=40, n_features=2, centers=2)\n",
200 | "plt.scatter(x[:, 0], x[:, 1], c=y, cmap='autumn')"
201 | ]
202 | },
203 | {
204 | "cell_type": "code",
205 | "execution_count": 120,
206 | "metadata": {},
207 | "outputs": [],
208 | "source": [
209 | "def sigmoid(x):\n",
210 | " return 1/(1+np.exp(-x))\n",
211 | "def foward(x, w, b, n_hidden=0, hidden_q=0, out_l=1):\n",
212 | " hidden_input = np.array(x)\n",
213 | " Wout = np.array(w[-1])\n",
214 | " Bout = np.array(b[-1])\n",
215 | " for h in range(n_hidden):\n",
216 | " wh = np.array(w[h])\n",
217 | " bh = b[h]\n",
218 | " hidden = []\n",
219 | " for i in range(hidden_q):\n",
220 | " wi = np.array(wh[i, :])\n",
221 | " ah = np.dot(hidden_input, wi)-np.array(bh)[i]\n",
222 | " hidden.append(sigmoid(ah))\n",
223 | " hidden_input = np.array(hidden)\n",
224 | " output = []\n",
225 | " for j in range(out_l):\n",
226 | " print(j, hidden_input, Wout[j, :], Bout[j])\n",
227 | " wj = Wout[j, :]\n",
228 | " bj = np.dot(hidden_input, wj)-Bout[j]\n",
229 | " output.append(sigmoid(bj))\n",
230 | " output = np.array(output)\n",
231 | " return output"
232 | ]
233 | },
234 | {
235 | "cell_type": "code",
236 | "execution_count": 121,
237 | "metadata": {},
238 | "outputs": [
239 | {
240 | "name": "stdout",
241 | "output_type": "stream",
242 | "text": [
243 | "0 [1 0] [1 1] 0.5\n"
244 | ]
245 | }
246 | ],
247 | "source": [
248 | "x = [1, 0]\n",
249 | "w = np.array([\n",
250 | " [[1, 1]]\n",
251 | "])\n",
252 | "theata = [[0.5]]\n",
253 | "a=foward(x, w, theata, n_hidden=0, hidden_q=0, out_l=1 )"
254 | ]
255 | },
256 | {
257 | "cell_type": "code",
258 | "execution_count": 125,
259 | "metadata": {},
260 | "outputs": [
261 | {
262 | "name": "stdout",
263 | "output_type": "stream",
264 | "text": [
265 | "0 [ 0.62245933 0.62245933 0.62245933] [1 1 1] 0.5\n"
266 | ]
267 | },
268 | {
269 | "data": {
270 | "text/plain": [
271 | "array([ 0.7969562])"
272 | ]
273 | },
274 | "execution_count": 125,
275 | "metadata": {},
276 | "output_type": "execute_result"
277 | }
278 | ],
279 | "source": [
280 | "x = [1, 1, 1]\n",
281 | "w = np.array([\n",
282 | " [[1, -1, 1],[-1, 1, 1], [1, 1, -1]],\n",
283 | " [[1, 1, 1]]\n",
284 | "])\n",
285 | "theata = np.array([\n",
286 | " [0.5, 0.5, 0.5],\n",
287 | " [0.5]\n",
288 | "])\n",
289 | "foward(x, w, theata, n_hidden=1, hidden_q=3, out_l=1 )"
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "execution_count": null,
295 | "metadata": {},
296 | "outputs": [],
297 | "source": []
298 | }
299 | ],
300 | "metadata": {
301 | "kernelspec": {
302 | "display_name": "Python 3",
303 | "language": "python",
304 | "name": "python3"
305 | },
306 | "language_info": {
307 | "codemirror_mode": {
308 | "name": "ipython",
309 | "version": 3
310 | },
311 | "file_extension": ".py",
312 | "mimetype": "text/x-python",
313 | "name": "python",
314 | "nbconvert_exporter": "python",
315 | "pygments_lexer": "ipython3",
316 | "version": "3.6.1"
317 | }
318 | },
319 | "nbformat": 4,
320 | "nbformat_minor": 2
321 | }
322 |
--------------------------------------------------------------------------------
/线性模型/.ipynb_checkpoints/untitled-checkpoint.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/.ipynb_checkpoints/untitled-checkpoint.txt
--------------------------------------------------------------------------------
/线性模型/.ipynb_checkpoints/untitled1-checkpoint.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/.ipynb_checkpoints/untitled1-checkpoint.txt
--------------------------------------------------------------------------------
/线性模型/Images/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/Images/1.jpg
--------------------------------------------------------------------------------
/线性模型/Images/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/Images/2.jpg
--------------------------------------------------------------------------------
/线性模型/Images/2_01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/Images/2_01.jpg
--------------------------------------------------------------------------------
/线性模型/Images/2_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/Images/2_1.jpg
--------------------------------------------------------------------------------
/线性模型/Images/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/线性模型/Images/3.jpg
--------------------------------------------------------------------------------
/线性模型/LogisticRegression.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "\n",
8 | "# 2 逻辑回归(logistic regression)\n",
9 | " 在分类问题中,我们要预测的y值是离散的值,我们将运用到逻辑回归(logistic regression)算法。在分类问题中,我们期望预测的值属于某一类。以二分类任务为例,其输出标签值$y\\in\\{0, 1\\}$,而线性回归模型产生的预测值$z=w^Tx+b$是实数值,于是我们需将$z$转换为$0/1$,最理想的是单位阶跃函数,如下图所示。\n",
10 | "\n",
11 | "\n",
12 | "\n",
13 | "然而单位阶跃函数不连续,于是我们希望能找到能在一定程度上近似单位阶跃函数的“替代函数”,并希望它单调可微,Sigmoid函数正是这样一个函数:\n",
14 | "$$ y= f(x,w,b)=\\frac{1}{1+e^{-(w^Tx+b)}}$$\n",
15 | "\n",
16 | "\n",
17 | "\n",
18 | "上式可以变化为:\n",
19 | "$$ ln\\frac{y}{1-y} = w^Tx+b$$\n",
20 | "我们将$y$值视为样本$x$为正例的可能性,则$1-y$为其反例的可能性。若将$y$视为类后验概率$p(y=1|x)$,则$1-y$为 后验概率$p(y=0|x)$,因而有\n",
21 | "$$ ln\\frac{p(y=1|x)}{p(y=0|x)} = w^Tx+b$$\n",
22 | "显然有:\n",
23 | "$$p(y=1|x)=\\frac{e^{(w^Tx+b)}}{1+e^{(w^Tx+b)}}$$\n",
24 | "$$p(y=0|x)=\\frac{1}{1+e^{(w^Tx+b)}}$$\n",
25 | "于是上述公式可以改写为:\n",
26 | "$$p(y=i|x_i;w,b)=y_i p(y=1|x_i;w,b) + (1-y_i) p(y=0|x_i;w,b)$$\n",
27 | "于是我们可以通过‘极大似然法’来估计$w$和$b$,即是下式最大化:\n",
28 | "$$l(w,b) = \\sum_{i=1}^{m}ln p(y=i|x_i;w,b)$$\n",
29 | "等价于使下式最小化\n",
30 | "$$ J(w,b)=-1/m\\sum_{i=1}^{m}ln p(y=i|x_i;w,b)=-1/m\\sum_{i=1}^{m}ln y_i p(y=1|x_i;w,b) + (1-y_i) p(y=0|x_i;w,b)$$\n",
31 | "因而$J(w,b)$即为逻辑回归的代价函数。\n",
32 | "\n"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 113,
38 | "metadata": {},
39 | "outputs": [],
40 | "source": [
41 | "%matplotlib inline\n",
42 | "from sklearn.datasets import make_blobs\n",
43 | "import matplotlib.pyplot as plt\n",
44 | "import numpy as np"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 114,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": [
53 | "x, y = make_blobs(n_features=1, n_samples=100, centers=2)\n"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": 115,
59 | "metadata": {},
60 | "outputs": [
61 | {
62 | "data": {
63 | "text/plain": [
64 | ""
65 | ]
66 | },
67 | "execution_count": 115,
68 | "metadata": {},
69 | "output_type": "execute_result"
70 | },
71 | {
72 | "data": {
73 | "image/png": "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\nQP8PKiTkOWFgz58AAAAASUVORK5CYII=\n",
74 | "text/plain": [
75 | ""
76 | ]
77 | },
78 | "metadata": {},
79 | "output_type": "display_data"
80 | }
81 | ],
82 | "source": [
83 | "plt.scatter(x, y, c=y, s=10, cmap='winter')"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 116,
89 | "metadata": {},
90 | "outputs": [],
91 | "source": [
92 | "def model(x, w):\n",
93 | " return 1/(np.exp(-w*x)+1)\n",
94 | "\n",
95 | "def CostFunction(x, y, w):\n",
96 | " m = len(x)\n",
97 | " error = 0\n",
98 | " for xi, yi in zip(x, y):\n",
99 | " error += yi*np.log10(model(xi, w)) + (1-yi)*np.log10(1-model(xi, w))\n",
100 | " return -1*error/m"
101 | ]
102 | },
103 | {
104 | "cell_type": "code",
105 | "execution_count": 117,
106 | "metadata": {},
107 | "outputs": [],
108 | "source": [
109 | "# 定义梯度下降函数求解\n",
110 | "\n",
111 | "def GradientDescent(x, y, w, alpha):\n",
112 | " tem = [w]\n",
113 | " eps = 10\n",
114 | " while abs(eps) > 0.0005:\n",
115 | " g = (CostFunction(x, y, w+0.01)-CostFunction(x, y, w-0.01))/0.02\n",
116 | " w = w - g*alpha\n",
117 | " eps = w - tem[-1]\n",
118 | " tem.append(w)\n",
119 | " return tem"
120 | ]
121 | },
122 | {
123 | "cell_type": "code",
124 | "execution_count": 118,
125 | "metadata": {},
126 | "outputs": [
127 | {
128 | "data": {
129 | "text/plain": [
130 | "[]"
131 | ]
132 | },
133 | "execution_count": 118,
134 | "metadata": {},
135 | "output_type": "execute_result"
136 | },
137 | {
138 | "data": {
139 | "image/png": "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\n",
140 | "text/plain": [
141 | ""
142 | ]
143 | },
144 | "metadata": {},
145 | "output_type": "display_data"
146 | }
147 | ],
148 | "source": [
149 | "# 代价函数可视化\n",
150 | "\n",
151 | "error_w = np.linspace(0, 3, 100)\n",
152 | "error = []\n",
153 | "for wi in error_w:\n",
154 | " error.append(CostFunction(x, y, wi))\n",
155 | "plt.plot(error_w, error)"
156 | ]
157 | },
158 | {
159 | "cell_type": "code",
160 | "execution_count": 119,
161 | "metadata": {},
162 | "outputs": [
163 | {
164 | "data": {
165 | "text/plain": [
166 | "[]"
167 | ]
168 | },
169 | "execution_count": 119,
170 | "metadata": {},
171 | "output_type": "execute_result"
172 | },
173 | {
174 | "data": {
175 | "image/png": "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\n",
176 | "text/plain": [
177 | ""
178 | ]
179 | },
180 | "metadata": {},
181 | "output_type": "display_data"
182 | }
183 | ],
184 | "source": [
185 | "# 梯度下降可视化(学习率为0.5),w初始值为0\n",
186 | "\n",
187 | "tem = GradientDescent(x, y, 0, 0.5)\n",
188 | "error_tem = [CostFunction(x, y, tem_i) for tem_i in tem]\n",
189 | "plt.plot(error_w , error)\n",
190 | "plt.plot(tem, error_tem)\n"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": 120,
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "data": {
200 | "text/plain": [
201 | "[]"
202 | ]
203 | },
204 | "execution_count": 120,
205 | "metadata": {},
206 | "output_type": "execute_result"
207 | },
208 | {
209 | "data": {
210 | "image/png": "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\n",
211 | "text/plain": [
212 | ""
213 | ]
214 | },
215 | "metadata": {},
216 | "output_type": "display_data"
217 | }
218 | ],
219 | "source": [
220 | "# 梯度下降可视化(学习率为0.1),w初始值为0\n",
221 | "\n",
222 | "tem = GradientDescent(x, y, 0, 0.1)\n",
223 | "error_tem = [CostFunction(x, y, tem_i) for tem_i in tem]\n",
224 | "plt.plot(error_w , error)\n",
225 | "plt.plot(tem, error_tem)\n"
226 | ]
227 | },
228 | {
229 | "cell_type": "code",
230 | "execution_count": 121,
231 | "metadata": {},
232 | "outputs": [
233 | {
234 | "data": {
235 | "text/plain": [
236 | "[]"
237 | ]
238 | },
239 | "execution_count": 121,
240 | "metadata": {},
241 | "output_type": "execute_result"
242 | },
243 | {
244 | "data": {
245 | "image/png": "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\n7bG3AAAAAElFTkSuQmCC\n",
246 | "text/plain": [
247 | ""
248 | ]
249 | },
250 | "metadata": {},
251 | "output_type": "display_data"
252 | }
253 | ],
254 | "source": [
255 | "# 预测y值与训练集进行比较(w=2)\n",
256 | "\n",
257 | "plt.scatter(x, y, c=y, cmap='winter', s=20)\n",
258 | "x_range = np.linspace(-8, 8, 50)\n",
259 | "y_pred = [model(xi, tem[-1]) for xi in x_range ]\n",
260 | "plt.plot(x_range, y_pred, c='r')"
261 | ]
262 | },
263 | {
264 | "cell_type": "code",
265 | "execution_count": 122,
266 | "metadata": {},
267 | "outputs": [
268 | {
269 | "data": {
270 | "text/plain": [
271 | "[]"
272 | ]
273 | },
274 | "execution_count": 122,
275 | "metadata": {},
276 | "output_type": "execute_result"
277 | },
278 | {
279 | "data": {
280 | "image/png": "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\n",
281 | "text/plain": [
282 | ""
283 | ]
284 | },
285 | "metadata": {},
286 | "output_type": "display_data"
287 | }
288 | ],
289 | "source": [
290 | "# 预测y值与训练集进行比较(w=0.8)\n",
291 | "\n",
292 | "plt.scatter(x, y, c=y, cmap='winter', s=20)\n",
293 | "x_range = np.linspace(-8, 8, 50)\n",
294 | "y_pred = [model(xi, 0.8) for xi in x_range ]\n",
295 | "plt.plot(x_range, y_pred, c='r')"
296 | ]
297 | },
298 | {
299 | "cell_type": "markdown",
300 | "metadata": {},
301 | "source": [
302 | "# 利用sklearn 实现逻辑回归"
303 | ]
304 | },
305 | {
306 | "cell_type": "code",
307 | "execution_count": 124,
308 | "metadata": {},
309 | "outputs": [],
310 | "source": [
311 | "from sklearn.linear_model import LogisticRegression"
312 | ]
313 | },
314 | {
315 | "cell_type": "code",
316 | "execution_count": 125,
317 | "metadata": {},
318 | "outputs": [
319 | {
320 | "ename": "AttributeError",
321 | "evalue": "'LogisticRegression' object has no attribute 'pred'",
322 | "output_type": "error",
323 | "traceback": [
324 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
325 | "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
326 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mLR\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mLogisticRegression\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mLR\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0my_pred\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mLR\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpred\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_range\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mc\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'winter'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_range\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_pred\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
327 | "\u001b[1;31mAttributeError\u001b[0m: 'LogisticRegression' object has no attribute 'pred'"
328 | ]
329 | }
330 | ],
331 | "source": [
332 | "LR = LogisticRegression()\n",
333 | "LR.fit(x, y)\n",
334 | "y_pred = LR.predict(x_range)\n",
335 | "plt.scatter(x, y, c=y, cmap='winter')\n",
336 | "plt.plot(x_range, y_pred)"
337 | ]
338 | },
339 | {
340 | "cell_type": "code",
341 | "execution_count": 1,
342 | "metadata": {},
343 | "outputs": [
344 | {
345 | "ename": "NameError",
346 | "evalue": "name 'x_range' is not defined",
347 | "output_type": "error",
348 | "traceback": [
349 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
350 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
351 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mx_range\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
352 | "\u001b[1;31mNameError\u001b[0m: name 'x_range' is not defined"
353 | ]
354 | }
355 | ],
356 | "source": [
357 | "x_range"
358 | ]
359 | },
360 | {
361 | "cell_type": "code",
362 | "execution_count": null,
363 | "metadata": {},
364 | "outputs": [],
365 | "source": []
366 | }
367 | ],
368 | "metadata": {
369 | "kernelspec": {
370 | "display_name": "Python 3",
371 | "language": "python",
372 | "name": "python3"
373 | },
374 | "language_info": {
375 | "codemirror_mode": {
376 | "name": "ipython",
377 | "version": 3
378 | },
379 | "file_extension": ".py",
380 | "mimetype": "text/x-python",
381 | "name": "python",
382 | "nbconvert_exporter": "python",
383 | "pygments_lexer": "ipython3",
384 | "version": "3.6.1"
385 | }
386 | },
387 | "nbformat": 4,
388 | "nbformat_minor": 2
389 | }
390 |
--------------------------------------------------------------------------------
/逻辑回归模型/Images/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/逻辑回归模型/Images/1.jpg
--------------------------------------------------------------------------------
/逻辑回归模型/Images/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/逻辑回归模型/Images/2.jpg
--------------------------------------------------------------------------------
/逻辑回归模型/Images/2_01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/逻辑回归模型/Images/2_01.jpg
--------------------------------------------------------------------------------
/逻辑回归模型/Images/2_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/逻辑回归模型/Images/2_1.jpg
--------------------------------------------------------------------------------
/逻辑回归模型/Images/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/1003761102/Machine_learning_notes/79033aee936855c0da7168ddf1b012d888cd92c2/逻辑回归模型/Images/3.jpg
--------------------------------------------------------------------------------
/逻辑回归模型/LogisticRegression.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "\n",
8 | "# 2 逻辑回归(logistic regression)\n",
9 | " 在分类问题中,我们要预测的y值是离散的值,我们将运用到逻辑回归(logistic regression)算法。在分类问题中,我们期望预测的值属于某一类。以二分类任务为例,其输出标签值$y\\in\\{0, 1\\}$,而线性回归模型产生的预测值$z=w^Tx+b$是实数值,于是我们需将$z$转换为$0/1$,最理想的是单位阶跃函数,如下图所示。\n",
10 | "\n",
11 | "\n",
12 | "\n",
13 | "然而单位阶跃函数不连续,于是我们希望能找到能在一定程度上近似单位阶跃函数的“替代函数”,并希望它单调可微,Sigmoid函数正是这样一个函数:\n",
14 | "$$ y= f(x,w,b)=\\frac{1}{1+e^{-(w^Tx+b)}}$$\n",
15 | "\n",
16 | "\n",
17 | "\n",
18 | "上式可以变化为:\n",
19 | "$$ ln\\frac{y}{1-y} = w^Tx+b$$\n",
20 | "我们将$y$值视为样本$x$为正例的可能性,则$1-y$为其反例的可能性。若将$y$视为类后验概率$p(y=1|x)$,则$1-y$为 后验概率$p(y=0|x)$,因而有\n",
21 | "$$ ln\\frac{p(y=1|x)}{p(y=0|x)} = w^Tx+b$$\n",
22 | "显然有:\n",
23 | "$$p(y=1|x)=\\frac{e^{(w^Tx+b)}}{1+e^{(w^Tx+b)}}$$\n",
24 | "$$p(y=0|x)=\\frac{1}{1+e^{(w^Tx+b)}}$$\n",
25 | "于是上述公式可以改写为:\n",
26 | "$$p(y=i|x_i;w,b)=y_i p(y=1|x_i;w,b) + (1-y_i) p(y=0|x_i;w,b)$$\n",
27 | "于是我们可以通过‘极大似然法’来估计$w$和$b$,即是下式最大化:\n",
28 | "$$l(w,b) = \\sum_{i=1}^{m}ln p(y=i|x_i;w,b)$$\n",
29 | "等价于使下式最小化\n",
30 | "$$ J(w,b)=-1/m\\sum_{i=1}^{m}ln p(y=i|x_i;w,b)=-1/m\\sum_{i=1}^{m}ln y_i p(y=1|x_i;w,b) + (1-y_i) p(y=0|x_i;w,b)$$\n",
31 | "因而$J(w,b)$即为逻辑回归的代价函数。\n",
32 | "\n"
33 | ]
34 | },
35 | {
36 | "cell_type": "code",
37 | "execution_count": 113,
38 | "metadata": {},
39 | "outputs": [],
40 | "source": [
41 | "%matplotlib inline\n",
42 | "from sklearn.datasets import make_blobs\n",
43 | "import matplotlib.pyplot as plt\n",
44 | "import numpy as np"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 114,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": [
53 | "x, y = make_blobs(n_features=1, n_samples=100, centers=2)\n"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": 115,
59 | "metadata": {},
60 | "outputs": [
61 | {
62 | "data": {
63 | "text/plain": [
64 | ""
65 | ]
66 | },
67 | "execution_count": 115,
68 | "metadata": {},
69 | "output_type": "execute_result"
70 | },
71 | {
72 | "data": {
73 | "image/png": "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\nQP8PKiTkOWFgz58AAAAASUVORK5CYII=\n",
74 | "text/plain": [
75 | ""
76 | ]
77 | },
78 | "metadata": {},
79 | "output_type": "display_data"
80 | }
81 | ],
82 | "source": [
83 | "plt.scatter(x, y, c=y, s=10, cmap='winter')"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 116,
89 | "metadata": {},
90 | "outputs": [],
91 | "source": [
92 | "def model(x, w):\n",
93 | " return 1/(np.exp(-w*x)+1)\n",
94 | "\n",
95 | "def CostFunction(x, y, w):\n",
96 | " m = len(x)\n",
97 | " error = 0\n",
98 | " for xi, yi in zip(x, y):\n",
99 | " error += yi*np.log10(model(xi, w)) + (1-yi)*np.log10(1-model(xi, w))\n",
100 | " return -1*error/m"
101 | ]
102 | },
103 | {
104 | "cell_type": "code",
105 | "execution_count": 117,
106 | "metadata": {},
107 | "outputs": [],
108 | "source": [
109 | "# 定义梯度下降函数求解\n",
110 | "\n",
111 | "def GradientDescent(x, y, w, alpha):\n",
112 | " tem = [w]\n",
113 | " eps = 10\n",
114 | " while abs(eps) > 0.0005:\n",
115 | " g = (CostFunction(x, y, w+0.01)-CostFunction(x, y, w-0.01))/0.02\n",
116 | " w = w - g*alpha\n",
117 | " eps = w - tem[-1]\n",
118 | " tem.append(w)\n",
119 | " return tem"
120 | ]
121 | },
122 | {
123 | "cell_type": "code",
124 | "execution_count": 118,
125 | "metadata": {},
126 | "outputs": [
127 | {
128 | "data": {
129 | "text/plain": [
130 | "[]"
131 | ]
132 | },
133 | "execution_count": 118,
134 | "metadata": {},
135 | "output_type": "execute_result"
136 | },
137 | {
138 | "data": {
139 | "image/png": "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\n",
140 | "text/plain": [
141 | ""
142 | ]
143 | },
144 | "metadata": {},
145 | "output_type": "display_data"
146 | }
147 | ],
148 | "source": [
149 | "# 代价函数可视化\n",
150 | "\n",
151 | "error_w = np.linspace(0, 3, 100)\n",
152 | "error = []\n",
153 | "for wi in error_w:\n",
154 | " error.append(CostFunction(x, y, wi))\n",
155 | "plt.plot(error_w, error)"
156 | ]
157 | },
158 | {
159 | "cell_type": "code",
160 | "execution_count": 119,
161 | "metadata": {},
162 | "outputs": [
163 | {
164 | "data": {
165 | "text/plain": [
166 | "[]"
167 | ]
168 | },
169 | "execution_count": 119,
170 | "metadata": {},
171 | "output_type": "execute_result"
172 | },
173 | {
174 | "data": {
175 | "image/png": "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\n",
176 | "text/plain": [
177 | ""
178 | ]
179 | },
180 | "metadata": {},
181 | "output_type": "display_data"
182 | }
183 | ],
184 | "source": [
185 | "# 梯度下降可视化(学习率为0.5),w初始值为0\n",
186 | "\n",
187 | "tem = GradientDescent(x, y, 0, 0.5)\n",
188 | "error_tem = [CostFunction(x, y, tem_i) for tem_i in tem]\n",
189 | "plt.plot(error_w , error)\n",
190 | "plt.plot(tem, error_tem)\n"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": 120,
196 | "metadata": {},
197 | "outputs": [
198 | {
199 | "data": {
200 | "text/plain": [
201 | "[]"
202 | ]
203 | },
204 | "execution_count": 120,
205 | "metadata": {},
206 | "output_type": "execute_result"
207 | },
208 | {
209 | "data": {
210 | "image/png": "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\n",
211 | "text/plain": [
212 | ""
213 | ]
214 | },
215 | "metadata": {},
216 | "output_type": "display_data"
217 | }
218 | ],
219 | "source": [
220 | "# 梯度下降可视化(学习率为0.1),w初始值为0\n",
221 | "\n",
222 | "tem = GradientDescent(x, y, 0, 0.1)\n",
223 | "error_tem = [CostFunction(x, y, tem_i) for tem_i in tem]\n",
224 | "plt.plot(error_w , error)\n",
225 | "plt.plot(tem, error_tem)\n"
226 | ]
227 | },
228 | {
229 | "cell_type": "code",
230 | "execution_count": 121,
231 | "metadata": {},
232 | "outputs": [
233 | {
234 | "data": {
235 | "text/plain": [
236 | "[]"
237 | ]
238 | },
239 | "execution_count": 121,
240 | "metadata": {},
241 | "output_type": "execute_result"
242 | },
243 | {
244 | "data": {
245 | "image/png": "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\n7bG3AAAAAElFTkSuQmCC\n",
246 | "text/plain": [
247 | ""
248 | ]
249 | },
250 | "metadata": {},
251 | "output_type": "display_data"
252 | }
253 | ],
254 | "source": [
255 | "# 预测y值与训练集进行比较(w=2)\n",
256 | "\n",
257 | "plt.scatter(x, y, c=y, cmap='winter', s=20)\n",
258 | "x_range = np.linspace(-8, 8, 50)\n",
259 | "y_pred = [model(xi, tem[-1]) for xi in x_range ]\n",
260 | "plt.plot(x_range, y_pred, c='r')"
261 | ]
262 | },
263 | {
264 | "cell_type": "code",
265 | "execution_count": 122,
266 | "metadata": {},
267 | "outputs": [
268 | {
269 | "data": {
270 | "text/plain": [
271 | "[]"
272 | ]
273 | },
274 | "execution_count": 122,
275 | "metadata": {},
276 | "output_type": "execute_result"
277 | },
278 | {
279 | "data": {
280 | "image/png": "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\n",
281 | "text/plain": [
282 | ""
283 | ]
284 | },
285 | "metadata": {},
286 | "output_type": "display_data"
287 | }
288 | ],
289 | "source": [
290 | "# 预测y值与训练集进行比较(w=0.8)\n",
291 | "\n",
292 | "plt.scatter(x, y, c=y, cmap='winter', s=20)\n",
293 | "x_range = np.linspace(-8, 8, 50)\n",
294 | "y_pred = [model(xi, 0.8) for xi in x_range ]\n",
295 | "plt.plot(x_range, y_pred, c='r')"
296 | ]
297 | },
298 | {
299 | "cell_type": "markdown",
300 | "metadata": {},
301 | "source": [
302 | "# 利用sklearn 实现逻辑回归"
303 | ]
304 | },
305 | {
306 | "cell_type": "code",
307 | "execution_count": 124,
308 | "metadata": {},
309 | "outputs": [],
310 | "source": [
311 | "from sklearn.linear_model import LogisticRegression"
312 | ]
313 | },
314 | {
315 | "cell_type": "code",
316 | "execution_count": 125,
317 | "metadata": {},
318 | "outputs": [
319 | {
320 | "ename": "AttributeError",
321 | "evalue": "'LogisticRegression' object has no attribute 'pred'",
322 | "output_type": "error",
323 | "traceback": [
324 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
325 | "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
326 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mLR\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mLogisticRegression\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mLR\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0my_pred\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mLR\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpred\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_range\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mc\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'winter'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_range\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_pred\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
327 | "\u001b[1;31mAttributeError\u001b[0m: 'LogisticRegression' object has no attribute 'pred'"
328 | ]
329 | }
330 | ],
331 | "source": [
332 | "LR = LogisticRegression()\n",
333 | "LR.fit(x, y)\n",
334 | "y_pred = LR.predict(x_range)\n",
335 | "plt.scatter(x, y, c=y, cmap='winter')\n",
336 | "plt.plot(x_range, y_pred)"
337 | ]
338 | },
339 | {
340 | "cell_type": "code",
341 | "execution_count": 1,
342 | "metadata": {},
343 | "outputs": [
344 | {
345 | "ename": "NameError",
346 | "evalue": "name 'x_range' is not defined",
347 | "output_type": "error",
348 | "traceback": [
349 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
350 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
351 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mx_range\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
352 | "\u001b[1;31mNameError\u001b[0m: name 'x_range' is not defined"
353 | ]
354 | }
355 | ],
356 | "source": [
357 | "x_range"
358 | ]
359 | },
360 | {
361 | "cell_type": "code",
362 | "execution_count": null,
363 | "metadata": {},
364 | "outputs": [],
365 | "source": []
366 | }
367 | ],
368 | "metadata": {
369 | "kernelspec": {
370 | "display_name": "Python 3",
371 | "language": "python",
372 | "name": "python3"
373 | },
374 | "language_info": {
375 | "codemirror_mode": {
376 | "name": "ipython",
377 | "version": 3
378 | },
379 | "file_extension": ".py",
380 | "mimetype": "text/x-python",
381 | "name": "python",
382 | "nbconvert_exporter": "python",
383 | "pygments_lexer": "ipython3",
384 | "version": "3.6.1"
385 | }
386 | },
387 | "nbformat": 4,
388 | "nbformat_minor": 2
389 | }
390 |
--------------------------------------------------------------------------------