M2_SETI/D3/TP/TP_SETI_SVM/SVM.ipynb

281 lines
154 KiB
Text
Raw Normal View History

2022-12-29 17:27:20 +01:00
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP 3 SVM\n",
"On se propose de faire de la modélisation par SVM sur des problématiques de discrimination, en utilisant la bibliothèque scikit-learn.\n",
"\n",
"On veut : \n",
"- Traiter un problème de discrimination linéairement séparable\n",
"- Traiter un problème non linéairement séparable (SVM à noyaux)\n",
"- Traiter le problème de la discrimination de chiffres manuscrits"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Problème linéairement séparable"
]
},
{
"cell_type": "code",
"execution_count": 1042,
"metadata": {},
"outputs": [],
"source": [
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from sklearn.svm import SVC"
]
},
{
"cell_type": "code",
"execution_count": 1043,
"metadata": {},
"outputs": [],
"source": [
"def genere_ex_1(n1=100, n2=50, mu1=[0,3], mu2=[3,0], sd1=0.15, sd2=0.2):\n",
" X = np.concatenate((np.random.multivariate_normal(mu1, np.diagflat(sd1*np.ones(2)), n1),\n",
" np.random.multivariate_normal(mu2, np.diagflat(sd2*np.ones(2)),n2)))\n",
"\n",
" Y = np.concatenate((np.ones((n1,1)), -1*np.ones((n2,1))))[:,0]\n",
" return X,Y"
]
},
{
"cell_type": "code",
"execution_count": 1044,
"metadata": {},
"outputs": [],
"source": [
"def plot_data_hyperplan(X, Y, classifier, name):\n",
" w = classifier.coef_[0]\n",
" b = classifier.intercept_[0]\n",
" a = -w[0] / w[1]\n",
" xx = np.linspace(min(X[:,0]), max(X[:,0]))\n",
" yy = a * xx - b/w[1]\n",
"\n",
" # print(X.size)\n",
"\n",
" # b1 = [(X[i,0]-a*X[i,0]- b/w[1]) for i in range(0,int(X.size/2))]\n",
" # b1 = min(b1)\n",
"\n",
" # b2 = [(X[i,1]-a*X[i,1]/w[1]) for i in range(0,int(X.size/2))]\n",
" # b2 = max(b2)\n",
"\n",
" color = ['red' if c >= 0 else 'blue' for c in Y]\n",
" plt.scatter(X[:,0], X[:,1], color=color)\n",
"\n",
" plt.plot(xx,yy, color='black')\n",
" plt.plot(xx, yy+1, color='green')\n",
" plt.plot(xx, yy-1, color='green')\n",
" plt.xlabel(\"x1\")\n",
" plt.ylabel(\"x2\")\n",
" plt.title(\"Classe 1 (red), Classe -1 (blue)\")\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 1045,
"metadata": {},
"outputs": [],
"source": [
"def main(X,Y):\n",
" classifier = SVC(kernel='linear', probability=True)\n",
" classifier = classifier.fit(X, Y)\n",
"\n",
" plot_data_hyperplan(X, Y, classifier, 'Graph_SVM_linear')"
]
},
{
"cell_type": "code",
"execution_count": 1046,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAHHCAYAAABHp6kXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAA9hAAAPYQGoP6dpAACyqElEQVR4nOzdd1hT1xsH8G8GewruvaXuujcOXK211q11j9atrWwUENngqta9Wkfd2qrVCop77z1wTxSVPZO8vz/OjyASkoDADeF8nuc+Nskdb25SzpszRURE4DiO4ziOK+LEQgfAcRzHcRyXH3hSw3Ecx3GcXuBJDcdxHMdxeoEnNRzHcRzH6QWe1HAcx3Ecpxd4UsNxHMdxnF7gSQ3HcRzHcXqBJzUcx3Ecx+kFntRwHMdxHKcXeFLDFXtVq1bFqFGjhA5DUNu2bYONjQ0SEhIK/FpHjx6FSCTC0aNHlc8NHjwYAwcOLPBrf0okEsHb27tQr1lUTJo0CV27dlU+zvjMduzYofHYUaNGoWrVqgUYHXDw4EGYm5vj3bt3BXodrujhSQ2ntx4+fIiff/4Z1atXh7GxMSwtLdG2bVssWrQIycnJQoeXb5YtW4YBAwagcuXKEIlEuU7Q5HI5vLy8MHXqVJibmxdMkBq4uLhg586duHbt2hef6+rVqxg2bBgqVaoEIyMj2NjYwMHBAevWrYNcLs+HaHVXQkICvLy80KNHD9jY2EAkEmH9+vW5Osfjx4+xevVquLu7F0yQ+aBHjx6oWbMmAgIChA6F0zE8qeH00v79+9GgQQNs27YN3333HRYvXoyAgABUrlwZTk5OmD59utAh5pugoCAcOXIE9erVg1QqzfXxe/fuxb179/DTTz8VQHTa+frrr9GsWTPMmzfvi86zevVqNGvWDBEREfjxxx+xdOlSeHp6wsTEBGPHjkVQUFA+RayboqOj4ePjgzt37qBRo0Z5OseiRYtQrVo1dOrUKZ+jy18///wzVqxYgfj4eKFD4XRI7v8CcpyOe/z4MQYPHowqVargyJEjKFeunPK1yZMnIzIyEvv37xcwwvx17NgxZS1NXmpa1q1bh7Zt26JChQpq91MoFEhLS4OxsXFeQ1Vr4MCB8PLywtKlS/P0Ps6ePYsJEyagdevW+Pfff2FhYaF8bcaMGbh48SJu3ryZnyHrnHLlyuH169coW7YsLl68iObNm+fq+PT0dGzatAkTJkwooAjzT79+/TB16lRs374dY8aMETocTkfwmhpO7wQHByMhIQFr1qzJktBkqFmzptqamg8fPsDR0RENGjSAubk5LC0t0bNnT5VNI4sXL0a9evVgamqKEiVKoFmzZti8ebPy9fj4eMyYMQNVq1aFkZERSpcuja5du+Ly5ctZznPu3Dn06NEDVlZWMDU1hb29PU6dOqXV+61SpQpEIpFW+34uJSUFBw8ehIODQ7bXRCIRpkyZgk2bNqFevXowMjLCwYMHAQAvX77EmDFjUKZMGRgZGaFevXpYu3ZttnO8ePECffr0gZmZGUqXLo1ffvkFqampKmPp2rUrEhMTERYWlqf3MmfOHIhEImzatClLQpOhWbNmapvmnj59ikmTJqFOnTowMTGBra0tBgwYgCdPnmTZLz09HXPmzEGtWrVgbGwMW1tbtGvXLkvcb968wejRo1GxYkUYGRmhXLly+P7777Od68CBA2jfvj3MzMxgYWGBb7/9Frdu3crT+wcAIyMjlC1bNs/Hnzx5EtHR0Sq/DwBrqnR3d0fZsmVhZmaG3r174/nz52rPqaoPFQA8efJEZfPY3bt30b9/f9jY2MDY2BjNmjXDP//8k+28pUuXRsOGDfH333/n6j1y+o3X1HB6Z+/evahevTratGmTp+MfPXqEPXv2YMCAAahWrRqioqKwYsUK2Nvb4/bt2yhfvjwAYNWqVZg2bRr69++P6dOnIyUlBdevX8e5c+cwdOhQAMCECROwY8cOTJkyBXXr1sX79+9x8uRJ3LlzB02aNAEAHDlyBD179kTTpk3h5eUFsViMdevWoXPnzjhx4gRatGiRPzdGhUuXLiEtLU0Zy+eOHDmCbdu2YcqUKShZsiSqVq2KqKgotGrVSpn0lCpVCgcOHMDYsWMRFxeHGTNmAACSk5PRpUsXPHv2DNOmTUP58uWxYcMGHDlyROW16tatCxMTE5w6dQo//PBDrt5HUlISDh8+jA4dOqBy5cq5OjbDhQsXcPr0aQwePBgVK1bEkydPsGzZMnTs2BG3b9+GqakpAMDb2xsBAQEYN24cWrRogbi4OFy8eBGXL19Wdq7t168fbt26halTp6Jq1ap4+/YtwsLC8OzZM2Un2g0bNmDkyJHo3r07goKCkJSUhGXLlqFdu3a4cuVKgXe2VeX06dMQiUT4+uuvVb7u5+cHkUgEFxcXvH37FgsXLoSDgwOuXr0KExOTL77+rVu3lLWGrq6uMDMzw7Zt29CnTx/s3Lkz2/eiadOm2LNnzxdfl9MjxHF6JDY2lgDQ999/r/UxVapUoZEjRyofp6SkkFwuz7LP48ePycjIiHx8fJTPff/991SvXj2157aysqLJkyfn+LpCoaBatWpR9+7dSaFQKJ9PSkqiatWqUdeuXbV+H0REZmZmWd6LJqtXryYAdOPGjWyvASCxWEy3bt3K8vzYsWOpXLlyFB0dneX5wYMHk5WVFSUlJRER0cKFCwkAbdu2TblPYmIi1axZkwBQREREtmvWrl2bevbsqXX8Ga5du0YAaPr06VofA4C8vLyUjzPi/tSZM2cIAP3555/K5xo1akTffvttjuf9+PEjAaCQkJAc94mPjydra2saP358luffvHlDVlZW2Z7PiwsXLhAAWrdundbHDBs2jGxtbbM9HxERQQCoQoUKFBcXp3x+27ZtBIAWLVqkfG7kyJFUpUqVbMd+/nk/fvw4W3xdunShBg0aUEpKivI5hUJBbdq0oVq1amWLy9/fnwBQVFSU1u+R02+8+YnTK3FxcQCgsvlBW0ZGRhCL2f8acrkc79+/h7m5OerUqZOl2cja2hovXrzAhQsXcjyXtbU1zp07h1evXql8/erVq3jw4AGGDh2K9+/fIzo6GtHR0UhMTESXLl1w/PhxKBSKPL8XTd6/fw8AKFGihMrX7e3tUbduXeVjIsLOnTvx3XffgYiU8UZHR6N79+6IjY1V3qN///0X5cqVQ//+/ZXHm5qaqu2QXKJECURHR+f6feTH5/5pTUN6ejrev3+PmjVrwtraOtvnfuvWLTx48CDH8xgaGuLo0aP4+PGjyn3CwsIQExODIUOGZLmHEokELVu2RERERJ7fx5d4//59jt8FABgxYkSWe9y/f3+UK1cO//777xdf+8OHDzhy5AgGDhyI+Ph45T15//49unfvjgcPHuDly5dZjsmINS/fGU4/8eYnTq9YWloCwBeNiFAoFFi0aBGWLl2Kx48fZxkGbGtrq/xvFxcXhIeHo0WLFqhZsya6deuGoUOHom3btsp9goODMXLkSFSqVAlNmzbFN998gxEjRqB69eoAoCwYR44cmWM8sbGxagua/EBEKp+vVq1alsfv3r1DTEwMVq5ciZUrV6o85u3btwBYH5WaNWtm6+9Tp04dtXHkpX9QfnzuycnJCAgIwLp16/Dy5css9yQ2Nlb53z4+Pvj+++9Ru3Zt1K9fHz169MDw4cPRsGFDACwpDgoKwsyZM1GmTBm0atUKvXr1wogRI5T9XTI+986dO6t9P6rI5fJs87PY2NjA0NAwb2/8Mzl9FwCgVq1aWR6LRCLUrFkzW1+hvIiMjAQRYfbs2Zg9e7bKfd6+fZulQ3tGrHntU8bpH57UcHrF0tIS5cuX/6JRLv7+/pg9ezbGjBmDuXPnwsbGBmKxGDNmzMhSa/LVV1/h3r172LdvHw4ePIidO3cqhxDPmTMHABvR0759e+zevRuHDh1CSEgIgoKCsGvXLvTs2VN5vpCQEDRu3FhlPAU5d0xGkvbx40dUrFgx2+uf95PIiHfYsGE5JmIZhXtefPz4MVvBqY2aNWtCKpXixo0beb721KlTsW7dOsyYMQOtW7eGlZUVRCI
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"X, Y = genere_ex_1() \n",
"main(X, Y)\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Problème non linéairement séparable\n"
]
},
{
"cell_type": "code",
"execution_count": 1047,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.model_selection import GridSearchCV"
]
},
{
"cell_type": "code",
"execution_count": 1048,
"metadata": {},
"outputs": [],
"source": [
"def genere_ex_2(n=300, mu=[0,0], std=0.25, delta=0.2):\n",
" X = np.random.multivariate_normal(mu, np.diagflat(std*np.ones(2)), n)\n",
" Y = np.zeros((X.shape[0]))\n",
"\n",
" for i in range(X.shape[0]):\n",
" x = X[i,0]\n",
" y = X[i,1]\n",
" if y < x*(x-1)*(x+1):\n",
" Y[i] = -1\n",
" X[i,1] = X[i,1] - delta\n",
" else:\n",
" Y[i] = 1\n",
" X[i,1] = X[i,1] + delta\n",
" return X,Y"
]
},
{
"cell_type": "code",
"execution_count": 1049,
"metadata": {},
"outputs": [],
"source": [
"\n",
"\n",
"def plot(X,Y,classifier, nameFig):\n",
" minx1 = min(X[:,0])\n",
" maxx1 = max(X[:,0])\n",
" minx2 = min(X[:,1])\n",
" maxx2 = max(X[:,1])\n",
"\n",
" xx = np.linspace(minx1, maxx1, 100)\n",
" yy = np.linspace(minx2, maxx2, 100).T\n",
" xx, yy = np.meshgrid(xx,yy)\n",
" Xfull = np.c_[xx.ravel(), yy.ravel()]\n",
"\n",
" probas = classifier.predict_proba(Xfull)\n",
" Z = classifier.decision_function(Xfull)\n",
"\n",
" k = 1\n",
" plt.title(\"Class %d\" %k)\n",
" imshow_handle = plt.imshow(probas[:, k].reshape((100,100)), extent=(minx1, maxx1, minx2, maxx2), origin='lower')\n",
" \n",
" classPos = Y>=0\n",
" classNeg = Y<0\n",
"\n",
" plt.contour(xx, yy, Z.reshape((100,100)), [-1,0,1], colors=['blue', 'black', 'red'])\n",
" plt.scatter(X[classPos, 0], X[classPos, 1], marker='o', c='r', edgecolors='k')\n",
" plt.scatter(X[classNeg, 0], X[classNeg, 1], marker='o', c='b', edgecolors='k')\n",
"\n",
" ax = plt.axes([0.8, 0.15, 0.05, 0.7])\n",
"\n",
" plt.title('Probability')\n",
" plt.colorbar(imshow_handle, cax=ax, orientation='vertical')\n",
" \n",
" plt.savefig(nameFig+'.jpg', dpi=300)\n",
" plt.show()\n",
" plt.close()"
]
},
{
"cell_type": "code",
"execution_count": 1053,
"metadata": {},
"outputs": [],
"source": [
"def main(X,Y,nameFig = 'GridSearchCV'):\n",
" parameters = {'kernel':('poly', 'poly'), 'C':[0.1,0.5, 1, 10], 'degree':[3,5], 'coef0':[0, 0.1, 0.5, 1, 10]}\n",
" svc = SVC(probability=True)\n",
" classifier = GridSearchCV(svc, parameters)\n",
" classifier = classifier.fit(X,Y)\n",
" print(classifier.best_params_)\n",
"\n",
" plot(X,Y, classifier=classifier, nameFig=nameFig)"
]
},
{
"cell_type": "code",
"execution_count": 1055,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'C': 0.5, 'coef0': 0.5, 'degree': 3, 'kernel': 'poly'}\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"X,Y = genere_ex_2()\n",
"main(X,Y)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reconnaissance de chiffres manuscrits"
]
}
],
"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.10"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}