{"id":2966,"date":"2022-02-20T20:41:28","date_gmt":"2022-02-20T12:41:28","guid":{"rendered":"https:\/\/egonlin.com\/?p=2966"},"modified":"2022-02-20T20:41:28","modified_gmt":"2022-02-20T12:41:28","slug":"%e7%ac%ac%e4%ba%8c%e8%8a%82%ef%bc%9a%e6%84%9f%e7%9f%a5%e6%9c%ba%e5%8e%9f%e5%a7%8b%e6%80%a7%e6%b0%8f","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=2966","title":{"rendered":"\u7b2c\u4e8c\u8282\uff1a\u611f\u77e5\u673a\u539f\u59cb\u6027\u6c0f"},"content":{"rendered":"<h1>\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f(\u9e22\u5c3e\u82b1\u5206\u7c7b)<\/h1>\n<h1>\u5bfc\u5165\u6a21\u5757<\/h1>\n<pre><code class=\"language-python\">import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom matplotlib.colors import ListedColormap\nfrom matplotlib.font_manager import FontProperties\n# jupyter\u663e\u793amatplotlib\u751f\u6210\u7684\u56fe\u7247\n%matplotlib inline\n# \u4e2d\u6587\u5b57\u4f53\u8bbe\u7f6e\nfont = FontProperties(fname=&#039;\/Library\/Fonts\/Heiti.ttc&#039;)<\/code><\/pre>\n<h1>\u81ea\u5b9a\u4e49\u611f\u77e5\u673a\u6a21\u578b<\/h1>\n<pre><code class=\"language-python\">class Perceptron():\n    &quot;&quot;&quot;\u81ea\u5b9a\u4e49\u611f\u77e5\u673a\u7b97\u6cd5&quot;&quot;&quot;\n\n    def __init__(self, learning_rate=0.01, num_iter=50, random_state=1):\n        self.learning_rate = learning_rate\n        self.num_iter = num_iter\n        self.random_state = random_state\n\n    def fit(self, X, y):\n        &quot;&quot;&quot;\u521d\u59cb\u5316\u5e76\u66f4\u65b0\u6743\u91cd&quot;&quot;&quot;\n        # \u901a\u8fc7\u6807\u51c6\u5dee\u4e3a0.01\u7684\u6b63\u6001\u5206\u5e03\u521d\u59cb\u5316\u6743\u91cd\n        rgen = np.random.RandomState(self.random_state)\n        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])\n\n        self.errors_ = []\n\n        # \u5faa\u73af\u904d\u5386\u66f4\u65b0\u6743\u91cd\u76f4\u81f3\u7b97\u6cd5\u6536\u655b\n        for _ in range(self.num_iter):\n            errors = 0\n            for x_i, target in zip(X, y):\n                # \u5206\u7c7b\u6b63\u786e\u4e0d\u66f4\u65b0\uff0c\u5206\u7c7b\u9519\u8bef\u66f4\u65b0\u6743\u91cd\n                update = self.learning_rate * (target - self.predict(x_i))\n                self.w_[1:] += update * x_i\n                self.w_[0] += update\n                errors += int(update != 0.0)\n            self.errors_.append(errors)\n\n        return self\n\n    def predict_input(self, X):\n        &quot;&quot;&quot;\u8ba1\u7b97\u9884\u6d4b\u503c&quot;&quot;&quot;\n        return np.dot(X, self.w_[1:]) + self.w_[0]\n\n    def predict(self, X):\n        &quot;&quot;&quot;\u5f97\u51fasign(\u9884\u6d4b\u503c)\u5373\u5206\u7c7b\u7ed3\u679c&quot;&quot;&quot;\n        return np.where(self.predict_input(X) &gt;= 0.0, 1, -1)<\/code><\/pre>\n<h1>\u83b7\u53d6\u6570\u636e<\/h1>\n<p>&emsp;&emsp;\u7531\u4e8e\u83b7\u53d6\u7684\u9e22\u5c3e\u82b1\u6570\u636e\u603b\u5171\u67093\u4e2a\u7c7b\u522b\uff0c\u6240\u4ee5\u53ea\u63d0\u53d6\u524d100\u4e2a\u9e22\u5c3e\u82b1\u7684\u6570\u636e\u5f97\u5230\u6b63\u7c7b(versicolor \u6742\u8272\u9e22\u5c3e)\u548c\u8d1f\u7c7b(setosa \u5c71\u5c3e)\uff0c\u5e76\u5206\u522b\u7528\u6570\u5b571\u548c-1\u8868\u793a\uff0c\u5e76\u5b58\u5165\u6807\u8bb0\u5411\u91cfy\uff0c\u4e4b\u540e\u903b\u8f91\u56de\u5f52\u4f1a\u8bb2\u5982\u4f55\u5bf93\u4e2a\u7c7b\u522b\u5206\u7c7b\u3002\u540c\u65f6\u7531\u4e8e\u4e09\u7ef4\u4ee5\u4e0a\u56fe\u50cf\u4e0d\u65b9\u4fbf\u5c55\u793a\uff0c\u5c06\u53ea\u63d0\u53d6\u7b2c\u4e09\u5217\uff08\u82b1\u74e3\u957f\u5ea6\uff09\u548c\u7b2c\u4e09\u5217\uff08\u82b1\u74e3\u5bbd\u5ea6\uff09\u7684\u7279\u5f81\u653e\u5165\u7279\u5f81\u77e9\u9635X\u3002<\/p>\n<pre><code class=\"language-python\">df = pd.read_csv(\n    &#039;http:\/\/archive.ics.uci.edu\/ml\/machine-learning-databases\/iris\/iris.data&#039;, header=None)\n\n# \u53d6\u51fa\u524d100\u884c\u7684\u7b2c\u4e94\u5217\u5373\u751f\u6210\u6807\u8bb0\u5411\u91cf\ny = df.iloc[0:100, 4].values\ny = np.where(y == &#039;Iris-versicolor&#039;, 1, -1)\n\n# \u53d6\u51fa\u524d100\u884c\u7684\u7b2c\u4e00\u5217\u548c\u7b2c\u4e09\u5217\u7684\u7279\u5f81\u5373\u751f\u6210\u7279\u5f81\u5411\u91cf\nX = df.iloc[0:100, [2, 3]].values\n\nplt.scatter(X[:50, 0], X[:50, 1], color=&#039;r&#039;, s=50, marker=&#039;x&#039;, label=&#039;\u5c71\u9e22\u5c3e&#039;)\nplt.scatter(X[50:100, 0], X[50:100, 1], color=&#039;b&#039;,\n            s=50, marker=&#039;o&#039;, label=&#039;\u6742\u8272\u9e22\u5c3e&#039;)\nplt.xlabel(&#039;\u82b1\u74e3\u957f\u5ea6\uff08cm\uff09&#039;, fontproperties=font)\nplt.ylabel(&#039;\u82b1\u74e3\u5bbd\u5ea6\uff08cm\uff09&#039;, fontproperties=font)\nplt.legend(prop=font)\nplt.show()<\/code><\/pre>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/egonlin.com\/wp-content\/uploads\/2022\/02\/02-02-\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f\u9e22\u5c3e\u82b1\u5206\u7c7b_7_0.png'><img class=\"lazyload lazyload-style-2\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  data-original=\"https:\/\/egonlin.com\/wp-content\/uploads\/2022\/02\/02-02-\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f\u9e22\u5c3e\u82b1\u5206\u7c7b_7_0.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<h1>\u6784\u9020\u51b3\u7b56\u8fb9\u754c<\/h1>\n<p>&emsp;&emsp;\u8fb9\u754c\u51fd\u6570\u5373\u7684\u4e4b\u524d\u63d0\u53ca\u7684\u4ee3\u4ef7\u51fd\u6570\uff0c\u901a\u8fc7\u51b3\u7b56\u8fb9\u754c\u5c06\u9e22\u5c3e\u82b1\u6570\u636e\u6b63\u786e\u7684\u5206\u4e3a\u4e24\u4e2a\u7c7b\u522b\u3002<\/p>\n<pre><code class=\"language-python\">def plot_decision_regions(X, y, classifier, resolution=0.02):\n    # \u6784\u9020\u989c\u8272\u6620\u5c04\u5173\u7cfb\n    marker_list = [&#039;o&#039;, &#039;x&#039;, &#039;s&#039;]\n    color_list = [&#039;r&#039;, &#039;b&#039;, &#039;g&#039;]\n    cmap = ListedColormap(color_list[:len(np.unique(y))])\n\n    # \u6784\u9020\u7f51\u683c\u91c7\u6837\u70b9\u5e76\u4f7f\u7528\u7b97\u6cd5\u8bad\u7ec3\u9635\u5217\u4e2d\u6bcf\u4e2a\u5143\u7d20\n    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1  # \u7b2c0\u5217\u7684\u8303\u56f4\n    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1  # \u7b2c1\u5217\u7684\u8303\u56f4\n    t1 = np.linspace(x1_min, x1_max, 666)  # \u6a2a\u8f74\u91c7\u6837\u591a\u5c11\u4e2a\u70b9\n    t2 = np.linspace(x2_min, x2_max, 666)  # \u7eb5\u8f74\u91c7\u6837\u591a\u5c11\u4e2a\u70b9\n#     t1 = np.arange(x1_min, x1_max, resolution)\n#     t2 = np.arange(x2_min, x2_max, resolution)\n    x1, x2 = np.meshgrid(t1, t2)  # \u751f\u6210\u7f51\u683c\u91c7\u6837\u70b9\n#     y_hat = classifier.predict(np.array([x1.ravel(), x2.ravel()]).T) # \u9884\u6d4b\u503c\n    y_hat = classifier.predict(np.stack((x1.flat, x2.flat), axis=1))  # \u9884\u6d4b\u503c\n    y_hat = y_hat.reshape(x1.shape)  # \u4f7f\u4e4b\u4e0e\u8f93\u5165\u7684\u5f62\u72b6\u76f8\u540c\n\n    # \u901a\u8fc7\u7f51\u683c\u91c7\u6837\u70b9\u753b\u51fa\u7b49\u9ad8\u7ebf\u56fe\n    plt.contourf(x1, x2, y_hat, alpha=0.2, cmap=cmap)\n    plt.xlim(x1.min(), x1.max())\n    plt.ylim(x2.min(), x2.max())\n\n    for ind, clas in enumerate(np.unique(y)):\n        plt.scatter(X[y == clas, 0], X[y == clas, 1], alpha=0.8, s=50,\n                    c=color_list[ind], marker=marker_list[ind], label=clas)<\/code><\/pre>\n<h1>\u8bad\u7ec3\u6a21\u578b<\/h1>\n<p>&emsp;&emsp;\u53ef\u4ee5\u770b\u51fa\u6a21\u578b\u5728\u7b2c6\u6b21\u8fed\u4ee3\u7684\u65f6\u5019\u5c31\u5df2\u7ecf\u6536\u655b\u4e86\uff0c\u5373\u53ef\u4ee5\u5bf9\u6570\u636e\u6b63\u786e\u5206\u7c7b\u3002<\/p>\n<pre><code class=\"language-python\">perceptron = Perceptron(learning_rate=0.1, num_iter=10)\nperceptron.fit(X, y)\nplt.plot(range(1, len(perceptron.errors_) + 1), perceptron.errors_, marker=&#039;o&#039;)\nplt.xlabel(&#039;\u8fed\u4ee3\u6b21\u6570&#039;, fontproperties=font)\nplt.ylabel(&#039;\u66f4\u65b0\u6b21\u6570&#039;, fontproperties=font)\nplt.show()<\/code><\/pre>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/egonlin.com\/wp-content\/uploads\/2022\/02\/02-02-\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f\u9e22\u5c3e\u82b1\u5206\u7c7b_13_0.png'><img class=\"lazyload lazyload-style-2\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  data-original=\"https:\/\/egonlin.com\/wp-content\/uploads\/2022\/02\/02-02-\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f\u9e22\u5c3e\u82b1\u5206\u7c7b_13_0.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n<h1>\u53ef\u89c6\u5316<\/h1>\n<pre><code class=\"language-python\">plot_decision_regions(X, y, classifier=perceptron)\nplt.xlabel(&#039;\u82b1\u74e3\u957f\u5ea6\uff08cm\uff09&#039;, fontproperties=font)\nplt.ylabel(&#039;\u82b1\u74e3\u5bbd\u5ea6\uff08cm\uff09&#039;, fontproperties=font)\nplt.legend(prop=font)\nplt.show()<\/code><\/pre>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/egonlin.com\/wp-content\/uploads\/2022\/02\/02-02-\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f\u9e22\u5c3e\u82b1\u5206\u7c7b_15_0.png'><img class=\"lazyload lazyload-style-2\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  data-original=\"https:\/\/egonlin.com\/wp-content\/uploads\/2022\/02\/02-02-\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f\u9e22\u5c3e\u82b1\u5206\u7c7b_15_0.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" \/><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u611f\u77e5\u673a\u539f\u59cb\u5f62\u5f0f(\u9e22\u5c3e\u82b1\u5206\u7c7b) \u5bfc\u5165\u6a21\u5757 import numpy as np import pandas as [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":2969,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[276,285],"tags":[],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/2966"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2966"}],"version-history":[{"count":0,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/2966\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/media\/2969"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}