|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# kNN Classification\n",
- "\n",
- "\n",
- "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",
- "\n",
- "kNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的`k`个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比(组合函数)。\n",
- "\n",
- "该算法存在的问题:\n",
- "1. 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。在这种情况下可能会产生误判的结果。因此我们需要减少数量对运行结果的影响。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。\n",
- "2. 计算量较大,因为对每一个待分类的数据都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。\n",
- "\n",
- "kNN可以说是一种最直接的用来分类未知数据的方法。基本通过下面这张图跟文字说明就可以明白kNN是干什么的\n",
- "\n",
- "\n",
- "简单来说,kNN可以看成:**有那么一堆你已经知道分类的数据,然后当一个新数据进入的时候,就开始跟训练数据里的每个点求距离,然后挑选这个训练数据最近的K个点,看看这几个点属于什么类型,然后用少数服从多数的原则,给新数据归类**。\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 1. 算法步骤:\n",
- "\n",
- "1. 准备数据,对数据进行预处理;\n",
- "2. 计算测试数据与各个训练数据之间的**距离**;\n",
- "3. 按照距离的递增关系进行排序;\n",
- "4. 选取距离最小的`k`个点;\n",
- "5. 确定前`k`个点所在类别的出现频率;\n",
- "6. 返回前`k`个点中出现频率最高的类别作为测试数据的预测分类。\n",
- "\n",
- "上述的处理过程,难点有哪些?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 2. 生成数据"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "# data generation (FIXME: feature name not good)\n",
- "np.random.seed(314)\n",
- "data_size_1 = 300\n",
- "x1_1 = np.random.normal(loc=5.0, scale=1.0, size=data_size_1)\n",
- "x2_1 = np.random.normal(loc=4.0, scale=1.0, size=data_size_1)\n",
- "y_1 = [0 for _ in range(data_size_1)]\n",
- "\n",
- "data_size_2 = 400\n",
- "x1_2 = np.random.normal(loc=10.0, scale=2.0, size=data_size_2)\n",
- "x2_2 = np.random.normal(loc=8.0, scale=2.0, size=data_size_2)\n",
- "y_2 = [1 for _ in range(data_size_2)]\n",
- "\n",
- "x1 = np.concatenate((x1_1, x1_2), axis=0)\n",
- "x2 = np.concatenate((x2_1, x2_2), axis=0)\n",
- "x = np.hstack((x1.reshape(-1,1), x2.reshape(-1,1)))\n",
- "y = np.concatenate((y_1, y_2), axis=0)\n",
- "\n",
- "data_size_all = data_size_1+data_size_2\n",
- "shuffled_index = np.random.permutation(data_size_all)\n",
- "x = x[shuffled_index]\n",
- "y = y[shuffled_index]\n",
- "\n",
- "split_index = int(data_size_all*0.7)\n",
- "x_train = x[:split_index]\n",
- "y_train = y[:split_index]\n",
- "x_test = x[split_index:]\n",
- "y_test = y[split_index:]\n",
- "\n",
- "\n",
- "# visualize data\n",
- "plt.scatter(x_train[:,0], x_train[:,1], c=y_train, marker='.')\n",
- "plt.title(\"train data\")\n",
- "plt.show()\n",
- "plt.scatter(x_test[:,0], x_test[:,1], c=y_test, marker='.')\n",
- "plt.title(\"test data\")\n",
- "plt.show()\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 3. 最简单的程序实现"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[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, 0, 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, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 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, 0, 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, 1, 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, 0, 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, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1]\n"
- ]
- }
- ],
- "source": [
- "import numpy as np\n",
- "import operator\n",
- "\n",
- "def knn_distance(v1, v2):\n",
- " return np.sum(np.square(v1-v2))\n",
- "\n",
- "def knn_vote(ys):\n",
- " vote_dict = {}\n",
- " \n",
- " maxv = 0\n",
- " maxk = 0\n",
- " for y in ys:\n",
- " if y not in vote_dict.keys():\n",
- " vote_dict[y] = 1\n",
- " else:\n",
- " vote_dict[y] += 1\n",
- " if maxv < vote_dict[y]:\n",
- " maxv = vote_dict[y]\n",
- " maxk = y\n",
- " return maxk\n",
- "\n",
- " sorted_vote_dict = sorted(vote_dict.items(), \\\n",
- " #key=operator.itemgetter(1), \\\n",
- " key=lambda x:x[1], \\\n",
- " reverse=True)\n",
- " return sorted_vote_dict[0][0]\n",
- " \n",
- "def knn_predict(x, train_x, train_y, k=3):\n",
- " dist_arr = [knn_distance(x, train_x[j]) for j in range(len(train_x))]\n",
- " sorted_index = np.argsort(dist_arr)\n",
- " top_k_index = sorted_index[:k]\n",
- " ys=train_y[top_k_index]\n",
- " return knn_vote(ys)\n",
- " \n",
- "\n",
- "#a = knn_predict(x_train[0], x_train, y_train)\n",
- "\n",
- "y_train_est = [knn_predict(x_train[i], x_train, y_train) for i in range(len(x_train))]\n",
- "print(y_train_est)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train Accuracy: 98.568507%\n"
- ]
- }
- ],
- "source": [
- "n_correct = 0\n",
- "for i in range(len(x_train)):\n",
- " if y_train_est[i] == y_train[i]:\n",
- " n_correct += 1\n",
- "accuracy = n_correct / len(x_train) * 100.0\n",
- "print(\"Train Accuracy: %f%%\" % accuracy)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Test Accuracy: 96.682464%\n"
- ]
- }
- ],
- "source": [
- "y_test_est = [knn_predict(x_test[i], x_train, y_train, 3) for i in range(len(x_test))]\n",
- "n_correct = 0\n",
- "for i in range(len(x_test)):\n",
- " if y_test_est[i] == y_test[i]:\n",
- " n_correct += 1\n",
- "accuracy = n_correct / len(x_test) * 100.0\n",
- "print(\"Test Accuracy: %f%%\" % accuracy)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 4. 通过类实现kNN程序"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "import operator\n",
- "\n",
- "class KNN(object):\n",
- "\n",
- " def __init__(self, k=3):\n",
- " self.k = k\n",
- "\n",
- " def fit(self, x, y):\n",
- " self.x = x\n",
- " self.y = y\n",
- " return self\n",
- "\n",
- " def _square_distance(self, v1, v2):\n",
- " return np.sum(np.square(v1-v2))\n",
- "\n",
- " def _vote(self, ys):\n",
- " ys_unique = np.unique(ys)\n",
- " vote_dict = {}\n",
- " for y in ys:\n",
- " if y not in vote_dict.keys():\n",
- " vote_dict[y] = 1\n",
- " else:\n",
- " vote_dict[y] += 1\n",
- " sorted_vote_dict = sorted(vote_dict.items(), key=operator.itemgetter(1), reverse=True)\n",
- " return sorted_vote_dict[0][0]\n",
- "\n",
- " def predict(self, x):\n",
- " y_pred = []\n",
- " for i in range(len(x)):\n",
- " dist_arr = [self._square_distance(x[i], self.x[j]) for j in range(len(self.x))]\n",
- " sorted_index = np.argsort(dist_arr)\n",
- " top_k_index = sorted_index[:self.k]\n",
- " y_pred.append(self._vote(ys=self.y[top_k_index]))\n",
- " return np.array(y_pred)\n",
- "\n",
- " def score(self, y_true=None, y_pred=None):\n",
- " if y_true is None and y_pred is None:\n",
- " y_pred = self.predict(self.x)\n",
- " y_true = self.y\n",
- " score = 0.0\n",
- " for i in range(len(y_true)):\n",
- " if y_true[i] == y_pred[i]:\n",
- " score += 1\n",
- " score /= len(y_true)\n",
- " return score"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "train accuracy: 98.568507 %\n",
- "test accuracy: 96.682464 %\n"
- ]
- }
- ],
- "source": [
- "# data preprocessing\n",
- "#x_train = (x_train - np.min(x_train, axis=0)) / (np.max(x_train, axis=0) - np.min(x_train, axis=0))\n",
- "#x_test = (x_test - np.min(x_test, axis=0)) / (np.max(x_test, axis=0) - np.min(x_test, axis=0))\n",
- "\n",
- "# knn classifier\n",
- "clf = KNN(k=3)\n",
- "train_acc = clf.fit(x_train, y_train).score() * 100.0\n",
- "\n",
- "y_test_pred = clf.predict(x_test)\n",
- "test_acc = clf.score(y_test, y_test_pred) * 100.0\n",
- "\n",
- "print('train accuracy: %f %%' % train_acc)\n",
- "print('test accuracy: %f %%' % test_acc)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 5. sklearn program"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Feature dimensions: (1797, 64)\n",
- "Label dimensions: (1797,)\n"
- ]
- }
- ],
- "source": [
- "#% matplotlib inline\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "from sklearn import datasets, neighbors, linear_model\n",
- "\n",
- "# load data\n",
- "digits = datasets.load_digits()\n",
- "X_digits = digits.data\n",
- "y_digits = digits.target\n",
- "\n",
- "print(\"Feature dimensions: \", X_digits.shape)\n",
- "print(\"Label dimensions: \", y_digits.shape)\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 10 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# plot sample images\n",
- "nplot = 10\n",
- "fig, axes = plt.subplots(nrows=1, ncols=nplot)\n",
- "\n",
- "for i in range(nplot):\n",
- " img = X_digits[i].reshape(8, 8)\n",
- " axes[i].imshow(img)\n",
- " axes[i].set_title(y_digits[i])\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [],
- "source": [
- "# split train / test data\n",
- "n_samples = len(X_digits)\n",
- "n_train = int(0.4 * n_samples)\n",
- "\n",
- "X_train = X_digits[:n_train]\n",
- "y_train = y_digits[:n_train]\n",
- "X_test = X_digits[n_train:]\n",
- "y_test = y_digits[n_train:]\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "KNN score: 0.953661\n",
- "LogisticRegression score: 0.927711\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/home/bushuhui/anaconda3/envs/dl/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:765: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
- "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
- "\n",
- "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
- " https://scikit-learn.org/stable/modules/preprocessing.html\n",
- "Please also refer to the documentation for alternative solver options:\n",
- " https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
- " extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)\n"
- ]
- }
- ],
- "source": [
- "# do KNN classification\n",
- "knn = neighbors.KNeighborsClassifier()\n",
- "logistic = linear_model.LogisticRegression()\n",
- "\n",
- "print('KNN score: %f' % knn.fit(X_train, y_train).score(X_test, y_test))\n",
- "print('LogisticRegression score: %f' % logistic.fit(X_train, y_train).score(X_test, y_test))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 6. 深入思考\n",
- "\n",
- "* 如果输入的数据非常多,怎么快速进行距离计算?\n",
- " - [kd-tree](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KDTree.html#sklearn.neighbors.KDTree) \n",
- " - Fast Library for Approximate Nearest Neighbors (FLANN)\n",
- " - [PyNNDescent for fast Approximate Nearest Neighbors](https://pynndescent.readthedocs.io/en/latest/)\n",
- "* 如何选择最好的`k`?\n",
- " - https://zhuanlan.zhihu.com/p/143092725\n",
- "* kNN存在的问题?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## References\n",
- "* [Digits Classification Exercise](http://scikit-learn.org/stable/auto_examples/exercises/plot_digits_classification_exercise.html)\n",
- "* [knn算法的原理与实现](https://zhuanlan.zhihu.com/p/36549000)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.8.5"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
|