Skip to content

Instantly share code, notes, and snippets.

@aboSamoor
Last active December 23, 2015 19:09
Show Gist options
  • Save aboSamoor/6680743 to your computer and use it in GitHub Desktop.
Save aboSamoor/6680743 to your computer and use it in GitHub Desktop.
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import cPickle as pickle\n",
"from io import open\n",
"\n",
"es_words, es_embeddings = pickle.load(open('/home/rmyeid/Downloads/polyglot-es.pkl', 'rb'))\n",
"en_words, en_embeddings = pickle.load(open('/home/rmyeid/Downloads/polyglot-en.pkl', 'rb'))\n",
"es_words_set = {w:i for i, w in enumerate(es_words)}\n",
"en_words_set = {w:i for i, w in enumerate(en_words)}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from random import shuffle\n",
"from collections import defaultdict\n",
"en_es = {}\n",
"phrases = 0\n",
"incomplete = 0\n",
"en_oov = defaultdict(lambda: 0)\n",
"es_oov = defaultdict(lambda: 0)\n",
"en_es_oov = defaultdict(lambda: 0)\n",
"with open('/home/rmyeid/Downloads/en-es.txt', 'r') as f:\n",
" for line in f:\n",
" words = line.strip().split()\n",
" if len(words) > 2:\n",
" phrases += 1\n",
" continue\n",
" if len(words) < 2:\n",
" incomplete += 1\n",
" continue\n",
" en, es = words\n",
" if es not in es_words_set and en not in en_words_set:\n",
" en_es_oov[en+'_'+es] += 1\n",
" continue\n",
"\n",
" if es not in es_words_set:\n",
" es_oov[es] += 1\n",
" continue\n",
"\n",
" if en not in en_words_set:\n",
" en_oov[en] += 1\n",
" continue\n",
" en_es[words[0]] = words[1]\n",
"\n",
"en_es_pairs = en_es.items()\n",
"print \"We ignored {} phrase pairs.\".format(phrases)\n",
"print \"We ignored {} incomplete pairs.\".format(incomplete)\n",
"print \"We ignored {} pairs that contained en OOV and es OOV\".format(len(en_oov))\n",
"print \"We ignored {} pairs that contained en OOV\".format(len(en_oov))\n",
"print \"We ignored {} pairs that contained es OOV\".format(len(es_oov))\n",
"print \"We found {} term pairs.\".format(len(en_es_pairs))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"We ignored 4084 phrase pairs.\n",
"We ignored 1 incomplete pairs.\n",
"We ignored 611 pairs that contained en OOV and es OOV\n",
"We ignored 611 pairs that contained en OOV\n",
"We ignored 920 pairs that contained es OOV\n",
"We found 4128 term pairs.\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from numpy import asarray\n",
"\n",
"shuffle(en_es_pairs)\n",
"\n",
"def split_data(percentage):\n",
" global train_pairs, test_pairs, partial_es_words\n",
" global partial_es_rev_words, partial_en_words, partial_en_rev_words\n",
" global EN_train, ES_train, EN, ES\n",
" train_size = int(len(en_es_pairs) * percentage)\n",
" print \"We are training using {} pairs\".format(train_size)\n",
" train_pairs = en_es_pairs[:train_size]\n",
" test_pairs = en_es_pairs[train_size:]\n",
"\n",
"\n",
" partial_es_words = {es:i for i, (en, es) in enumerate(en_es_pairs)}\n",
" partial_es_rev_words = {i: es for es,i in partial_es_words.iteritems()}\n",
" partial_en_words = {en:i for i, (en, es) in enumerate(en_es_pairs)}\n",
" partial_en_rev_words = {i: en for en,i in partial_en_words.iteritems()}\n",
"\n",
" EN_train = asarray([en_embeddings[en_words_set[x]] for x,y in train_pairs])\n",
" ES_train = asarray([es_embeddings[es_words_set[y]] for x,y in train_pairs])\n",
"\n",
" EN = asarray([en_embeddings[en_words_set[x]] for x,y in en_es_pairs])\n",
" ES = asarray([es_embeddings[es_words_set[y]] for x,y in en_es_pairs])\n",
" return train_size"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#from sklearn import cross_decomposition\n",
"from sklearn.cross_decomposition import CCA\n",
"\n",
"def new_vectors(n_components):\n",
" cca = CCA(n_components=n_components)\n",
" cca.fit(EN_train, ES_train)\n",
"\n",
" en_vectors, es_vectors = cca.transform(EN, ES)\n",
" return en_vectors, es_vectors"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from sklearn.neighbors import NearestNeighbors\n",
"\n",
"def p_at_k(k):\n",
" en_knn = NearestNeighbors(n_neighbors=k, algorithm='ball_tree', p=2)\n",
" en_knn.fit(en_vectors)\n",
" es_knn = NearestNeighbors(n_neighbors=k, algorithm='ball_tree', p=2)\n",
" es_knn.fit(es_vectors)\n",
" right = 0\n",
" for en, es in test_pairs:\n",
" point = en_vectors[partial_en_words[en]]\n",
" distances, indices = es_knn.kneighbors(point)\n",
" es_words = [partial_es_rev_words[i] for i in indices[0]]\n",
" if es in es_words:\n",
" #print es\n",
" #print u' '.join(es_words)\n",
" right += 1\n",
" en_es_score = 100.0*right/len(test_pairs)\n",
" #print \"We found EN --> ES {} matching pairs in {}, P@{} is {} %\".format(right, len(test_pairs), k, 100.0*right/len(test_pairs))\n",
"\n",
" right = 0\n",
" for en, es in test_pairs:\n",
" point = es_vectors[partial_es_words[es]]\n",
" distances, indices = en_knn.kneighbors(point)\n",
" en_words = [partial_en_rev_words[i] for i in indices[0]]\n",
" if en in en_words:\n",
" #print en\n",
" #print u' '.join(en_words)\n",
" right += 1\n",
" es_en_score = 100.0*right/len(test_pairs)\n",
" #print \"We found ES --> EN {} matching pairs in {}, P@{} is {} %\".format(right, len(test_pairs), k, 100.0*right/len(test_pairs))\n",
" return en_es_score, es_en_score\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Grid Search\n",
"============\n",
"\n",
"Learning a linear transformation seems to be sensitive to couple of hyperparameters:\n",
"\n",
"* The common space dimension. We trying two vector spaces to a new common one. This new one does not have to be the same size as the originals. There seems to be numerical stability problems when it comes to picking dimension larger than half the original one.\n",
"\n",
"* Training data size. As we change the new projection space dimension that changes the number of the parameters we would like to learn. Therefore, the training data size should make an effect on the quality of the transformations we are learning."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"n_component = [4, 8, 16, 24, 32, 40, 48, 64]\n",
"en_es_scores = []\n",
"es_en_scores = []\n",
"\n",
"training_sizes = [0.05, 0.1, 0.2, 0.3, 0.4, 0.6]\n",
"for t_size in training_sizes:\n",
" num_examples = split_data(t_size)\n",
" for size in n_component:\n",
" en_vectors, es_vectors = new_vectors(size)\n",
" score1, score2 = p_at_k(5)\n",
" en_es_scores.append((t_size, size, score1))\n",
" es_en_scores.append((t_size, size, score2))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 25\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 28\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 33\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 35\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 36\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 38\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 39\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 41\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 43\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 46\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 49\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 50\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 53\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 54\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 55\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 56\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 57\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 58\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 63\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"We are training using 206 pairs\n",
"We are training using 412 pairs"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 19\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 29\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 30\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 31\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 34\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 40\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 42\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 44\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 45\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 47\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 48\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 51\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 52\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 61\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"We are training using 825 pairs"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 62\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 26\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 32\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 37\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"We are training using 1238 pairs"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 60\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 17\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 24\n",
" warnings.warn('X scores are null at iteration %s' % k)\n",
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 27\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"We are training using 1651 pairs"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"We are training using 2476 pairs"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
},
{
"output_type": "stream",
"stream": "stderr",
"text": [
"/usr/local/lib/python2.7/dist-packages/sklearn/cross_decomposition/pls_.py:290: UserWarning: X scores are null at iteration 59\n",
" warnings.warn('X scores are null at iteration %s' % k)\n"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#en_es_scores, es_en_scores = [[206, 4, 5.609382967873534], [206, 8, 16.292707802141763], [206, 16, 19.326874043855177], [206, 24, 17.23610402855686], [206, 32, 15.34931157572667], [206, 40, 13.895971443141255], [206, 48, 11.907190209077001], [206, 64, 0.22947475777664456], [412, 4, 9.553283100107643], [412, 8, 30.005382131324005], [412, 16, 39.23573735199139], [412, 24, 35.09149623250807], [412, 32, 0.10764262648008611], [412, 40, 0.16146393972012918], [412, 48, 0.1883745963401507], [412, 64, 0.16146393972012918], [825, 4, 14.259763851044506], [825, 8, 42.143505903723884], [825, 16, 50.62064789585226], [825, 24, 0.12110202845897669], [825, 32, 0.18165304268846502], [825, 40, 0.15137753557372086], [825, 48, 0.09082652134423251], [825, 64, 0.0], [1238, 4, 14.948096885813149], [1238, 8, 44.3598615916955], [1238, 16, 52.52595155709343], [1238, 24, 0.03460207612456748], [1238, 32, 0.1384083044982699], [1238, 40, 0.0], [1238, 48, 0.06920415224913495], [1238, 64, 0.03460207612456748], [1651, 4, 16.148566814695197], [1651, 8, 46.62898667743238], [1651, 16, 57.004440855874044], [1651, 24, 0.08074283407347597], [1651, 32, 0.0], [1651, 40, 0.16148566814695195], [1651, 48, 0.12111425111021397], [1651, 64, 0.08074283407347597], [2476, 4, 16.82808716707022], [2476, 8, 48.6682808716707], [2476, 16, 58.535108958837775], [2476, 24, 54.35835351089588], [2476, 32, 0.12106537530266344], [2476, 40, 0.24213075060532688], [2476, 48, 0.24213075060532688], [2476, 64, 0.12106537530266344]], [[206, 4, 6.093829678735339], [206, 8, 17.41458439571647], [206, 16, 21.009688934217237], [206, 24, 18.306986231514532], [206, 32, 16.598674145843958], [206, 40, 14.584395716471189], [206, 48, 13.895971443141255], [206, 64, 0.10198878123406425], [412, 4, 10.925726587728741], [412, 8, 31.13562970936491], [412, 16, 41.065662002152855], [412, 24, 38.85898815931109], [412, 32, 0.13455328310010764], [412, 40, 0.13455328310010764], [412, 48, 0.13455328310010764], [412, 64, 0.10764262648008611], [825, 4, 14.65334544353618], [825, 8, 44.323342415985465], [825, 16, 47.16924008477142], [825, 24, 0.09082652134423251], [825, 32, 0.12110202845897669], [825, 40, 0.12110202845897669], [825, 48, 0.12110202845897669], [825, 64, 0.12110202845897669], [1238, 4, 16.85121107266436], [1238, 8, 45.916955017301035], [1238, 16, 57.09342560553633], [1238, 24, 0.17301038062283736], [1238, 32, 0.1384083044982699], [1238, 40, 0.1384083044982699], [1238, 48, 0.1384083044982699], [1238, 64, 0.06920415224913495], [1651, 4, 17.924909164311668], [1651, 8, 49.132014533710134], [1651, 16, 59.22486879289463], [1651, 24, 0.16148566814695195], [1651, 32, 0.12111425111021397], [1651, 40, 0.20185708518368994], [1651, 48, 0.16148566814695195], [1651, 64, 0.24222850222042794], [2476, 4, 18.159806295399516], [2476, 8, 48.97094430992736], [2476, 16, 56.23486682808716], [2476, 24, 55.81113801452784], [2476, 32, 0.06053268765133172], [2476, 40, 0.18159806295399517], [2476, 48, 0.18159806295399517], [2476, 64, 0.12106537530266344]]\n",
"sorted(en_es_scores, key=lambda (x,y,z): z)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 29,
"text": [
"[(0.6, 16, 0.0),\n",
" (0.6, 24, 0.0),\n",
" (0.1, 48, 0.02691065662002153),\n",
" (0.6, 48, 0.06053268765133172),\n",
" (0.2, 8, 0.060551014229488345),\n",
" (0.2, 16, 0.060551014229488345),\n",
" (0.2, 32, 0.060551014229488345),\n",
" (0.3, 24, 0.06920415224913495),\n",
" (0.4, 8, 0.08074283407347597),\n",
" (0.4, 32, 0.08074283407347597),\n",
" (0.4, 64, 0.08074283407347597),\n",
" (0.05, 16, 0.10198878123406425),\n",
" (0.05, 32, 0.10198878123406425),\n",
" (0.05, 40, 0.10198878123406425),\n",
" (0.3, 40, 0.10380622837370242),\n",
" (0.6, 32, 0.12106537530266344),\n",
" (0.6, 40, 0.12106537530266344),\n",
" (0.2, 24, 0.12110202845897669),\n",
" (0.2, 40, 0.12110202845897669),\n",
" (0.4, 24, 0.12111425111021397),\n",
" (0.05, 24, 0.12748597654258031),\n",
" (0.05, 48, 0.12748597654258031),\n",
" (0.05, 64, 0.12748597654258031),\n",
" (0.1, 16, 0.13455328310010764),\n",
" (0.1, 24, 0.13455328310010764),\n",
" (0.1, 32, 0.13455328310010764),\n",
" (0.3, 48, 0.1384083044982699),\n",
" (0.3, 64, 0.1384083044982699),\n",
" (0.2, 48, 0.15137753557372086),\n",
" (0.2, 64, 0.15137753557372086),\n",
" (0.4, 40, 0.16148566814695195),\n",
" (0.4, 48, 0.16148566814695195),\n",
" (0.3, 16, 0.17301038062283736),\n",
" (0.3, 32, 0.17301038062283736),\n",
" (0.1, 40, 0.1883745963401507),\n",
" (0.1, 64, 0.1883745963401507),\n",
" (0.4, 16, 0.20185708518368994),\n",
" (0.6, 64, 0.24213075060532688),\n",
" (0.4, 4, 1.9781994348001615),\n",
" (0.3, 4, 2.906574394463668),\n",
" (0.05, 4, 2.9066802651708312),\n",
" (0.6, 8, 3.1476997578692494),\n",
" (0.3, 8, 3.42560553633218),\n",
" (0.6, 4, 3.450363196125908),\n",
" (0.05, 8, 10.530341662417134),\n",
" (0.1, 4, 11.490850376749192),\n",
" (0.2, 4, 14.471692400847715),\n",
" (0.1, 8, 16.630785791173306)]"
]
}
],
"prompt_number": 29
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from numpy import asarray\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"from matplotlib.collections import PolyCollection\n",
"from matplotlib.colors import colorConverter\n",
"from copy import deepcopy\n",
"\n",
"cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6)\n",
"n_component = [4, 8, 16, 24, 32, 40, 48, 64] \n",
"training_sizes = [0.05, 0.1, 0.2, 0.3, 0.4, 0.6]\n",
"\n",
"fig = plt.figure()\n",
"\n",
"\n",
"\n",
"def get_subplot(ax):\n",
" n_component = [4, 8, 16, 24, 32, 40, 48, 64] \n",
" training_sizes = [0.05, 0.1, 0.2, 0.3, 0.4, 0.6]\n",
" verts = []\n",
" colors = zip(['r', 'g', 'b', 'y', 'c', 'm'])\n",
"\n",
" for i,c in enumerate(n_component):\n",
" es = []\n",
" ss = []\n",
" for e, d, s in en_es_scores:\n",
" if d == c:\n",
" es.append(e)\n",
" ss.append(s)\n",
" color = colors[i%len(colors)]\n",
" ax.bar(es, ss, zs=c, zdir='y', color=color, alpha=0.5, width=0.05)\n",
"\n",
"\n",
"\n",
" ax.set_xlabel('Training data')\n",
" ax.set_xlim3d(0, 1.1)\n",
" ax.set_ylabel('P@5')\n",
" ax.set_ylim3d(0, 100)\n",
" ax.set_zlabel('Dimension')\n",
" ax.set_zlim3d(0, 100)\n",
" \n",
"fig1 = plt.figure()\n",
"ax = fig1.add_subplot(111, projection='3d') \n",
"get_subplot(ax)\n",
"ax.set_xlabel('')\n",
"ax.set_xticklabels('')\n",
"ax.view_init(0, 0)\n",
"\n",
"fig2 = plt.figure()\n",
"ax2 = fig2.add_subplot(111, projection='3d') \n",
"get_subplot(ax2)\n",
"ax2.set_ylabel('')\n",
"ax2.set_yticklabels('')\n",
"ax2.view_init(0, 90)\n",
"\n",
"fig3 = plt.figure()\n",
"ax3 = fig3.add_subplot(111, projection='3d') \n",
"get_subplot(ax3)\n",
"ax3.view_init(25, 45)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"text": [
"<matplotlib.figure.Figure at 0x8fa9450>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x8fa9fd0>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nP9C2AnKjAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x8b9b750>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n+T9Ys81ayhqIHgAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x6472990>"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"num_examples = split_data(0.2)\n",
"en_vectors, es_vectors = new_vectors(16)\n",
"score1, score2 = p_at_k(5)\n",
"print score1, score2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"We are training using 825 pairs\n",
"0.0605510142295"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 0.181653042688\n"
]
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print 2476.0/len(en_es_pairs)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.59980620155\n"
]
}
],
"prompt_number": 26
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment