{ "cells": [ { "cell_type": "markdown", "id": "eb50e2ce", "metadata": {}, "source": [ "**实验五:支持向量机**" ] }, { "cell_type": "code", "execution_count": 178, "id": "95f5ebed", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import math\n", "import cvxopt\n", "from cvxopt import matrix\n", "from cvxopt import solvers" ] }, { "cell_type": "markdown", "id": "714b16e8", "metadata": {}, "source": [ "**第一部分:函数介绍**" ] }, { "cell_type": "markdown", "id": "d3531f8a", "metadata": {}, "source": [ "二次规划问题是形式如下的一类最优化问题:\n", "$$\n", "\\begin{align}\n", "\\min_x \\quad &\\frac{1}{2}x^TPx+q^Tx \\\\\n", "s.t. \\quad &Gx\\leq h \\\\\n", " &Ax=b\n", "\\end{align}\n", "$$\n", "对于这一类问题可以使用[cvxopt](https://cvxopt.org/userguide/coneprog.html#quadratic-programming)库的solvers.qp()函数进行求解。" ] }, { "cell_type": "markdown", "id": "20b0f664", "metadata": {}, "source": [ "以下是一个例子(参考[Solving a quadratic program](https://cvxopt.org/examples/tutorial/qp.html)):\n", "$$\n", "\\begin{align}\n", "\\min_x \\quad &2x_1^2+x_2^2+x_1x_2+x_1+x_2 \\\\\n", "s.t. \\quad &x_1\\geq 0 \\\\\n", " &x_2\\geq 0 \\\\\n", " &x_1+x_2=1\n", "\\end{align}\n", "$$\n", "为了使用solvers.qp()函数,我们需要知道在该二次规划问题中的$P,q,G,h,A,b$矩阵分别是什么。\n", "在该优化问题中,\n", "\n", "* $P:=\\begin{bmatrix}\n", " 4 & 1 \\\\ 1 & 2\n", " \\end{bmatrix}$,\n", "* $q:=\\begin{bmatrix}\n", " 1 \\\\ 1\n", " \\end{bmatrix}$,\n", "* $G:=\\begin{bmatrix}\n", " -1 & 0 \\\\ 0 & -1\n", " \\end{bmatrix}$,\n", "* $h:=\\begin{bmatrix}\n", " 0 \\\\ 0\n", " \\end{bmatrix}$,\n", "* $A:=\\begin{bmatrix}\n", " 1 & 1\n", " \\end{bmatrix}$,\n", "* $b:=\\begin{bmatrix}\n", " 1\n", " \\end{bmatrix}$,\n", " \n", "把这些参数送入solvers.qp()函数中即可求出解。" ] }, { "cell_type": "code", "execution_count": 179, "id": "9e5b5531", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " pcost dcost gap pres dres\n", " 0: 1.8889e+00 7.7778e-01 1e+00 2e-16 2e+00\n", " 1: 1.8769e+00 1.8320e+00 4e-02 1e-16 6e-02\n", " 2: 1.8750e+00 1.8739e+00 1e-03 1e-16 5e-04\n", " 3: 1.8750e+00 1.8750e+00 1e-05 0e+00 5e-06\n", " 4: 1.8750e+00 1.8750e+00 1e-07 2e-16 5e-08\n", "Optimal solution found.\n", "[ 2.50e-01]\n", "[ 7.50e-01]\n", "\n" ] } ], "source": [ "# Tips1: cvxopt库中的matrix只接受double类型的数据\n", "# Tips2: matrix使用列表作为参数创建矩阵和numpy.array使用列表作为参数创建矩阵是不同的\n", "# print(matrix([[1.0, 1.0]]))\n", "# print(np.array([[1.0, 1.0]]))\n", "# print(matrix(np.array([[1.0, 1.0]])))\n", "Q = 2*matrix([ [2, .5], [.5, 1] ])\n", "p = matrix([1.0,1.0])\n", "G = matrix([[-1.0,0.0],[0.0,-1.0]])\n", "h = matrix([0.0,0.0])\n", "A = matrix([1.0, 1.0], (1,2))\n", "b = matrix(1.0)\n", "sol=solvers.qp(Q, p, G, h, A, b)\n", "print(sol['x'])" ] }, { "cell_type": "markdown", "id": "2384abb1", "metadata": {}, "source": [ "**第二部分:实验任务**" ] }, { "cell_type": "markdown", "id": "68091bb5", "metadata": {}, "source": [ "1.线性可分支持向量机与硬间隔最大化" ] }, { "cell_type": "markdown", "id": "ad91cf52", "metadata": {}, "source": [ "1) 读入数据集'dataset1.csv',把数据类型都转换成np.double类型,并画出数据集的散点图,给正样本(y为+1)和负样本(y为-1)分别标上不同的颜色。" ] }, { "cell_type": "code", "execution_count": 180, "id": "1b25ddd4", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ---- Your code here ----\n", "file = pd.read_csv('dataset1.csv')\n", "df = pd.DataFrame(file)\n", "data = np.array(df, dtype=np.double)\n", "y = data[:, -1]\n", "X = data[:, :-1]\n", "import matplotlib.pyplot as plt\n", "df.plot.scatter(x='x1', y='x2', c=df['y'].apply(lambda y: 'red' if y == -1 else 'blue'))\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "bbcf4613", "metadata": {}, "source": [ "2) 求解如下对偶问题(参考课件):\n", "$$\n", "\\begin{align}\n", "\\min_\\alpha \\quad &\\frac{1}{2}\\sum_{i=1}^m\\sum_{j=1}^m\\alpha_i\\alpha_jy_iy_j\\pmb{x}_i^T\\pmb{x}_j-\\sum_{i=1}^m\\alpha_i \\\\\n", "s.t. \\quad &\\sum_{i=1}^m\\alpha_iy_i=0 \\\\\n", " &\\pmb{\\alpha}\\geq \\pmb{0}\n", "\\end{align}\n", "$$\n", "\n", "这个优化问题是一个二次规划问题。\n", "* $P是一个m\\times m的矩阵,其中P_{ij}=y_iy_j\\pmb{x}_i^T\\pmb{x}_j$,\n", "* $q是一个m\\times 1的所有值都为-1的列向量,即q:=\\begin{bmatrix}\n", " -1 & -1 & \\cdots & -1\n", " \\end{bmatrix}^T$,\n", "* $G:=\\begin{bmatrix}\n", " -1 & 0 & \\cdots & 0 \\\\\n", " 0 & -1 & \\cdots & 0 \\\\\n", " \\vdots & \\vdots & \\ddots &0 \\\\\n", " 0 & 0 & 0 & -1\n", " \\end{bmatrix}_{m\\times m}=-\\pmb{I},\\pmb{I}为单位矩阵,$\n", "* $h是一个m\\times 1的零向量,即h:=\\begin{bmatrix}\n", " 0 & 0 & \\cdots & 0\n", " \\end{bmatrix}^T$,\n", "* $A:=\\begin{bmatrix}\n", " y_1 & y_2 & \\cdots & y_m\n", " \\end{bmatrix}^T$,\n", "* $b:=\\begin{bmatrix}\n", " 0\n", " \\end{bmatrix},一个标量$\n", " \n", "把上述参数送入求解器solvers.qp()中即可得到最优解$\\alpha^*$。 \n", " \n", "附:$P$矩阵的一个计算方法:\n", "设$X=\\begin{bmatrix}\n", " x_{11} & x_{12} \\\\\n", " x_{21} & x_{22} \\\\\n", " \\vdots & \\vdots \\\\\n", " x_{m1} & x_{m2}\n", " \\end{bmatrix}$,\n", " $Y=\\begin{bmatrix}\n", " y_{1} \\\\\n", " y_{2} \\\\\n", " \\vdots \\\\\n", " y_{m}\n", " \\end{bmatrix}$,\n", " \n", "计算$X'=\\begin{bmatrix}\n", " x_{11}y_1 & x_{12}y_1 \\\\\n", " x_{21}y_2 & x_{22}y_2 \\\\\n", " \\vdots & \\vdots \\\\\n", " x_{m1}y_m & x_{m2}y_m\n", " \\end{bmatrix}=X*Y(注意这里是星乘)$\n", " \n", "则$P=X'X'^T$。" ] }, { "cell_type": "code", "execution_count": 181, "id": "1537fe6b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " pcost dcost gap pres dres\n", " 0: -5.2553e+00 -9.0147e+00 1e+02 1e+01 2e+00\n", " 1: -4.9265e+00 -1.9551e+00 2e+01 2e+00 3e-01\n", " 2: -1.5759e-01 -3.1831e-01 7e-01 4e-02 7e-03\n", " 3: -1.3147e-01 -1.9706e-01 7e-02 6e-17 1e-15\n", " 4: -1.7378e-01 -1.8099e-01 7e-03 4e-17 8e-16\n", " 5: -1.7979e-01 -1.8010e-01 3e-04 8e-17 1e-15\n", " 6: -1.8003e-01 -1.8003e-01 3e-06 3e-17 1e-15\n", " 7: -1.8003e-01 -1.8003e-01 3e-08 3e-17 1e-15\n", "Optimal solution found.\n" ] } ], "source": [ "# ---- Your code here ----\n", "#如果求解报错可以尝试在solvers.qp()中添加参数kktsolver='ldl'\n", "P = (X * y.reshape(-1, 1)) @ (X * y.reshape(-1, 1)).T\n", "q = -np.ones(len(y))\n", "G = -np.eye(len(y))\n", "h = np.zeros(len(y))\n", "A = y.reshape(1, -1)\n", "b = np.array([0.0])\n", "sol = solvers.qp(matrix(P), matrix(q), matrix(G), matrix(h), matrix(A), matrix(b))\n", "alphas = np.array(sol['x'])" ] }, { "cell_type": "markdown", "id": "825c6609", "metadata": {}, "source": [ "3) 求出$\\pmb{\\omega}^*=\\sum_{i=1}^m\\alpha_i^*y_i\\pmb{x}_i$和$b^*=y_j-\\pmb{\\omega}^{*T}\\pmb{x_j}$, 其中$j$为$\\alpha^*$中的一个正分量$\\alpha_j^*>0$的下标。注意:由于求解器求出来的是一个近似解,所以$\\alpha^*$中很多实际上为0的分量会略大于0,这时候可以设置一个阈值把非常靠近0的那些分量筛去,再从剩下的分量中选取一个正分量来计算$b^*$,或者也可以直接取$\\alpha^*$中最大的分量来计算$b^*$。" ] }, { "cell_type": "code", "execution_count": 182, "id": "388c3510", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0.40821121, 0.43979838]), np.float64(-1.8556818844864766))" ] }, "execution_count": 182, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ---- Your code here ----\n", "omega = np.sum(alphas * y.reshape(-1, 1) * X, axis=0)\n", "b = y.reshape(-1, 1) - X @ omega.reshape(-1, 1)\n", "for i in range(len(alphas)):\n", " if alphas[i] > 1e-5:\n", " b = b[i][0]\n", " break\n", "omega, b" ] }, { "cell_type": "markdown", "id": "ad94df88", "metadata": {}, "source": [ "4) 画出数据集的散点图,给正样本(y为+1)和负样本(y为-1)分别标上不同的颜色,再为支持向量(训练数据中$\\alpha_j^*>0$的对应的样本)标上不同的颜色,并画出决策边界$\\pmb{\\omega}^{*T}\\pmb{x}+b=0$和间隔边界$\\pmb{\\omega}^{*T}\\pmb{x}+b=1$与$\\pmb{\\omega}^{*T}\\pmb{x}+b=-1$。" ] }, { "cell_type": "code", "execution_count": 183, "id": "36428566", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ---- Your code here ----\n", "import matplotlib.pyplot as plt\n", "plt.scatter(X[:, 0], X[:, 1], c=['red' if label == -1 else 'blue' for label in y])\n", "x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1\n", "x2_min, x2_max = X[:, 1].min()-1, X[:, 1].max()+1\n", "range_X1 = np.linspace(x1_min, x1_max, 100)\n", "range_X2 = np.linspace(x2_min, x2_max, 100)\n", "decision = omega[0] * range_X1.reshape(-1, 1) + omega[1] * range_X2.reshape(1, -1) + b\n", "boundary1 = omega[0] * range_X1.reshape(-1, 1) + omega[1] * range_X2.reshape(1, -1) + b - 1\n", "boundary2 = omega[0] * range_X1.reshape(-1, 1) + omega[1] * range_X2.reshape(1, -1) + b + 1\n", "plt.contour(range_X1, range_X2, boundary1.T, levels=[0], colors='green', linestyles='dashed')\n", "plt.contour(range_X1, range_X2, boundary2.T, levels=[0], colors='blue', linestyles='dashed')\n", "plt.contour(range_X1, range_X2, decision.T, levels=[0], colors='black')\n", "plt.xlabel('x1')\n", "plt.ylabel('x2')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "f33d9ee3", "metadata": {}, "source": [ "2.线性支持向量机与软间隔最大化" ] }, { "cell_type": "markdown", "id": "bdbeff31", "metadata": {}, "source": [ "1) 读入数据集'dataset2.csv',把数据类型都转换成np.double类型,并画出数据集的散点图,给正样本(y为+1)和负样本(y为-1)分别标上不同的颜色。" ] }, { "cell_type": "code", "execution_count": 185, "id": "5caeaadf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 185, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ---- Your code here ----\n", "file = pd.read_csv(\"dataset2.csv\")\n", "dfe = pd.DataFrame(file)\n", "data = np.array(dfe, dtype=np.double)\n", "X = data[:, :-1]\n", "y = data[:, -1]\n", "dfe.plot.scatter(x='x1', y='x2', c=dfe['y'].apply(lambda y: 'red' if y == -1 else 'blue'))" ] }, { "cell_type": "markdown", "id": "3d108a81", "metadata": {}, "source": [ "2) 选择一个参数C,求解如下对偶问题(参考课件):\n", "$$\n", "\\begin{align}\n", "\\min_\\alpha \\quad &\\frac{1}{2}\\sum_{i=1}^m\\sum_{j=1}^m\\alpha_i\\alpha_jy_iy_j\\pmb{x}_i^T\\pmb{x}_j-\\sum_{i=1}^m\\alpha_i \\\\\n", "s.t. \\quad &\\sum_{i=1}^m\\alpha_iy_i=0 \\\\\n", " &\\pmb{0}\\leq \\pmb{\\alpha}\\leq C \n", "\\end{align}\n", "$$\n", "* $G:=\\begin{bmatrix}\n", " -1 & 0 & \\cdots & 0 \\\\\n", " 0 & -1 & \\cdots & 0 \\\\\n", " \\vdots & \\vdots & \\ddots &0 \\\\\n", " 0 & 0 & 0 & -1 \\\\\n", " 1 & 0 & \\cdots & 0 \\\\\n", " 0 & 1 & \\cdots & 0 \\\\\n", " \\vdots & \\vdots & \\ddots &0 \\\\\n", " 0 & 0 & 0 & 1\n", " \\end{bmatrix}_{2m\\times m}=\\begin{bmatrix}\n", " -\\pmb{I} \\\\\n", " \\pmb{I}\n", " \\end{bmatrix},\\pmb{I}为单位矩阵,$\n", "* $h:=\\begin{bmatrix}\n", " 0 \\\\\n", " 0 \\\\\n", " \\vdots \\\\\n", " 0 \\\\\n", " C \\\\\n", " C \\\\\n", " \\vdots \\\\\n", " C\n", " \\end{bmatrix}_{2m\\times 1}, 即一个m\\times 1的零列向量与一个m\\times 1的分量全为C的列向量上下拼接$,\n", "* $P,q,A,b$与硬间隔优化问题中的矩阵相同。" ] }, { "cell_type": "code", "execution_count": 186, "id": "de031f65", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " pcost dcost gap pres dres\n", " 0: -1.1816e+01 -8.2073e+01 4e+02 2e+00 4e-14\n", " 1: -7.7195e+00 -4.7758e+01 7e+01 3e-01 3e-14\n", " 2: -5.7411e+00 -1.4569e+01 1e+01 5e-02 3e-14\n", " 3: -5.6219e+00 -6.8029e+00 2e+00 4e-03 2e-14\n", " 4: -5.8632e+00 -6.2495e+00 5e-01 9e-04 2e-14\n", " 5: -5.9709e+00 -6.0062e+00 4e-02 4e-05 3e-14\n", " 6: -5.9845e+00 -5.9849e+00 4e-04 4e-07 2e-14\n", " 7: -5.9847e+00 -5.9847e+00 4e-06 4e-09 3e-14\n", "Optimal solution found.\n" ] } ], "source": [ "# ---- Your code here ----\n", "C = 1\n", "P = (X * y.reshape(-1, 1)) @ (X * y.reshape(-1, 1)).T\n", "q = -np.ones(len(y))\n", "A = y.reshape(1, -1)\n", "b = np.array([0.0])\n", "G = np.vstack((-np.eye(len(y)), np.eye(len(y))))\n", "h = np.hstack((np.zeros(len(y)), C * np.ones(len(y)).T))\n", "sol = solvers.qp(matrix(P), matrix(q), matrix(G), matrix(h), matrix(A), matrix(b))\n", "alphas = np.array(sol['x'])" ] }, { "cell_type": "markdown", "id": "7093e867", "metadata": {}, "source": [ "3) 求出$\\pmb{\\omega}^*=\\sum_{i=1}^m\\alpha_i^*y_i\\pmb{x}_i$和$b^*=y_j-\\pmb{\\omega}^{*T}\\pmb{x_j}$, 其中$j$为$\\alpha^*$中的一个正分量$0<\\alpha_j^*" ] }, { "cell_type": "code", "execution_count": 187, "id": "7a7801c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([-0.96178358, 0.5100769 ]), np.float64(3.526495111090357))" ] }, "execution_count": 187, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ---- Your code here ----\n", "omega = np.sum(alphas * y.reshape(-1, 1) * X, axis=0)\n", "b = y.reshape(-1, 1) - X @ omega.reshape(-1, 1)\n", "for i in range(len(alphas)):\n", " if 1e-5 < alphas[i] < C - 1e-5:\n", " b = b[i][0]\n", " break\n", "omega, b" ] }, { "cell_type": "markdown", "id": "7b97abec", "metadata": {}, "source": [ "4) 画出数据集的散点图,给正样本(y为+1)和负样本(y为-1)分别标上不同的颜色,再为支持向量(训练数据中$\\alpha_j^*>0$的对应的样本)标上不同的颜色,并画出决策边界$\\pmb{\\omega}^{*T}\\pmb{x}+b=0$和间隔边界$\\pmb{\\omega}^{*T}\\pmb{x}+b=1$与$\\pmb{\\omega}^{*T}\\pmb{x}+b=-1$。" ] }, { "cell_type": "code", "execution_count": 188, "id": "4446b508", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# ---- Your code here ----\n", "plt.scatter(X[:, 0], X[:, 1], c=['red' if label == -1 else 'blue' for label in y])\n", "x1_min, x1_max = X[:, 0].min()-1, X[:, 0].max()+1\n", "x2_min, x2_max = X[:, 1].min()-1, X[:, 1].max()+1\n", "range_X1 = np.linspace(x1_min, x1_max, 100)\n", "range_X2 = np.linspace(x2_min, x2_max, 100)\n", "decision = omega[0] * range_X1.reshape(-1, 1) + omega[1] * range_X2.reshape(1, -1) + b\n", "boundary1 = omega[0] * range_X1.reshape(-1, 1) + omega[1] * range_X2.reshape(1, -1) + b - 1\n", "boundary2 = omega[0] * range_X1.reshape(-1, 1) + omega[1] * range_X2.reshape(1, -1) + b + 1\n", "plt.contour(range_X1, range_X2, boundary1.T, levels=[0], colors='green', linestyles='dashed')\n", "plt.contour(range_X1, range_X2, boundary2.T, levels=[0], colors='blue', linestyles='dashed')\n", "plt.contour(range_X1, range_X2, decision.T, levels=[0], colors='black')\n", "plt.xlabel('x1')\n", "plt.ylabel('x2')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "e20c4293", "metadata": {}, "source": [ "3.非线性支持向量机与核函数" ] }, { "cell_type": "markdown", "id": "f830c3b3", "metadata": {}, "source": [ "[Raisin Dataset](https://www.kaggle.com/datasets/muratkokludataset/raisin-dataset)是一个葡萄干的数据集,总共有900个样本,每个样本包含7个(都是连续的)特征以及1个标签,每个标签只有两种可能取值。本次实验已经按照8:2的比例划分成了训练数据集'Raisin_train.csv'以及测试数据集'Raisin_test.csv',且每个数据集都已经做了特征归一化处理以及把标签的值替换成了+1和-1。" ] }, { "cell_type": "markdown", "id": "7a6c8ca9", "metadata": {}, "source": [ "\n", "1) 读入训练数据集'Raisin_train.csv',把数据类型都转换成np.double类型。" ] }, { "cell_type": "code", "execution_count": 189, "id": "5b020812", "metadata": {}, "outputs": [], "source": [ "# ---- Your code here ----\n", "file = pd.read_csv(\"Raisin_train.csv\")\n", "df = pd.DataFrame(file)\n", "data = np.array(df, dtype=np.double)\n", "X = data[:, :-1]\n", "y = data[:, -1]" ] }, { "cell_type": "markdown", "id": "89cf5ba7", "metadata": {}, "source": [ "2) 选择一个核函数$K(\\pmb{x},\\pmb{z})$以及参数C,求解如下对偶问题(参考课件):\n", "$$\n", "\\begin{align}\n", "\\min_\\alpha\\quad &\\frac{1}{2}\\sum_{i=1}^m\\sum_{j=1}^m\\alpha_i\\alpha_jy_iy_jK(\\pmb{x}_i,\\pmb{x}_j)-\\sum_{i=1}^m\\alpha_i \\\\\n", "s.t. \\quad &\\sum_{i=1}^m\\alpha_iy_i=0 \\\\\n", " &\\pmb{0}\\leq \\pmb{\\alpha}\\leq C \n", "\\end{align}\n", "$$\n", "\n", "相较于软间隔最大化的优化问题,该优化问题仅需要对矩阵$P$做改动。\n", "从以下常用的核函数中选择一个作为该优化问题中的$K$(参数自己进行调整):\n", "* 线性核:$K(\\pmb{x},\\pmb{z})=\\pmb{x}^T\\pmb{z}$\n", "* 多项式核:$K(\\pmb{x},\\pmb{z})=(\\pmb{x}^T\\pmb{z}+1)^p$\n", "* 高斯核:$K(\\pmb{x},\\pmb{z})=exp(-\\frac{\\parallel \\pmb{x}-\\pmb{z} \\parallel^2}{2\\sigma^2})$\n", "* 拉普拉斯核:$K(\\pmb{x},\\pmb{z})=exp(-\\frac{\\parallel \\pmb{x}-\\pmb{z} \\parallel}{\\sigma})$\n", "* Sigmoid核:$K(\\pmb{x},\\pmb{z})=tanh(\\beta\\pmb{x}^T\\pmb{z}+\\theta)$\n", "\n", "则$P是一个m\\times m的矩阵,其中P_{ij}=y_iy_jK(\\pmb{x_i},\\pmb{x_j})$。" ] }, { "cell_type": "code", "execution_count": null, "id": "2716c531", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " pcost dcost gap pres dres\n", " 0: -3.5815e+02 -1.8172e+03 9e+03 3e+00 1e-14\n", " 1: -2.3762e+02 -1.1750e+03 1e+03 2e-01 1e-14\n", " 2: -2.5121e+02 -3.8712e+02 1e+02 2e-02 8e-15\n", " 3: -2.7994e+02 -3.2903e+02 5e+01 5e-03 9e-15\n", " 4: -2.8641e+02 -3.2075e+02 4e+01 2e-03 8e-15\n", " 5: -2.9208e+02 -3.0998e+02 2e+01 9e-04 9e-15\n", " 6: -2.9485e+02 -3.0527e+02 1e+01 4e-04 9e-15\n", " 7: -2.9636e+02 -3.0286e+02 7e+00 2e-04 9e-15\n", " 8: -2.9741e+02 -3.0119e+02 4e+00 1e-04 1e-14\n", " 9: -2.9808e+02 -3.0013e+02 2e+00 5e-05 1e-14\n", "10: -2.9876e+02 -2.9917e+02 4e-01 2e-14 1e-14\n", "11: -2.9889e+02 -2.9902e+02 1e-01 2e-14 1e-14\n", "12: -2.9894e+02 -2.9897e+02 3e-02 1e-14 1e-14\n", "13: -2.9895e+02 -2.9896e+02 3e-03 2e-14 1e-14\n", "14: -2.9895e+02 -2.9895e+02 4e-04 3e-14 1e-14\n", "15: -2.9895e+02 -2.9895e+02 8e-06 7e-15 1e-14\n", "Optimal solution found.\n" ] } ], "source": [ "# ---- Your code here ----\n", "def gaussian_kernal(x, z, sigma=1.0):\n", " # return np.exp(-(x - z) ** 2 / (2 * sigma ** 2))\n", " x_diff = x[None, :, :] - z[:, None, :]\n", " x_diff = np.sum(x_diff, axis = -1)\n", " return np.exp(- (x_diff ** 2) / (2 * sigma ** 2))\n", "\n", "def linear_kernal(x, z):\n", " x = x[None, :, :]\n", " z = z[:, None, :]\n", " result = x.T * z\n", " return result.sum(axis=-1)\n", "\n", "kernal = gaussian_kernal\n", "C = 1\n", "P = (y.reshape(-1, 1) @ y.reshape(1, -1)) * kernal(X, X)\n", "q = -np.ones(len(y))\n", "A = y.reshape(1, -1)\n", "b = np.array([0.0])\n", "G = np.vstack((-np.eye(len(y)), np.eye(len(y))))\n", "h = np.hstack((np.zeros(len(y)), C * np.ones(len(y)).T))\n", "sol = solvers.qp(matrix(P), matrix(q), matrix(G), matrix(h), matrix(A), matrix(b))\n", "alphas = np.array(sol['x'])" ] }, { "cell_type": "markdown", "id": "1a1a084b", "metadata": {}, "source": [ "3) 求出$b^*=y_j-\\sum_{i=1}^m \\alpha_i^*y_iK(\\pmb{x_i},\\pmb{x_j})$, 其中$j$为$\\alpha^*$中的一个正分量$0<\\alpha_j^* 1e-5:\n", " j = i\n", "b = y[j] - np.sum(alphas.reshape(-1, 1) * y.reshape(-1, 1) * kernal(X, X[j].reshape(1, -1)).T, axis=0)\n", "b.shape" ] }, { "cell_type": "markdown", "id": "16b41092", "metadata": {}, "source": [ "4) 读入测试数据集'Raisin_test.csv',用分类决策函数$f(\\pmb{x})=sign(\\sum_{i=1}^m \\alpha_i^*y_iK(\\pmb{x}_i,\\pmb{x})+b^*)$(注意这里的$m,\\alpha_i^*,y_i,\\pmb{x}_i$是训练集的, $\\pmb{x}$是测试集的)进行预测,输出预测准确率。" ] }, { "cell_type": "code", "execution_count": 192, "id": "d2e528d4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.8444444444444444)" ] }, "execution_count": 192, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ---- Your code here ----\n", "file = pd.read_csv('Raisin_test.csv')\n", "df = pd.DataFrame(file)\n", "data = np.array(df, dtype=np.double)\n", "Xtest = data[:, :-1]\n", "ytest = data[:, -1]\n", "fx = np.sign((alphas.reshape(-1, 1) * y.reshape(-1, 1)).T @ kernal(Xtest, X) + b)\n", "accuracy = np.mean(ytest == fx)\n", "# Xtest.shape, ytest.shape, alphas.shape\n", "accuracy" ] } ], "metadata": { "kernelspec": { "display_name": "base", "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.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }