You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

knn_classification.ipynb 89 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. {
  2. "cells": [
  3. {
  4. "cell_type": "markdown",
  5. "metadata": {},
  6. "source": [
  7. "# kNN Classification\n",
  8. "\n",
  9. "\n",
  10. "K最近邻(k-Nearest Neighbor,kNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:***如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别***。kNN方法虽然从原理上也依赖于[极限定理](https://baike.baidu.com/item/%E6%9E%81%E9%99%90%E5%AE%9A%E7%90%86/13672616),但在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。\n",
  11. "\n",
  12. "kNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的`k`个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比(组合函数)。\n",
  13. "\n",
  14. "该算法存在的问题:\n",
  15. "1. 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。在这种情况下可能会产生误判的结果。因此我们需要减少数量对运行结果的影响。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。\n",
  16. "2. 计算量较大,因为对每一个待分类的数据都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。\n",
  17. "\n",
  18. "kNN可以说是一种最直接的用来分类未知数据的方法。基本通过下面这张图跟文字说明就可以明白kNN是干什么的\n",
  19. "![knn](images/knn.png)\n",
  20. "\n",
  21. "简单来说,kNN可以看成:**有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑选这个训练数据最近的K个点,看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类**。\n"
  22. ]
  23. },
  24. {
  25. "cell_type": "markdown",
  26. "metadata": {},
  27. "source": [
  28. "## 1. 算法步骤:\n",
  29. "\n",
  30. "输入:\n",
  31. "* 训练数据: $T=\\{(x_1,y_1),(x_2,y_2), ..., (x_N,y_N)\\}$, 其中$x_i \\in X=R^n$,$y_i \\in Y = {0, 1, ..., K-1}$,i=1,2...N\n",
  32. "* 用户输入数据:x_u\n",
  33. "\n",
  34. "输出:预测的最优类别$y_{pred}$\n",
  35. "\n",
  36. "\n",
  37. "1. 准备数据,对数据进行预处理;\n",
  38. "2. 计算测试数据与各个训练数据之间的**距离**;\n",
  39. "3. 按照距离的递增关系进行排序;\n",
  40. "4. 选取距离最小的`k`个点;\n",
  41. "5. 确定前`k`个点所在类别的出现频率;\n",
  42. "6. 返回前`k`个点中出现频率最高的类别作为测试数据的预测分类。\n",
  43. "\n",
  44. "\n",
  45. "\n",
  46. "**深入思考:**\n",
  47. "* 上述的处理过程,难点有哪些?\n",
  48. "* 每个处理步骤如何用程序语言来描述?"
  49. ]
  50. },
  51. {
  52. "cell_type": "markdown",
  53. "metadata": {},
  54. "source": [
  55. "## 2. 生成数据"
  56. ]
  57. },
  58. {
  59. "cell_type": "code",
  60. "execution_count": 1,
  61. "metadata": {},
  62. "outputs": [
  63. {
  64. "data": {
  65. "image/png": "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\n",
  66. "text/plain": [
  67. "<Figure size 432x288 with 1 Axes>"
  68. ]
  69. },
  70. "metadata": {
  71. "needs_background": "light"
  72. },
  73. "output_type": "display_data"
  74. },
  75. {
  76. "data": {
  77. "image/png": "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\n",
  78. "text/plain": [
  79. "<Figure size 432x288 with 1 Axes>"
  80. ]
  81. },
  82. "metadata": {
  83. "needs_background": "light"
  84. },
  85. "output_type": "display_data"
  86. }
  87. ],
  88. "source": [
  89. "%matplotlib inline\n",
  90. "\n",
  91. "import numpy as np\n",
  92. "import matplotlib.pyplot as plt\n",
  93. "\n",
  94. "# data generation\n",
  95. "np.random.seed(314)\n",
  96. "\n",
  97. "data_size1 = 300\n",
  98. "x1 = np.random.randn(data_size1, 2) + np.array([4,4])\n",
  99. "y1 = [0 for _ in range(data_size1)]\n",
  100. "\n",
  101. "data_size2 = 400\n",
  102. "x2 = np.random.randn(data_size2, 2)*2 + np.array([10,10])\n",
  103. "y2 = [1 for _ in range(data_size2)]\n",
  104. "\n",
  105. "\n",
  106. "# all sample data\n",
  107. "x = np.concatenate((x1, x2), axis=0)\n",
  108. "y = np.concatenate((y1, y2), axis=0)\n",
  109. "\n",
  110. "data_size_all = data_size1 + data_size2\n",
  111. "shuffled_index = np.random.permutation(data_size_all)\n",
  112. "x = x[shuffled_index]\n",
  113. "y = y[shuffled_index]\n",
  114. "\n",
  115. "# split train & test\n",
  116. "split_index = int(data_size_all*0.7)\n",
  117. "x_train = x[:split_index]\n",
  118. "y_train = y[:split_index]\n",
  119. "x_test = x[split_index:]\n",
  120. "y_test = y[split_index:]\n",
  121. "\n",
  122. "\n",
  123. "# plot data\n",
  124. "plt.scatter(x_train[:,0], x_train[:,1], c=y_train, marker='.')\n",
  125. "plt.title(\"train data\")\n",
  126. "plt.show()\n",
  127. "plt.scatter(x_test[:,0], x_test[:,1], c=y_test, marker='.')\n",
  128. "plt.title(\"test data\")\n",
  129. "plt.show()\n"
  130. ]
  131. },
  132. {
  133. "cell_type": "markdown",
  134. "metadata": {},
  135. "source": [
  136. "## 3. 最简单的程序实现"
  137. ]
  138. },
  139. {
  140. "cell_type": "code",
  141. "execution_count": 2,
  142. "metadata": {},
  143. "outputs": [
  144. {
  145. "name": "stdout",
  146. "output_type": "stream",
  147. "text": [
  148. "[0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1]\n"
  149. ]
  150. }
  151. ],
  152. "source": [
  153. "import numpy as np\n",
  154. "import operator\n",
  155. "\n",
  156. "def knn_distance(v1, v2):\n",
  157. " return np.sum(np.square(v1-v2))\n",
  158. "\n",
  159. "def knn_vote(ys):\n",
  160. " vote_dict = {}\n",
  161. " \n",
  162. " maxv = 0\n",
  163. " maxk = 0\n",
  164. " for y in ys:\n",
  165. " if y not in vote_dict.keys():\n",
  166. " vote_dict[y] = 1\n",
  167. " else:\n",
  168. " vote_dict[y] += 1\n",
  169. " if maxv < vote_dict[y]:\n",
  170. " maxv = vote_dict[y]\n",
  171. " maxk = y\n",
  172. " return maxk\n",
  173. "\n",
  174. " sorted_vote_dict = sorted(vote_dict.items(), \\\n",
  175. " #key=operator.itemgetter(1), \\\n",
  176. " key=lambda x:x[1], \\\n",
  177. " reverse=True)\n",
  178. " return sorted_vote_dict[0][0]\n",
  179. " \n",
  180. "def knn_predict(x, train_x, train_y, k=3):\n",
  181. " dist_arr = [knn_distance(x, train_x[j]) for j in range(len(train_x))]\n",
  182. " sorted_index = np.argsort(dist_arr)\n",
  183. " top_k_index = sorted_index[:k]\n",
  184. " ys=train_y[top_k_index]\n",
  185. " return knn_vote(ys)\n",
  186. " \n",
  187. "\n",
  188. "#a = knn_predict(x_train[0], x_train, y_train)\n",
  189. "\n",
  190. "y_train_est = [knn_predict(x_train[i], x_train, y_train) for i in range(len(x_train))]\n",
  191. "print(y_train_est)"
  192. ]
  193. },
  194. {
  195. "cell_type": "code",
  196. "execution_count": 3,
  197. "metadata": {},
  198. "outputs": [
  199. {
  200. "name": "stdout",
  201. "output_type": "stream",
  202. "text": [
  203. "Train Accuracy: 99.591002%\n"
  204. ]
  205. }
  206. ],
  207. "source": [
  208. "n_correct = 0\n",
  209. "for i in range(len(x_train)):\n",
  210. " if y_train_est[i] == y_train[i]:\n",
  211. " n_correct += 1\n",
  212. "accuracy = n_correct / len(x_train) * 100.0\n",
  213. "print(\"Train Accuracy: %f%%\" % accuracy)"
  214. ]
  215. },
  216. {
  217. "cell_type": "code",
  218. "execution_count": 4,
  219. "metadata": {},
  220. "outputs": [
  221. {
  222. "name": "stdout",
  223. "output_type": "stream",
  224. "text": [
  225. "Test Accuracy: 99.526066%\n"
  226. ]
  227. }
  228. ],
  229. "source": [
  230. "y_test_est = [knn_predict(x_test[i], x_train, y_train, 3) for i in range(len(x_test))]\n",
  231. "n_correct = 0\n",
  232. "for i in range(len(x_test)):\n",
  233. " if y_test_est[i] == y_test[i]:\n",
  234. " n_correct += 1\n",
  235. "accuracy = n_correct / len(x_test) * 100.0\n",
  236. "print(\"Test Accuracy: %f%%\" % accuracy)"
  237. ]
  238. },
  239. {
  240. "cell_type": "markdown",
  241. "metadata": {},
  242. "source": [
  243. "## 4. 通过类实现kNN程序"
  244. ]
  245. },
  246. {
  247. "cell_type": "code",
  248. "execution_count": 9,
  249. "metadata": {},
  250. "outputs": [],
  251. "source": [
  252. "import numpy as np\n",
  253. "import operator\n",
  254. "\n",
  255. "class KNN(object):\n",
  256. "\n",
  257. " def __init__(self, k=3):\n",
  258. " self.k = k\n",
  259. "\n",
  260. " def fit(self, x, y):\n",
  261. " self.x = x\n",
  262. " self.y = y\n",
  263. " return self\n",
  264. "\n",
  265. " def _square_distance(self, v1, v2):\n",
  266. " return np.sum(np.square(v1-v2))\n",
  267. "\n",
  268. " def _vote(self, ys):\n",
  269. " ys_unique = np.unique(ys)\n",
  270. " vote_dict = {}\n",
  271. " for y in ys:\n",
  272. " if y not in vote_dict.keys():\n",
  273. " vote_dict[y] = 1\n",
  274. " else:\n",
  275. " vote_dict[y] += 1\n",
  276. " sorted_vote_dict = sorted(vote_dict.items(), key=operator.itemgetter(1), reverse=True)\n",
  277. " return sorted_vote_dict[0][0]\n",
  278. "\n",
  279. " def predict(self, x):\n",
  280. " y_pred = []\n",
  281. " for i in range(len(x)):\n",
  282. " dist_arr = [self._square_distance(x[i], self.x[j]) for j in range(len(self.x))]\n",
  283. " sorted_index = np.argsort(dist_arr)\n",
  284. " top_k_index = sorted_index[:self.k]\n",
  285. " y_pred.append(self._vote(ys=self.y[top_k_index]))\n",
  286. " return np.array(y_pred)\n",
  287. "\n",
  288. " def score(self, y_true=None, y_pred=None):\n",
  289. " if y_true is None and y_pred is None:\n",
  290. " y_pred = self.predict(self.x)\n",
  291. " y_true = self.y\n",
  292. " score = 0.0\n",
  293. " for i in range(len(y_true)):\n",
  294. " if y_true[i] == y_pred[i]:\n",
  295. " score += 1\n",
  296. " score /= len(y_true)\n",
  297. " return score"
  298. ]
  299. },
  300. {
  301. "cell_type": "code",
  302. "execution_count": 13,
  303. "metadata": {},
  304. "outputs": [
  305. {
  306. "name": "stdout",
  307. "output_type": "stream",
  308. "text": [
  309. "train accuracy: 98.568507 %\n",
  310. "test accuracy: 96.682464 %\n"
  311. ]
  312. }
  313. ],
  314. "source": [
  315. "# data preprocessing\n",
  316. "#x_train = (x_train - np.min(x_train, axis=0)) / (np.max(x_train, axis=0) - np.min(x_train, axis=0))\n",
  317. "#x_test = (x_test - np.min(x_test, axis=0)) / (np.max(x_test, axis=0) - np.min(x_test, axis=0))\n",
  318. "\n",
  319. "# knn classifier\n",
  320. "clf = KNN(k=3)\n",
  321. "train_acc = clf.fit(x_train, y_train).score() * 100.0\n",
  322. "\n",
  323. "y_test_pred = clf.predict(x_test)\n",
  324. "test_acc = clf.score(y_test, y_test_pred) * 100.0\n",
  325. "\n",
  326. "print('train accuracy: %f %%' % train_acc)\n",
  327. "print('test accuracy: %f %%' % test_acc)"
  328. ]
  329. },
  330. {
  331. "cell_type": "markdown",
  332. "metadata": {},
  333. "source": [
  334. "## 5. sklearn program"
  335. ]
  336. },
  337. {
  338. "cell_type": "code",
  339. "execution_count": 6,
  340. "metadata": {},
  341. "outputs": [
  342. {
  343. "name": "stdout",
  344. "output_type": "stream",
  345. "text": [
  346. "Feature dimensions: (1797, 64)\n",
  347. "Label dimensions: (1797,)\n"
  348. ]
  349. }
  350. ],
  351. "source": [
  352. "#% matplotlib inline\n",
  353. "\n",
  354. "import matplotlib.pyplot as plt\n",
  355. "from sklearn import datasets, neighbors, linear_model\n",
  356. "\n",
  357. "# load data\n",
  358. "digits = datasets.load_digits()\n",
  359. "X_digits = digits.data\n",
  360. "y_digits = digits.target\n",
  361. "\n",
  362. "print(\"Feature dimensions: \", X_digits.shape)\n",
  363. "print(\"Label dimensions: \", y_digits.shape)\n"
  364. ]
  365. },
  366. {
  367. "cell_type": "code",
  368. "execution_count": 7,
  369. "metadata": {},
  370. "outputs": [
  371. {
  372. "data": {
  373. "image/png": "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\n",
  374. "text/plain": [
  375. "<Figure size 432x288 with 10 Axes>"
  376. ]
  377. },
  378. "metadata": {
  379. "needs_background": "light"
  380. },
  381. "output_type": "display_data"
  382. }
  383. ],
  384. "source": [
  385. "# plot sample images\n",
  386. "nplot = 10\n",
  387. "fig, axes = plt.subplots(nrows=1, ncols=nplot)\n",
  388. "\n",
  389. "for i in range(nplot):\n",
  390. " img = X_digits[i].reshape(8, 8)\n",
  391. " axes[i].imshow(img)\n",
  392. " axes[i].set_title(y_digits[i])\n"
  393. ]
  394. },
  395. {
  396. "cell_type": "code",
  397. "execution_count": 8,
  398. "metadata": {},
  399. "outputs": [],
  400. "source": [
  401. "# split train / test data\n",
  402. "n_samples = len(X_digits)\n",
  403. "n_train = int(0.4 * n_samples)\n",
  404. "\n",
  405. "X_train = X_digits[:n_train]\n",
  406. "y_train = y_digits[:n_train]\n",
  407. "X_test = X_digits[n_train:]\n",
  408. "y_test = y_digits[n_train:]\n"
  409. ]
  410. },
  411. {
  412. "cell_type": "code",
  413. "execution_count": 10,
  414. "metadata": {},
  415. "outputs": [
  416. {
  417. "name": "stdout",
  418. "output_type": "stream",
  419. "text": [
  420. "KNN score: 0.953661\n",
  421. "LogisticRegression score: 0.927711\n"
  422. ]
  423. },
  424. {
  425. "name": "stderr",
  426. "output_type": "stream",
  427. "text": [
  428. "/home/bushuhui/anaconda3/envs/dl/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
  429. "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
  430. "\n",
  431. "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
  432. " https://scikit-learn.org/stable/modules/preprocessing.html\n",
  433. "Please also refer to the documentation for alternative solver options:\n",
  434. " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
  435. " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n"
  436. ]
  437. }
  438. ],
  439. "source": [
  440. "# do KNN classification\n",
  441. "knn = neighbors.KNeighborsClassifier()\n",
  442. "logistic = linear_model.LogisticRegression()\n",
  443. "\n",
  444. "print('KNN score: %f' % knn.fit(X_train, y_train).score(X_test, y_test))\n",
  445. "print('LogisticRegression score: %f' % logistic.fit(X_train, y_train).score(X_test, y_test))"
  446. ]
  447. },
  448. {
  449. "cell_type": "markdown",
  450. "metadata": {},
  451. "source": [
  452. "## 6. 深入思考\n",
  453. "\n",
  454. "* 如果输入的数据非常多,怎么快速进行距离计算?\n",
  455. " - [kd-tree](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree) \n",
  456. " - Fast Library for Approximate Nearest Neighbors (FLANN)\n",
  457. " - [PyNNDescent for fast Approximate Nearest Neighbors](https://pynndescent.readthedocs.io/en/latest/)\n",
  458. "* 如何选择最好的`k`?\n",
  459. " - https://zhuanlan.zhihu.com/p/143092725\n",
  460. "* kNN存在的问题?"
  461. ]
  462. },
  463. {
  464. "cell_type": "markdown",
  465. "metadata": {},
  466. "source": [
  467. "## References\n",
  468. "* [Digits Classification Exercise](http://scikit-learn.org/stable/auto_examples/exercises/plot_digits_classification_exercise.html)\n",
  469. "* [knn算法的原理与实现](https://zhuanlan.zhihu.com/p/36549000)"
  470. ]
  471. }
  472. ],
  473. "metadata": {
  474. "kernelspec": {
  475. "display_name": "Python 3",
  476. "language": "python",
  477. "name": "python3"
  478. },
  479. "language_info": {
  480. "codemirror_mode": {
  481. "name": "ipython",
  482. "version": 3
  483. },
  484. "file_extension": ".py",
  485. "mimetype": "text/x-python",
  486. "name": "python",
  487. "nbconvert_exporter": "python",
  488. "pygments_lexer": "ipython3",
  489. "version": "3.7.9"
  490. }
  491. },
  492. "nbformat": 4,
  493. "nbformat_minor": 2
  494. }

机器学习越来越多应用到飞行器、机器人等领域,其目的是利用计算机实现类似人类的智能,从而实现装备的智能化与无人化。本课程旨在引导学生掌握机器学习的基本知识、典型方法与技术,通过具体的应用案例激发学生对该学科的兴趣,鼓励学生能够从人工智能的角度来分析、解决飞行器、机器人所面临的问题和挑战。本课程主要内容包括Python编程基础,机器学习模型,无监督学习、监督学习、深度学习基础知识与实现,并学习如何利用机器学习解决实际问题,从而全面提升自我的《综合能力》。