{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.datasets import load_digits #fetch_mldata\nimport torch\nimport numpy as np\nimport torch.utils.data\nimport matplotlib.pyplot as plt\nfrom scipy.io import loadmat\nimport os\nimport urllib","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-23T02:36:43.000419Z","iopub.execute_input":"2023-03-23T02:36:43.000868Z","iopub.status.idle":"2023-03-23T02:36:43.007328Z","shell.execute_reply.started":"2023-03-23T02:36:43.000829Z","shell.execute_reply":"2023-03-23T02:36:43.006378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_data = pd.read_csv('../input/digit-recognizer/test.csv')\n\n# Load labels for trainig datafrom six.moves import urllib\nmnist_path = \"mnist-original.mat\"\n\n# download label test dataset from github.\nmnist_alternative_url = \"https://github.com/amplab/datascience-sp14/raw/master/lab7/mldata/mnist-original.mat\"\nresponse = urllib.request.urlopen(mnist_alternative_url)\nwith open(mnist_path, \"wb\") as f:\n    content = response.read()\n    f.write(content)\n\nmnist_raw = loadmat(mnist_path)\n\nX = mnist_raw[\"data\"].T\ny = mnist_raw[\"label\"][0].astype(np.compat.long) #(np.long)\n\nX_test = test_data.values\n\nX.shape, X_test.shape","metadata":{"execution":{"iopub.status.busy":"2023-03-23T02:36:43.016604Z","iopub.execute_input":"2023-03-23T02:36:43.016997Z","iopub.status.idle":"2023-03-23T02:36:45.042219Z","shell.execute_reply.started":"2023-03-23T02:36:43.016964Z","shell.execute_reply":"2023-03-23T02:36:45.041215Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def pairwise_distances(x, y):\n    x_norm = (x**2).sum(1).view(-1, 1)\n    y_t = torch.transpose(y, 0, 1)\n    y_norm = (y**2).sum(1).view(1, -1)\n    \n    dist = x_norm + y_norm - 2.0 * torch.mm(x, y_t)\n    return torch.clamp(dist, 0.0, np.inf)","metadata":{"execution":{"iopub.status.busy":"2023-03-23T02:36:45.044826Z","iopub.execute_input":"2023-03-23T02:36:45.045903Z","iopub.status.idle":"2023-03-23T02:36:45.052340Z","shell.execute_reply.started":"2023-03-23T02:36:45.045859Z","shell.execute_reply":"2023-03-23T02:36:45.051158Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\ncuda_test = torch.from_numpy(X_test).cuda().float()\ncuda_train = torch.from_numpy(X).cuda().float()\nds = torch.utils.data.TensorDataset(cuda_test)\n_min_dists = []\n_arg_min_dists = []\nbs = 1000\nfor batch, in torch.utils.data.DataLoader(ds, batch_size=bs, pin_memory=False):\n    min_dist, arg_min_dist = pairwise_distances(cuda_train, batch).min(0)\n    _min_dists.append(min_dist)\n    _arg_min_dists.append(arg_min_dist)","metadata":{"execution":{"iopub.status.busy":"2023-03-23T02:36:45.055144Z","iopub.execute_input":"2023-03-23T02:36:45.055628Z","iopub.status.idle":"2023-03-23T02:36:45.220156Z","shell.execute_reply.started":"2023-03-23T02:36:45.055588Z","shell.execute_reply":"2023-03-23T02:36:45.218950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"min_dists = torch.cat(_min_dists)\narg_min_dists = torch.cat(_arg_min_dists)\nprint(f'Number of not found samples: {len(min_dists[min_dists>0])}')","metadata":{"execution":{"iopub.status.busy":"2023-03-23T02:36:45.222925Z","iopub.execute_input":"2023-03-23T02:36:45.223412Z","iopub.status.idle":"2023-03-23T02:36:46.188217Z","shell.execute_reply.started":"2023-03-23T02:36:45.223372Z","shell.execute_reply":"2023-03-23T02:36:46.187050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.read_csv('../input//digit-recognizer/sample_submission.csv')\nsub.Label = y[arg_min_dists.cpu()]\nsub.to_csv('submission.csv', index=False)\n!head sub.csv","metadata":{"execution":{"iopub.status.busy":"2023-03-23T02:36:46.189731Z","iopub.execute_input":"2023-03-23T02:36:46.192562Z","iopub.status.idle":"2023-03-23T02:36:47.382956Z","shell.execute_reply.started":"2023-03-23T02:36:46.192516Z","shell.execute_reply":"2023-03-23T02:36:47.381664Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axs = plt.subplots(15, 15, figsize=(25,25))\nfor i, ax in enumerate(axs.flatten()):\n    ax.set_title(sub.Label[i])\n    ax.imshow(X_test[i].reshape(28,28))\n    ax.axis('off')","metadata":{"execution":{"iopub.status.busy":"2023-03-23T02:36:47.385117Z","iopub.execute_input":"2023-03-23T02:36:47.385460Z","iopub.status.idle":"2023-03-23T02:36:54.510239Z","shell.execute_reply.started":"2023-03-23T02:36:47.385426Z","shell.execute_reply":"2023-03-23T02:36:54.509171Z"},"trusted":true},"execution_count":null,"outputs":[]}]}