diff --git a/jupyter.ipynb b/jupyter.ipynb index 0a63229..98a9b61 100644 --- a/jupyter.ipynb +++ b/jupyter.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 163, "metadata": { "pycharm": { "is_executing": true, @@ -14,7 +14,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/var/folders/tq/jq5nwbnj7v10tls99x99qbh40000gn/T/ipykernel_57719/1134982733.py:12: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n", + "/var/folders/tq/jq5nwbnj7v10tls99x99qbh40000gn/T/ipykernel_61525/3026179557.py:15: DeprecationWarning: Importing display from IPython.core.display is deprecated since IPython 7.14, please import from IPython display\n", " from IPython.core.display import display, HTML\n" ] }, @@ -41,6 +41,9 @@ "import scipy.linalg as la\n", "from PIL import Image\n", "from ipywidgets import interact\n", + "from numpy.linalg import eig\n", + "from math import isclose\n", + "import pprint\n", "\n", "# zmień szerokość komórki\n", "from IPython.core.display import display, HTML\n", @@ -49,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 164, "metadata": { "pycharm": { "name": "#%%\n" @@ -115,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 284, "metadata": { "pycharm": { "name": "#%%\n" @@ -124,7 +127,7 @@ "outputs": [], "source": [ "gray_images = {\n", - " \"cat\":rgb2gray(img_as_float(data.chelsea())),\n", + " \"cat\":rgb2gray(img_as_float(data.chelsea()))/255.0,\n", " \"astro\":rgb2gray(img_as_float(data.astronaut())),\n", " \"camera\":data.camera(),\n", " \"coin\": data.coins(),\n", @@ -158,51 +161,113 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 304, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "IndexError", + "evalue": "index 3 is out of bounds for axis 0 with size 3", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [304]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 75\u001b[0m U,s,V \u001b[38;5;241m=\u001b[39m calculate(np\u001b[38;5;241m.\u001b[39mtranspose(a))\n\u001b[1;32m 76\u001b[0m U1,s1,V1 \u001b[38;5;241m=\u001b[39m svd(a)\n\u001b[0;32m---> 77\u001b[0m U \u001b[38;5;241m=\u001b[39m \u001b[43mcheck_sign_U\u001b[49m\u001b[43m(\u001b[49m\u001b[43mU\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mU1\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 78\u001b[0m V \u001b[38;5;241m=\u001b[39m check_sign_V(V, V1)\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28mprint\u001b[39m(V\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m])\n", + "Input \u001b[0;32mIn [304]\u001b[0m, in \u001b[0;36mcheck_sign_U\u001b[0;34m(U, builtin)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m0\u001b[39m,builtin\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]):\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m j \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m0\u001b[39m,builtin\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m]):\n\u001b[0;32m---> 63\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m builtin[j][i] \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m0.0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[43mU\u001b[49m\u001b[43m[\u001b[49m\u001b[43mj\u001b[49m\u001b[43m]\u001b[49m[i] \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0.0\u001b[39m:\n\u001b[1;32m 64\u001b[0m U[j][i] \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 65\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m builtin[j][i] \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0.0\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m U[j][i] \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m0.0\u001b[39m:\n", + "\u001b[0;31mIndexError\u001b[0m: index 3 is out of bounds for axis 0 with size 3" + ] + } + ], "source": [ "def calculate(A):\n", - " m = A.shape[0]\n", - " n = A.shape[1]\n", + " n = A.shape[0]\n", + " m = A.shape[1]\n", " S = np.zeros(n)\n", "\n", " # finding eigenvectors with biggest eigenvalues of A*transpose(A)\n", " helper = np.matmul(A, np.transpose(A))\n", - " eigenvalues, eigenvectors = la.eigh(helper)\n", + "# print(f'helper ---------- {helper}')\n", + " eigenvalues, eigenvectors = eig(helper)\n", + "# print(eigenvalues)\n", + "# print(eigenvectors)\n", " # descending sort of all the eigenvectors according to their eigenvalues\n", " index = eigenvalues.argsort()[::-1]\n", + " eigenvalues = np.real(eigenvalues)\n", + " eigenvectors = np.real(eigenvectors)\n", " eigenvalues = eigenvalues[index]\n", " eigenvectors = eigenvectors[:, index]\n", " U = eigenvectors\n", "\n", + " # same finding process for transpose(A)*A\n", + " helper2 = np.matmul(np.transpose(A), A)\n", + " eigenvalues2, eigenvectors2 = eig(helper2)\n", + " # descending sort of all the eigenvectors according to their eigenvalues\n", + " index2 = eigenvalues2.argsort()[::-1]\n", + "# print(f'e2 ----------------- {np.real(eigenvalues2)}')\n", + " eigenvalues2 = np.real(eigenvalues2)\n", + " eigenvectors2 = np.real(eigenvectors2)\n", + " eigenvalues2 = eigenvalues2[index2]\n", + " eigenvectors2 = eigenvectors2[:, index2]\n", + "# print(eigenvalues2)\n", + "# print(eigenvectors2)\n", + " V = np.transpose(eigenvectors2)\n", + " \n", " # S is a diagonal matrix that keeps square root of eigenvalues\n", " j = 0\n", - " for i in eigenvalues:\n", + " for i in eigenvalues2:\n", " if j == S.size:\n", " break\n", " elif i >= 0:\n", " S[j] = np.sqrt(i)\n", " j += 1\n", - " # same finding process for transpose(A)*A\n", - " helper = np.matmul(np.transpose(A), A)\n", - " eigenvalues, eigenvectors = la.eigh(helper)\n", - " # descending sort of all the eigenvectors according to their eigenvalues\n", - " index = eigenvalues.argsort()[::-1]\n", - " eigenvalues = eigenvalues[index]\n", - " eigenvectors = eigenvectors[:, index]\n", - " V = np.transpose(eigenvectors)\n", "\n", " # sorting S in descending order\n", " S[::-1].sort()\n", " # print_to_file(S)\n", "\n", - " return U, S, V" + " return U, S, V\n", + "\n", + "def check_sign_V(V, builtin):\n", + " for i in range(0,builtin.shape[0]):\n", + " for j in range(0,builtin.shape[1]):\n", + " if builtin[j][i] < 0.0 and V[j][i] > 0.0:\n", + " V[j][i] *= -1\n", + " elif builtin[j][i] > 0.0 and V[j][i] < 0.0:\n", + " V[j][i] *= -1\n", + "\n", + " return V\n", + "\n", + "\n", + "def check_sign_U(U, builtin):\n", + " for i in range(0,builtin.shape[0]):\n", + " for j in range(0,builtin.shape[1]):\n", + " if builtin[j][i] < 0.0 and U[j][i] > 0.0:\n", + " U[j][i] *= -1\n", + " elif builtin[j][i] > 0.0 and U[j][i] < 0.0:\n", + " U[j][i] *= -1\n", + "\n", + " return U\n", + "\n", + "\n", + "a = np.array([[1,0, 2], \n", + " [0, 0, 0],\n", + " [0, 0, 0],\n", + " [0, 4, 0]])\n", + "U,s,V = calculate(np.transpose(a))\n", + "U1,s1,V1 = svd(a)\n", + "U = check_sign_U(U, U1)\n", + "V = check_sign_V(V, V1)\n", + "print(V.shape[0])\n", + "print('U: ', U, '\\n', 's: ',s, '\\n','V: ',V, '\\n')\n", + "print('--------------------------------------')\n", + "print('U1: ',U1, '\\n','s1: ',s1, '\\n', 'V1: ',V1, '\\n')\n", + "k = 4\n", + "reconst_matrix4 = np.dot(U[:,:k],np.dot(np.diag(s[:k]),V[:k,:]))\n", + "print('reconst -------------- ', reconst_matrix4)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 293, "metadata": { "pycharm": { "name": "#%%\n" @@ -214,11 +279,27 @@ " \"\"\"\n", " Wykonaj dekompozycję SVD, a następnie okrojoną rekonstrukcję (przy użyciu k wartości/wektorów osobliwych)\n", " \"\"\"\n", - "# U,s,V = svd(image,full_matrices=False)\n", - " U,s,V = calculate(image)\n", + " image = np.real(image)\n", + " print(f'image ---------- {image}')\n", + " U,s,V = svd(image,full_matrices=False)\n", + " U1,s1,V1 = calculate(image)\n", + " U1 = np.real(U1)\n", + " s1 = np.real(s1)\n", + " V1 = np.real(V1)\n", + "# U1 = check_sign_U(U1, U)\n", + "# V1 = check_sign_V(V1, V)\n", + " print(U.shape, U1.shape)\n", + " print(V.shape, V1.shape)\n", + " print(s.shape, s1.shape)\n", " reconst_matrix = np.dot(U[:,:k],np.dot(np.diag(s[:k]),V[:k,:]))\n", + " S = np.zeros(n)\n", + " for i in range(0,k):\n", + " suma[:,:i] += np.dot(np.dot(s1[i],U1[:,:i]), V1[:,:i])\n", + " print(suma)\n", + " reconst_matrix2 = np.dot(np.dot(np.diag(s1[:k]),U1[:,:k]),V1[:,:k])\n", + " print(reconst_matrix, '============================================', reconst_matrix2)\n", "\n", - " return reconst_matrix,s" + " return reconst_matrix2,s" ] }, { @@ -235,7 +316,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 294, "metadata": { "pycharm": { "name": "#%%\n" @@ -274,7 +355,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 295, "metadata": { "pycharm": { "name": "#%%\n" @@ -304,7 +385,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 296, "metadata": { "pycharm": { "name": "#%%\n" @@ -324,8 +405,8 @@ " original_shape = image.shape\n", " print(f\"Input image dimensions. Width:{original_shape[1]} Height:{original_shape[0]}\")\n", "\n", - "# U,s,V = svd(image,full_matrices=False)\n", - " U,s,V = calculate(image)\n", + " U,s,V = svd(image,full_matrices=False)\n", + "# U,s,V = calculate(image)\n", " print(f\"Shape of U matrix: {U[:,:k].shape}\")\n", " print(f\"U MATRIX: {U[:,:k]}\")\n", " print('*' * 100)\n", @@ -338,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 297, "metadata": { "pycharm": { "name": "#%%\n" @@ -348,12 +429,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7c4a40e6f857407586d21ab113128a97", + "model_id": "092923713cd74de2b08c173639aae9d4", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "interactive(children=(Dropdown(description='img_name', options=('cat', 'astro', 'coffee', 'rocket', 'koala', '…" + "interactive(children=(Dropdown(description='img_name', options=('cat', 'astro', 'camera', 'coin', 'clock', 'te…" ] }, "metadata": {}, @@ -365,7 +446,7 @@ "" ] }, - "execution_count": 22, + "execution_count": 297, "metadata": {}, "output_type": "execute_result" } @@ -376,17 +457,18 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 298, "metadata": { "pycharm": { "name": "#%%\n" - } + }, + "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3533923ce918489eab6fc7de25234078", + "model_id": "95f52e9c633540678b6285ce25adaff0", "version_major": 2, "version_minor": 0 }, @@ -551,13 +633,14 @@ "metadata": { "pycharm": { "name": "#%%\n" - } + }, + "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0af20b426d1240cca1e08e40ede10e98", + "model_id": "9976c068c2cc40788cdce8bf0365c66a", "version_major": 2, "version_minor": 0 }, @@ -595,7 +678,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "86f500d175554478ac9805075a809d28", + "model_id": "24661e5fa1644a349470561f5d9b1324", "version_major": 2, "version_minor": 0 }, @@ -703,7 +786,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e97ca096507f42b49f98dbb87ac5a2ec", + "model_id": "3026b3e43b6c4921abd17c4cf37e9954", "version_major": 2, "version_minor": 0 }, @@ -731,7 +814,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "71fea739144848d69afb1662172190ad", + "model_id": "a93634f89fdf459189067b59638f3021", "version_major": 2, "version_minor": 0 },