{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"e835b247-73d5-46ef-f1d3-495bfbcdc188"},"outputs":[],"source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nfrom subprocess import check_output\nprint(check_output([\"ls\", \"../input\"]).decode(\"utf8\"))\n\n# Any results you write to the current directory are saved as output."},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"deeb58d9-e7b2-3e49-9d33-1429acf26e15"},"outputs":[],"source":"#librerie necessarie / si potrebbero usare i pandas dataframe ma lavoreremo con array numpy\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom collections import Counter\nimport math #necessaria per la funzione sqr utilizzata nel calcolo della distanza\nimport operator #modulo contenente funzioni gia costruite\nimport itertools"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"b526d37d-afa2-32b9-1413-0c44f9891be3"},"outputs":[],"source":"#definisco una funizone per il calcolo di L2 distanza euclidea\n\ndef distanza (row1, row2, length):\n\n    distance=0\n\n    for x in range(length):\n\n        distance+=pow(row1[x]-row2[x],2) #quadrato della differenza sommato posto per posto\n\n    return math.sqrt(distance) #radice della somma dei quadrati delle differenze = distanza euclidea\n\n"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"f773cd0d-184c-7518-53f0-42b19f70be72"},"outputs":[],"source":"#seleziono le k con distanza minore quindi le più simili-->i k vicini più vicini\n#ha come parametri tutto il set di train e una riga del test e il numero di vicini da considerare\ndef Kvicini(train,testrow,k):\n    distanza1=0\n    distanze=[] #creazione di una lista vuota\n    length=len(testrow)-1 # perchè gli indici partono da 0\n    Tralen=len(train)\n    for x in range(Tralen):\n        distanza1=distanza(train[x],testrow,length)\n        distanze.append((train[x],distanza1))\n        distanze.sort(key=operator.itemgetter(1)) #key indica il modo di ordinare , può essere una\n                                                          #funzione lamba invece utilizzo itemgetter dal modulo\n                                                          #operator che ordina rispetto al secondo campo quindi \n                                                          #distanza in ordine crescente a meno che reverse=true\n    vicini=[]#la lista vuota che restituisco con i  k vicini piu vicini\n    for x in range(k):\n        vicini.append(distanze[x][0])#memorizzo soltanto il 'label' dei vicini e non le distanze \n                                     #perchè prendo le prime k e sono ordinate quindi gia so che sono \n                                    # i piu vicini\n    return vicini\n"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"bc6f3e1f-c0ae-848b-44b5-891fe956f096"},"outputs":[],"source":"def predizione(vicini):\n    NumIstanze={}#definisco un vocabolario in cui conto le istanze di ogni vicino\n    Viclen=len(vicini) \n    for x in range(Viclen): #scandisco tutti i vicini\n        previsione=vicini[x][0] #salvo in una variabile temporanea il vicino\n        if previsione in NumIstanze:#se già è presente nel vocabolario aumento il suo valore\n            NumIstanze[previsione]+=1\n        else: #se non è presente lo inizializzo\n            NumIstanze[previsione]=1\n    NumIstanze=NumIstanze.sort(key=operator.itemgetter(1),reverse=True)#ordino rispetto al numero di istanze in senso desc\n    return NumIstanze[0][0]#ritorno il vicino con più istanze       \n            "},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"372f1962-e1af-fbc1-2f35-92252c0d068e"},"outputs":[],"source":"import pandas as pd\nimport csv\ndef caricamento(filename,lista=[]):\n    with open('../input/'+filename, 'rt') as csvfile:\n        lines =csv.reader(csvfile)\n        next(lines) #salto l'header\n        dataset=list(lines)\n        for x in range(len(dataset)):\n            for y in range(784):\n                dataset[x][y]=int(dataset[x][y])\n            lista.append(dataset[x])"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"b89f925a-79c4-dc06-6ca3-23ba360d6b2d"},"outputs":[],"source":"import pandas as pd\nimport csv\ndef caricamento(filename,lista=[]):\n    with open(filename, 'rb') as csvfile:\n        lines =csv.reader(csvfile)\n        next(lines) #salto l'header\n        dataset=list(lines)\n        for x in range(len(dataset)):\n            for y in range(784):\n                dataset[x][y]=int(dataset[x][y])\n            lista.append(dataset[x])"},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"349f7626-5555-331b-9cb4-49a129243bea"},"outputs":[],"source":"def main():\n    test=[]\n    train=[]\n    predictions=[]\n    k=3\n    count=0\n    caricamento('test.csv',test) \n    print('fine caricamento 1')\n    caricamento('train.csv',train)\n    print('fine caricamento 2')\n    for x in range(len(test)):\n        print(count)\n        count+=1\n        Vicini=Kvicini(train,test[x],k)\n        predictions.append(predizione(Vicini))\n    "},{"cell_type":"code","execution_count":null,"metadata":{"_cell_guid":"51404157-0fd7-ab20-66df-2d812c7d94f6"},"outputs":[],"source":"main()"}],"metadata":{"_change_revision":0,"_is_fork":false,"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.5.2"}},"nbformat":4,"nbformat_minor":0}