{"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","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print(os.listdir('/kaggle/input/digit-recognizer/'))","metadata":{"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":{"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":{"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":{"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":{"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 submission.csv","metadata":{"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')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}