TD Clustering Radu Ciucanu radu.ciucanu@insa-cvl.fr Table des mati` eres 1 Clustering k -means 1 2 Clustering hi ́ erarchique 3 3 Etude de cas 4 Modalit ́ es de contrˆ ole de connaissances : Contrˆ ole continu int ́ egral. Le rendu de ce sujet compte pour 50% de la note finale. Le rendu du prochain sujet compte aussi pour 50% de la note finale. Chaque rendu sur Celene sera une archive (par exemple zip ). Si vous travaillez seul, l’archive sera nomm ́ ee NOM-Pr ́ enom . Similairement, si vous travaillez en binˆ ome, l’archive sera nomm ́ ee NOM1-Pr ́ enom1 NOM2-Pr ́ enom2 . Un seul rendu par binˆ ome est suffisant. L’archive doit inclure : (i) votre code source (qui doit fonctionner sur un syst` eme d’exploitation de type Unix), et (ii) un compte rendu en format pdf qui explique comment utiliser votre code pour v ́ erifier la qualit ́ e de votre travail, ainsi que les r ́ eponses aux diff ́ erentes questions. Pour la pr ́ eparation du compte rendu, je vous conseille d’utiliser Latex 1 , mais ce n’est pas impos ́ e. Objectifs. — Comprendre l’importance des tˆ aches de clustering et comprendre l’algorithme k -means. — Utiliser Python pour impl ́ ementer k -means et visualiser les r ́ esultats pour des donn ́ ees 2D. — Comprendre le clustering hi ́ erarchique, avec diff ́ erentes m ́ ethodes de distance (notamment single link et com- plete link ) et visualiser les r ́ esultats avec un dendrogramme. — R ́ ealiser une ́ etude de cas sur un jeu de donn ́ ees r ́ eelles, via un workflow complet : pr ́ eparation des donn ́ ees, clustering ( k -means ou hi ́ erarchique), visualisation et interpr ́ etation des r ́ esultats. 1 Clustering k -means 1. Impl ́ ementez l’algorithme k -means. On suppose des points de dimension arbitraire (1D, 2D, . . . ), tous les points ayant bien ́ evidemment la mˆ eme dimension. Chaque composante d’un point est une variable quantitative. Utilisez la distance euclidienne pour calculer la distance entre 2 points. Votre fonction prend comme param` etres : — Le jeu de donn ́ ees, sous la forme d’une collection de points. — Le nombre de clusters k — La collection de k centroids initiaux (param` etre optionnel). Si ce param` etre est =None , alors la fonction tire au hasard les k centroids initiaux. Votre fonction retourne l’erreur (SSE) du clustering obtenu et affiche tous les r ́ esultats interm ́ ediaires, comme dans l’exemple suivant. Supposons le jeu de donn ́ ees 1D : [[1], [2], [18], [20], [31]] — Avec centroids initiaux [[1], [2], [18]] , la fonction est cens ́ ee afficher : 1. https://en.wikipedia.org/wiki/LaTeX Iteration 1 Centroid [1] Points [[1]] Centroid [2] Points [[2]] Centroid [18] Points [[18], [20], [31]] Iteration 2 Centroid [1.0] Points [[1]] Centroid [2.0] Points [[2]] Centroid [23.0] Points [[18], [20], [31]] Fin clustering, erreur = 98.0 — Avec centroids initiaux [[18], [20], [31]] , la fonction est cens ́ ee afficher : Iteration 1 Centroid [18] Points [[1], [2], [18]] Centroid [20] Points [[20]] Centroid [31] Points [[31]] Iteration 2 Centroid [7.0] Points [[1], [2]] Centroid [20.0] Points [[18], [20]] Centroid [31.0] Points [[31]] Iteration 3 Centroid [1.5] Points [[1], [2]] Centroid [19.0] Points [[18], [20]] Centroid [31.0] Points [[31]] Fin clustering, erreur = 2.5 2. Testez votre fonction sur le jeu de donn ́ ees 1D : [[2], [4], [6], [12], [24], [30]] (a) Avec centroids initiaux [[2], [6]] (b) Avec centroids initiaux [[12], [24]] Pour chaque configuration de centroids initiaux, ajoutez les r ́ esultats dans le compte rendu, ainsi qu’une courte discussion, en pr ́ ecisant notamment si vous avez obtenu un clustering meilleur que l’autre. 3. Am ́ eliorez votre fonction de l’Exercice 1 afin de g ́ en ́ erer des visualisations 2D sur l’allocation des points dans des clusters au fil des it ́ erations. Pour y arriver, n’h ́ esitez pas ` a ajouter d’autres param` etres optionnels, afin de faciliter la g ́ en ́ eration de visualisations 2D. Par exemple, un param` etre utile est la collection des noms des points, qui permet d’ ́ etiquetter les points sur chaque dessin. Pour chaque param` etre optionnel que vous ajoutez, n’oubliez pas d’inclure une courte explication dans le compte rendu. Testez votre fonction sur le jeu de donn ́ ees suivant : M 1 p ́ 2 , 3 q , M 2 p ́ 2 , 1 q , M 3 p ́ 2 , ́ 1 q , M 4 p 2 , ́ 1 q , M 5 p 2 , 1 q , M 6 p 1 , 0 q et pour les 2 configurations de centroids initiaux ci-dessous. Dans le compte rendu, incluez chaque s ́ equence de dessins et expliquez comment la reproduire ` a partir de votre code. Remarquez que les points sont repr ́ esent ́ es par des ‚ et annot ́ es avec leur nom et les centroids sont repr ́ esent ́ ees par des ˆ . Les points d’un mˆ eme cluster et leur centroid sont repr ́ esent ́ es avec la mˆ eme couleur. — Avec centroids initiaux M 1 et M 2 , la fonction est cens ́ ee g ́ en ́ erer la succession de dessins : 3 2 1 0 1 2 3 X 3 2 1 0 1 2 3 Y M1 M2 M3 M4 M5 M6 3 2 1 0 1 2 3 X 3 2 1 0 1 2 3 Y M1 M2 M3 M4 M5 M6 3 2 1 0 1 2 3 X 3 2 1 0 1 2 3 Y M1 M2 M3 M4 M5 M6 — Avec centroids initiaux M 4 et M 6 , la fonction est cens ́ ee g ́ en ́ erer la succession de dessins : 2 3 2 1 0 1 2 3 X 3 2 1 0 1 2 3 Y M1 M2 M3 M4 M5 M6 3 2 1 0 1 2 3 X 3 2 1 0 1 2 3 Y M1 M2 M3 M4 M5 M6 3 2 1 0 1 2 3 X 3 2 1 0 1 2 3 Y M1 M2 M3 M4 M5 M6 4. Comme vous l’avez peut-ˆ etre d ́ ej` a devin ́ e, k -means est un algorithme tellement classique qu’il existe d ́ ej` a des syst` emes qui l’impl ́ ementent. Par exemple, SciKit-Learn 2 est une biblioth` eque Python qui impl ́ emente de nombreux algorithmes d’analyse de donn ́ ees, y inclus k -means. SciKit-Learn est utile surtout si une seule machine suffit pour analyser les donn ́ ees. Vous avez besoin de NumPy 3 afin de manipuler des array Pour installer NumPy et respectivement SciKit-Learn : pip3 install numpy pip3 install sklearn Pour tester l’impl ́ ementation k -means de SciKit-Learn sur le jeu de donn ́ ees de l’Exercice 1 : from sklearn.cluster import KMeans from numpy import array data1 = [[1], [2], [18], [20], [31]] print(KMeans(n_clusters=3, n_init=1, init=array([[1], [2], [18]])).fit(data1).labels_) # affiche [0 1 2 2 2] print(KMeans(n_clusters=3, n_init=1, init=array([[18], [20], [31]])).fit(data1).labels_) # affiche [0 0 1 1 2] Expliquez pourquoi cet affichage signifie que l’on a obtenu les mˆ emes clusters de l’Exercice 1. Ensuite, refaites les clusterings des Exercices 2 et 3 avec SciKit-Learn et v ́ erifiez que vous obtenez les mˆ emes clusters que vous avez obtenus avec votre code. 2 Clustering hi ́ erarchique Nous utilisons l’impl ́ ementation de clustering hi ́ erarchique disponible dans SciPy 4 et nous utilisons des dendro- grammes 5 pour visualiser les r ́ esultats. Pour installer SciPy, il suffit de faire : pip3 install scipy L’impl ́ ementation de clustering hi ́ erarchique disponible dans SciPy accepte deux formats possibles pour les donn ́ ees d’entr ́ ee 6 . En gros, si tout ce que nous avons est une matrice de distance, alors il faut donner l’entr ́ ee dans un format 1D qui repr ́ esente la matrice de distance en format compact. C’est ce que l’on va faire dans cet exercice. Plus tard, pour l’ ́ etude de cas, nous utiliserons l’autre format. Prenons la matrice de distance suivante, qui, comme toute matrice de distance, est sym ́ etrique. p 1 p 2 p 3 p 4 p 5 p 1 0 0.1 0.9 0.35 0.8 p 2 0.1 0 0.3 0.4 0.5 p 3 0.9 0.3 0 0.6 0.7 p 4 0.35 0.4 0.6 0 0.2 p 5 0.8 0.5 0.7 0.2 0 2. https://scikit-learn.org/stable/ 3. https://numpy.org/ 4. https://www.scipy.org/ 5. https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.dendrogram.html 6. https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html 3 Pour encoder cette matrice de distance en tant qu’entr ́ ee du clustering hi ́ erarchique sous SciPy, il suffit de lire les distances au-dessus de la diagonale principale. On obtient ainsi : data = [0.1, 0.9, 0.35, 0.8, 0.3, 0.4, 0.5, 0.6, 0.7, 0.2] En utilisant SciPy, r ́ ealisez un petit programme qui utilise le jeu de donn ́ ees ci-dessus afin de g ́ en ́ erer les dendro- grammes ci-dessous. Single link Complete link p4 p5 p3 p1 p2 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 p1 p2 p3 p4 p5 0.0 0.2 0.4 0.6 0.8 Utilisez votre code afin de reproduire les solutions de l’exercice 16 du livre. Pour rappel, dans cet exercice nous avons la matrice de similarit ́ e suivante. Une subtilit ́ e importante est que l’on a une matrice de similarit ́ e, donc avant de lancer le clustering, il faut la convertir en matrice de distance : distance p p i , p j q “ 1 ́ similarit ́ e p p i , p j q . Vous ˆ etes cens ́ es obtenir les dendrogrammes suivants (donn ́ es aussi dans les solutions des exercices du livre, p 134) : Single link Complete link p1 p4 p3 p2 p5 0.0 0.1 0.2 0.3 0.4 p3 p2 p5 p1 p4 0.0 0.2 0.4 0.6 0.8 3 Etude de cas 1. En pratique, les donn ́ ees brutes que l’on veut analyser ne sont pas par d ́ efaut dans un format “id ́ eal” comme celui des exercices pr ́ ec ́ edents. Le but de l’ ́ etude de cas est de r ́ ealiser un workflow complet qui comprend la pr ́ eparation des donn ́ ees, le clustering, ainsi que l’interpr ́ etation des r ́ esultats. Nous utilisons un jeu de donn ́ ees r ́ eelles, que vous pouvez t ́ el ́ echarger directement sur Kaggle 7 (il s’agit du fichier Country-data.csv ), ou sur Celene car je vous ai ajout ́ e une copie des donn ́ ees sur Celene. Pour la pr ́ eparation des donn ́ ees , faites d’abord du code Python qui parse le fichier Country-data.csv et extrait une liste de 167 ́ el ́ ements (car il y a 167 pays dans le jeu de donn ́ ees). Chaque ́ el ́ ement de la liste 7. https://www.kaggle.com/rohan0301/unsupervised-learning-on-country-data 4 est ` a son tour une liste de 9 ́ el ́ ements (car chaque pays est caract ́ eris ́ e par 9 variables). Apr` es avoir pars ́ e le fichier, votre liste doit commencer pas [[90.2, 10.0, 7.58, 44.9, 1610.0, 9.44, 56.2, 5.82, 553.0], [16.6, 28.0, 6.55, 48.6, 9930.0, 4.49, 76.3, 1.65, 4090.0], ... Dans la suite, nous appellerons cette liste data country . Pensez aussi ` a stocker les noms des pays dans une liste car ils seront utiles pour ́ etiquetter vos dessins (voir, par exemple les Figures 1 . . . 4). Malheureusement, la pr ́ eparation des donn ́ ees n’est pas encore finie, pour plusieurs raisons, que vous avez id ́ ealement vues par vous-mˆ eme : — Chaque point est caract ́ eris ́ e par 9 variables, mais l’humain n’est pas capable de visualiser dans 9 dimen- sions si on veut dessiner les points afin de visualiser les clusters. — Les variables ont des ́ echelles tr` es diff ́ erentes. Par exemple, si vous analysez visuellement les donn ́ ees, vous remarquez que la derni` ere variable ( gdpp ) a au moins un ordre de grandeur de plus que la plupart des autres variables. Donc si on calcule na ̈ ıvement des distances sur ces donn ́ ees, la derni` ere variable aura un poids beaucoup plus important que les autres. Cela n’est pas raisonnable car on veut que chaque variable ait le mˆ eme poids dans le clustering. La bonne nouvelle est qu’il existe une recette assez classique pour attaquer ces probl` emes. Il s’agit de l’ analyse en composantes principales (en anglais PCA = Principal Component Analysis) sur des donn ́ ees centr ́ ees r ́ eduites . Voici un squelette de programme, que vous compl ́ eterez afin de finaliser la pr ́ eparation des donn ́ ees. from numpy import array, identity, transpose, matmul, std, mean from numpy.linalg import eig # TODO code pour lire data_country ` a partir du fichier Country-data.csv # Les m^ emes donn ́ ees de la matrice data_country, dans le format "array" exploitable pour la suite X = array(data_country) # Le nombre de points n = len(countries) # Le nombre de variables p = len(data_country[0]) # La matrice des donn ́ ees centr ́ ees, c’est-` a-dire la somme = 0 sur chaque colonne Y = X - matmul(transpose(array([n * [1]])), transpose(array([[mean(variable)] for variable in transpose(X)]))) # La matrice des donn ́ ees centr ́ ees et r ́ eduites, qui en plus a l’ ́ ecart type constant = 1 sur chaque colonne Z = matmul (Y, array(list(map (lambda variable : [1./std(variable)], transpose(X)))) * identity(p)) # La matrice (sym ́ etrique) de variance/covariance des donn ́ ees centr ́ ees r ́ eduites R = matmul (matmul(transpose(Z), 1./n * identity (n)), Z) # Les vecteurs propres de R eigenvectors = eig(R)[1] # Les 2 composantes principals = 2 nouvelles variables contenant le plus d’information possible des 9 variables initiales components = [matmul(Z, eigenvectors[:,0]), matmul(Z, eigenvectors[:,1])] # La matrice initiale, projet ́ ee sur 2 nouvelles colonnes qui repr ́ esentent les 2 composantes principales data_reduced = [[components[0][i], components[1][i]] for i in range(n)] Au final, le r ́ esultat data reduced est cens ́ e commencer par [[2.91, -0.1], [-0.43, 0.59], ... C’est sur ce jeu de donn ́ ees que vous ferez l’exercice suivant, car il permet de le visualiser facilement en 2D. 2. Sur le jeu de donn ́ ees r ́ esultat de l’exercice pr ́ ec ́ edent, g ́ en ́ erez au moins 2 dessins pour chaque type de clustering que l’on a vu. — Pour le clustering k -means, r ́ eutilisez votre code du sujet pr ́ ec ́ edent. Vous obtiendrez des dessins similaires aux Figures 1 et 2, pour k “ 2 et respectivement k “ 3. — Pour le clustering hi ́ erarchique, r ́ eutilisez votre code de l’Exercice 1 de ce sujet. Une subtilit ́ e est que maintenant vous avez la liste des points (dans le format data reduced ) et non pas une matrice de distance comme dans l’Exercice 1. Heureusement que hierarchy.linkage accepte les 2 formats. Vous obtiendrez des dessins similaires aux Figures 3 et 4, pour single link et respectivement complete link. Ajoutez les figures obtenues dans le compte rendu, ainsi que des courtes discussions sur leur interpr ́ etation. En particulier, discutez si chaque clustering obtenu semble avoir du sens par rapport ` a l’ ́ equilibre entre les clusters, ` a la proximit ́ e des pays dans les clusters vs sur la carte du monde, discutez s’il y a des proximit ́ es entre les pays auxquelles vous vous attendiez ou ce sont des proximit ́ es qui vous surprennent, etc. Pour k -means avec des centroids initiaux tir ́ es au hasard, discutez aussi si on aurait pu obtenir des clusterings consid ́ erablement diff ́ erents de ceux de mes figures. 5 Figure 1 – Jeu de donn ́ ees Country : k -means avec k “ 2. 7 6 5 4 3 2 1 0 1 2 3 4 5 X 7 6 5 4 3 2 1 0 1 2 3 Y Afghanistan Albania Algeria Angola Antigua and Barbuda Argentina Armenia Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bhutan Bolivia Bosnia and Herzegovina Botswana Brazil Brunei Bulgaria Burkina Faso Burundi Cambodia Cameroon Canada Cape Verde Central African Republic Chad Chile China Colombia Comoros Congo, Dem. Rep. Congo, Rep. Costa Rica Cote d'Ivoire Croatia Cyprus Czech Republic Denmark Dominican Republic Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Fiji Finland France Gabon Gambia Georgia Germany Ghana Greece Grenada Guatemala Guinea Guinea-Bissau Guyana Haiti Hungary Iceland India Indonesia Iran Iraq Ireland Israel Italy Jamaica Japan Jordan Kazakhstan Kenya Kiribati Kuwait Kyrgyz Republic Lao Latvia Lebanon Lesotho Liberia Libya Lithuania Luxembourg Macedonia, FYR Madagascar Malawi Malaysia Maldives Mali Malta Mauritania Mauritius Micronesia, Fed. Sts. Moldova Mongolia Montenegro Morocco Mozambique Myanmar Namibia Nepal Netherlands New Zealand Niger Nigeria Norway Oman Pakistan Panama Paraguay Peru Philippines Poland Portugal Qatar Romania Russia Rwanda Samoa Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Slovak Republic Slovenia Solomon Islands South Africa South Korea Spain Sri Lanka St. Vincent and the Grenadines Sudan Suriname Sweden Switzerland Tajikistan Tanzania Thailand Timor-Leste Togo Tonga Tunisia Turkey Turkmenistan Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Venezuela Vietnam Yemen Zambia 6 Figure 2 – Jeu de donn ́ ees Country : k -means avec k “ 3. 7 6 5 4 3 2 1 0 1 2 3 4 5 X 7 6 5 4 3 2 1 0 1 2 3 Y Afghanistan Albania Algeria Angola Antigua and Barbuda Argentina Armenia Australia Austria Azerbaijan Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin Bhutan Bolivia Bosnia and Herzegovina Botswana Brazil Brunei Bulgaria Burkina Faso Burundi Cambodia Cameroon Canada Cape Verde Central African Republic Chad Chile China Colombia Comoros Congo, Dem. Rep. Congo, Rep. Costa Rica Cote d'Ivoire Croatia Cyprus Czech Republic Denmark Dominican Republic Ecuador Egypt El Salvador Equatorial Guinea Eritrea Estonia Fiji Finland France Gabon Gambia Georgia Germany Ghana Greece Grenada Guatemala Guinea Guinea-Bissau Guyana Haiti Hungary Iceland India Indonesia Iran Iraq Ireland Israel Italy Jamaica Japan Jordan Kazakhstan Kenya Kiribati Kuwait Kyrgyz Republic Lao Latvia Lebanon Lesotho Liberia Libya Lithuania Luxembourg Macedonia, FYR Madagascar Malawi Malaysia Maldives Mali Malta Mauritania Mauritius Micronesia, Fed. Sts. Moldova Mongolia Montenegro Morocco Mozambique Myanmar Namibia Nepal Netherlands New Zealand Niger Nigeria Norway Oman Pakistan Panama Paraguay Peru Philippines Poland Portugal Qatar Romania Russia Rwanda Samoa Saudi Arabia Senegal Serbia Seychelles Sierra Leone Singapore Slovak Republic Slovenia Solomon Islands South Africa South Korea Spain Sri Lanka St. Vincent and the Grenadines Sudan Suriname Sweden Switzerland Tajikistan Tanzania Thailand Timor-Leste Togo Tonga Tunisia Turkey Turkmenistan Uganda Ukraine United Arab Emirates United Kingdom United States Uruguay Uzbekistan Vanuatu Venezuela Vietnam Yemen Zambia 7 Figure 3 – Jeu de donn ́ ees Country : clustering hi ́ erarchique avec Single link 0.0 0.5 1.0 1.5 2.0 2.5 Luxembourg Singapore Malta Seychelles Ireland Nigeria Haiti Norway Qatar Switzerland Belgium Netherlands Vietnam United States Equatorial Guinea Congo, Rep. Lesotho Myanmar Angola Central African Republic Mauritania Liberia Togo Gambia Ghana Comoros Madagascar Senegal Kenya Yemen Cote d'Ivoire Timor-Leste Mali Sierra Leone Chad Sudan Eritrea Pakistan Tanzania Congo, Dem. Rep. Niger Burundi Uganda Burkina Faso Guinea-Bissau Malawi Afghanistan Cameroon Guinea Mozambique Benin Zambia Iceland Sweden Austria Denmark Finland Germany Japan Canada United Kingdom Australia Spain France Italy Greece New Zealand Portugal South Korea Malaysia Brazil Argentina Colombia Rwanda United Arab Emirates Czech Republic Cyprus Slovenia Brunei Kuwait Israel Thailand Maldives Panama Cambodia Vanuatu Botswana Mongolia Lao Gabon Kiribati Estonia Hungary Slovak Republic Namibia Solomon Islands Bhutan Fiji Turkmenistan Guyana Kyrgyz Republic Bahrain Lithuania Cape Verde Paraguay Belize Jordan Tajikistan Sri Lanka Venezuela Guatemala Egypt Indonesia Uzbekistan India South Africa Bangladesh Nepal Iraq Micronesia, Fed. Sts. Samoa Tonga Bolivia Philippines Dominican Republic Iran Russia China Ecuador Peru Romania Albania Georgia Kazakhstan Morocco Algeria Azerbaijan Armenia El Salvador Grenada Jamaica Suriname Ukraine Turkey Uruguay Belarus Oman Libya Mauritius Moldova Tunisia Costa Rica Bulgaria Antigua and Barbuda Latvia Lebanon Montenegro Macedonia, FYR Saudi Arabia Barbados Serbia Bosnia and Herzegovina Chile Croatia Bahamas Poland 8 Figure 4 – Jeu de donn ́ ees Country : clustering hi ́ erarchique avec Complete link 0 2 4 6 8 10 12 Malta Luxembourg Singapore Nigeria Haiti Central African Republic Mali Myanmar Rwanda Timor-Leste Sudan Eritrea Pakistan Gambia Ghana Comoros Madagascar Senegal Kenya Yemen Sierra Leone Guinea-Bissau Afghanistan Cameroon Burkina Faso Malawi Tanzania Burundi Uganda Equatorial Guinea Congo, Rep. Lesotho Chad Congo, Dem. Rep. Niger Angola Cote d'Ivoire Mauritania Liberia Togo Guinea Mozambique Benin Zambia Norway Qatar Switzerland Japan United States Finland Germany Iceland Sweden Austria Denmark Canada Australia France Italy Greece Spain United Kingdom New Zealand Portugal Seychelles Malaysia Vietnam Thailand Maldives Panama Ireland Belgium Netherlands South Korea Czech Republic Brunei Kuwait Cyprus Slovenia United Arab Emirates Bahrain Lithuania Estonia Hungary Slovak Republic Israel Croatia Bahamas Poland Costa Rica Serbia Bosnia and Herzegovina Chile Brazil Argentina Colombia Turkey Uruguay Iran Russia China Ecuador Peru El Salvador Grenada Romania Albania Georgia Suriname Ukraine Jamaica Kazakhstan Morocco Armenia Algeria Azerbaijan Bulgaria Macedonia, FYR Saudi Arabia Barbados Lebanon Montenegro Belarus Moldova Tunisia Antigua and Barbuda Latvia Oman Libya Mauritius Dominican Republic Sri Lanka Venezuela Guatemala Egypt Indonesia Uzbekistan India South Africa Bangladesh Nepal Vanuatu Botswana Mongolia Lao Gabon Kiribati Iraq Tajikistan Tonga Bolivia Philippines Micronesia, Fed. Sts. Samoa Belize Jordan Cape Verde Paraguay Namibia Solomon Islands Turkmenistan Guyana Kyrgyz Republic Cambodia Bhutan Fiji 9