Skip to content

Instantly share code, notes, and snippets.

@yamasakih
Last active January 9, 2019 13:02
Show Gist options
  • Save yamasakih/cbe5a75ddb035350b0e652f6a98158da to your computer and use it in GitHub Desktop.
Save yamasakih/cbe5a75ddb035350b0e652f6a98158da to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"金子先生の[demo_opt_gtm_with_k3nerror.ipynb](https://github.com/hkaneko1985/gtm-generativetopographicmapping/blob/master/Python/demo_opt_gtm_with_k3nerror.ipynb)を参考に行なっています"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.figure as figure\n",
"import matplotlib.pyplot as plt\n",
"\n",
"import numpy as np\n",
"from sklearn.datasets import load_iris\n",
"\n",
"from gtm import gtm\n",
"from k3nerror import k3nerror"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# settings\n",
"candidates_of_shape_of_map = np.arange(30, 31, dtype=int)\n",
"candidates_of_shape_of_rbf_centers = np.arange(2, 22, 2, dtype=int)\n",
"candidates_of_variance_of_rbfs = 2 ** np.arange(-5, 4, 2, dtype=float)\n",
"candidates_of_lambda_in_em_algorithm = 2 ** np.arange(-4, 0, dtype=float)\n",
"candidates_of_lambda_in_em_algorithm = np.append(0, candidates_of_lambda_in_em_algorithm)\n",
"number_of_iterations = 300\n",
"display_flag = 0\n",
"k_in_k3nerror = 10\n",
"\n",
"# load an iris dataset\n",
"iris = load_iris()\n",
"# input_dataset = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
"input_dataset = iris.data\n",
"color = iris.target\n",
"\n",
"# autoscaling\n",
"input_dataset = (input_dataset - input_dataset.mean(axis=0)) / input_dataset.std(axis=0, ddof=1)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 250]\n",
"[2, 250]\n",
"[3, 250]\n",
"[4, 250]\n",
"[5, 250]\n",
"[6, 250]\n",
"[7, 250]\n",
"[8, 250]\n",
"[9, 250]\n",
"[10, 250]\n",
"[11, 250]\n",
"[12, 250]\n",
"[13, 250]\n",
"[14, 250]\n",
"[15, 250]\n",
"[16, 250]\n",
"[17, 250]\n",
"[18, 250]\n",
"[19, 250]\n",
"[20, 250]\n",
"[21, 250]\n",
"[22, 250]\n",
"[23, 250]\n",
"[24, 250]\n",
"[25, 250]\n",
"[26, 250]\n",
"[27, 250]\n",
"[28, 250]\n",
"[29, 250]\n",
"[30, 250]\n",
"[31, 250]\n",
"[32, 250]\n",
"[33, 250]\n",
"[34, 250]\n",
"[35, 250]\n",
"[36, 250]\n",
"[37, 250]\n",
"[38, 250]\n",
"[39, 250]\n",
"[40, 250]\n",
"[41, 250]\n",
"[42, 250]\n",
"[43, 250]\n",
"[44, 250]\n",
"[45, 250]\n",
"[46, 250]\n",
"[47, 250]\n",
"[48, 250]\n",
"[49, 250]\n",
"[50, 250]\n",
"[51, 250]\n",
"[52, 250]\n",
"[53, 250]\n",
"[54, 250]\n",
"[55, 250]\n",
"[56, 250]\n",
"[57, 250]\n",
"[58, 250]\n",
"[59, 250]\n",
"[60, 250]\n",
"[61, 250]\n",
"[62, 250]\n",
"[63, 250]\n",
"[64, 250]\n",
"[65, 250]\n",
"[66, 250]\n",
"[67, 250]\n",
"[68, 250]\n",
"[69, 250]\n",
"[70, 250]\n",
"[71, 250]\n",
"[72, 250]\n",
"[73, 250]\n",
"[74, 250]\n",
"[75, 250]\n",
"[76, 250]\n",
"[77, 250]\n",
"[78, 250]\n",
"[79, 250]\n",
"[80, 250]\n",
"[81, 250]\n",
"[82, 250]\n",
"[83, 250]\n",
"[84, 250]\n",
"[85, 250]\n",
"[86, 250]\n",
"[87, 250]\n",
"[88, 250]\n",
"[89, 250]\n",
"[90, 250]\n",
"[91, 250]\n",
"[92, 250]\n",
"[93, 250]\n",
"[94, 250]\n",
"[95, 250]\n",
"[96, 250]\n",
"[97, 250]\n",
"[98, 250]\n",
"[99, 250]\n",
"[100, 250]\n",
"[101, 250]\n",
"[102, 250]\n",
"[103, 250]\n",
"[104, 250]\n",
"[105, 250]\n",
"[106, 250]\n",
"[107, 250]\n",
"[108, 250]\n",
"[109, 250]\n",
"[110, 250]\n",
"[111, 250]\n",
"[112, 250]\n",
"[113, 250]\n",
"[114, 250]\n",
"[115, 250]\n",
"[116, 250]\n",
"[117, 250]\n",
"[118, 250]\n",
"[119, 250]\n",
"[120, 250]\n",
"[121, 250]\n",
"[122, 250]\n",
"[123, 250]\n",
"[124, 250]\n",
"[125, 250]\n",
"[126, 250]\n",
"[127, 250]\n",
"[128, 250]\n",
"[129, 250]\n",
"[130, 250]\n",
"[131, 250]\n",
"[132, 250]\n",
"[133, 250]\n",
"[134, 250]\n",
"[135, 250]\n",
"[136, 250]\n",
"[137, 250]\n",
"[138, 250]\n",
"[139, 250]\n",
"[140, 250]\n",
"[141, 250]\n",
"[142, 250]\n",
"[143, 250]\n",
"[144, 250]\n",
"[145, 250]\n",
"[146, 250]\n",
"[147, 250]\n",
"[148, 250]\n",
"[149, 250]\n",
"[150, 250]\n",
"[151, 250]\n",
"[152, 250]\n",
"[153, 250]\n",
"[154, 250]\n",
"[155, 250]\n",
"[156, 250]\n",
"[157, 250]\n",
"[158, 250]\n",
"[159, 250]\n",
"[160, 250]\n",
"[161, 250]\n",
"[162, 250]\n",
"[163, 250]\n",
"[164, 250]\n",
"[165, 250]\n",
"[166, 250]\n",
"[167, 250]\n",
"[168, 250]\n",
"[169, 250]\n",
"[170, 250]\n",
"[171, 250]\n",
"[172, 250]\n",
"[173, 250]\n",
"[174, 250]\n",
"[175, 250]\n",
"[176, 250]\n",
"[177, 250]\n",
"[178, 250]\n",
"[179, 250]\n",
"[180, 250]\n",
"[181, 250]\n",
"[182, 250]\n",
"[183, 250]\n",
"[184, 250]\n",
"[185, 250]\n",
"[186, 250]\n",
"[187, 250]\n",
"[188, 250]\n",
"[189, 250]\n",
"[190, 250]\n",
"[191, 250]\n",
"[192, 250]\n",
"[193, 250]\n",
"[194, 250]\n",
"[195, 250]\n",
"[196, 250]\n",
"[197, 250]\n",
"[198, 250]\n",
"[199, 250]\n",
"[200, 250]\n",
"[201, 250]\n",
"[202, 250]\n",
"[203, 250]\n",
"[204, 250]\n",
"[205, 250]\n",
"[206, 250]\n",
"[207, 250]\n",
"[208, 250]\n",
"[209, 250]\n",
"[210, 250]\n",
"[211, 250]\n",
"[212, 250]\n",
"[213, 250]\n",
"[214, 250]\n",
"[215, 250]\n",
"[216, 250]\n",
"[217, 250]\n",
"[218, 250]\n",
"[219, 250]\n",
"[220, 250]\n",
"[221, 250]\n",
"[222, 250]\n",
"[223, 250]\n",
"[224, 250]\n",
"[225, 250]\n",
"[226, 250]\n",
"[227, 250]\n",
"[228, 250]\n",
"[229, 250]\n",
"[230, 250]\n",
"[231, 250]\n",
"[232, 250]\n",
"[233, 250]\n",
"[234, 250]\n",
"[235, 250]\n",
"[236, 250]\n",
"[237, 250]\n",
"[238, 250]\n",
"[239, 250]\n",
"[240, 250]\n",
"[241, 250]\n",
"[242, 250]\n",
"[243, 250]\n",
"[244, 250]\n",
"[245, 250]\n",
"[246, 250]\n",
"[247, 250]\n",
"[248, 250]\n",
"[249, 250]\n",
"[250, 250]\n",
"CPU times: user 31min 18s, sys: 1min 17s, total: 32min 35s\n",
"Wall time: 5min 29s\n"
]
}
],
"source": [
"%%time\n",
"# grid search\n",
"parameters_and_k3nerror = []\n",
"all_calculation_numbers = len(candidates_of_shape_of_map) * len(candidates_of_shape_of_rbf_centers) * len(\n",
" candidates_of_variance_of_rbfs) * len(candidates_of_lambda_in_em_algorithm)\n",
"calculation_number = 0\n",
"for shape_of_map_grid in candidates_of_shape_of_map:\n",
" for shape_of_rbf_centers_grid in candidates_of_shape_of_rbf_centers:\n",
" for variance_of_rbfs_grid in candidates_of_variance_of_rbfs:\n",
" for lambda_in_em_algorithm_grid in candidates_of_lambda_in_em_algorithm:\n",
" calculation_number += 1\n",
" print([calculation_number, all_calculation_numbers])\n",
" # construct GTM model\n",
" model = gtm([shape_of_map_grid, shape_of_map_grid],\n",
" [shape_of_rbf_centers_grid, shape_of_rbf_centers_grid],\n",
" variance_of_rbfs_grid, lambda_in_em_algorithm_grid, number_of_iterations, display_flag)\n",
" model.fit(input_dataset)\n",
" if model.success_flag:\n",
" # calculate of responsibilities\n",
" responsibilities = model.responsibility(input_dataset)\n",
" # calculate the mean of responsibilities\n",
" means = responsibilities.dot(model.map_grids)\n",
" # calculate k3n-error\n",
" k3nerror_of_gtm = k3nerror(input_dataset, means, k_in_k3nerror)\n",
" else:\n",
" k3nerror_of_gtm = 10 ** 100\n",
" parameters_and_k3nerror.append(\n",
" [shape_of_map_grid, shape_of_rbf_centers_grid, variance_of_rbfs_grid, lambda_in_em_algorithm_grid,\n",
" k3nerror_of_gtm])\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# optimized GTM\n",
"parameters_and_k3nerror = np.array(parameters_and_k3nerror)\n",
"optimized_hyperparameter_number = \\\n",
" np.where(parameters_and_k3nerror[:, 4] == np.min(parameters_and_k3nerror[:, 4]))[0][0]\n",
"shape_of_map = [parameters_and_k3nerror[optimized_hyperparameter_number, 0],\n",
" parameters_and_k3nerror[optimized_hyperparameter_number, 0]]\n",
"shape_of_rbf_centers = [parameters_and_k3nerror[optimized_hyperparameter_number, 1],\n",
" parameters_and_k3nerror[optimized_hyperparameter_number, 1]]\n",
"variance_of_rbfs = parameters_and_k3nerror[optimized_hyperparameter_number, 2]\n",
"lambda_in_em_algorithm = parameters_and_k3nerror[optimized_hyperparameter_number, 3]\n",
"\n",
"# construct GTM model\n",
"model = gtm(shape_of_map, shape_of_rbf_centers, variance_of_rbfs, lambda_in_em_algorithm, number_of_iterations,\n",
" display_flag)\n",
"model.fit(input_dataset)\n",
"\n",
"# calculate of responsibilities\n",
"responsibilities = model.responsibility(input_dataset)\n",
"\n",
"# plot the mean of responsibilities\n",
"means = responsibilities.dot(model.map_grids)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.22380413497668755"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k3nerror(input_dataset, means, 10)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x1a27f94668>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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f/75bN68mW3btgFw2WWXUV1t/7iTUWh+tukwwc0Qr9j+mJ3W4v4DZFvHnLQp230yevRoZs6cycaNGxk7dizr1q3jtttu4ytf+Uq7fuvWraNbt26HPvfs2ZPly5czZ84c7rvvPp588kkefvjhQ8dVNWlRRz/5SpL1iV0rfg5GcWMmhQxIl/92VGMdL006n3emjOSlSeeb2OZKj76Ztftk7NixPPHEE8ycOZPRo0czYsQIHn74YXbs2AFAW1sb77//fofzPvjgAw4ePMiVV17Jd7/7XV5//fV2x08++WTWr1/Pa685Sey2b9/O/v37Oeecc3jssccAeOutt/jb3/7GwIHtn3zi+yxcuJBevXodWiEbpYOtcDMgVf5bE9c8cMGdjs023qxQWe2058Cpp57K9u3bqauro7a2ltraWt58800+9alPAdC9e3d+9atfUVHR3t+6ra2N6667joMHDwJwzz33tDvepUsXZsyYwc0338zu3buprq5m7ty53Hjjjdxwww3U19fTuXNnHnnkEY444oh25zY3N3PdddfR0NBA165dLX9uiWLpGTOg/6SWpHV8BHhnSvHYkaIk41SCK550bLbbWp2V7QV3Zm2/LVUsPWP0WHrGPNCnpjpp/lvzRMgjDVeZwBolg9lwMyBVWK9hGEY6bIWbAeaJYBhGLpjgZohVIDAMI1vMpGAYhhEStsINCSuGaBhGpCtcEblYRFaLyBoRmZTk+L0issz9ektEtsYdOxB3bHa4M09NYl7cO2attNSNBcz69esZPXp0xud9+ctf5s9//nPKPvfffz+//OUvs52aUWJE5ocrIhXAW8BFQCvwGvB5VU36GywiNwONqnq9+3mHqnbPZMygy6QnIxaNFh8gkVjZN0adu9Itp5VvMfmMFks6xGL6npYqfv1wo1zhngGsUdW1qvoR8ARweYr+nwceD2VmOeBVZDIZsZWurXy9CbpmlVd6xkGDBgHwyCOPMGbMGC699FKampo4ePAgN954I6eeeiqXXHIJn/3sZw+lYvz0pz9N7B949+7duf322znttNMYNmwY77333qHr/8d//AcAa9as4cILL+S0005jyJAh/OUvf2HHjh1ccMEFDBkyhPr6ep599tmc7s8obKIU3Drg3bjPrW5bB0TkeKA/MD+uuUpEFovIIhEZlb9pZkYm+W8rRDxDhY381KxKlp4xlt0rxiuvvML06dOZP38+Tz/9NOvWrWPlypU89NBDvPLKK0mvu3PnToYNG8by5cs555xz+PnPf96hzzXXXMNXv/pVli9fzssvv0xtbS1VVVU888wzvP766yxYsIBvfetbvpLdGMVJlILbMa2S92JwLDBTVePVqZ+7hP8C8CMR+Yekg4hMcIV58aZNm3KbsQ+8os4Sb7a6soIDHn9YlrTcIR81q+LTMy5fvpyePXvSr1+/dn0uuugijj76aMBJmzhmzBg6depE7969Oe+885Jet0uXLofK5Xzyk59k3bp17Y5v376dtrY2Pve5zwFQVVVF165dUVX+7d/+jYaGBi688ELa2toOrY6N0iNKwW0Fjov73BdY79F3LAnmBFVd776uBRYCjclOVNUHVXWoqg499thjc51zWryi0a4Z1q9DHbQ6S1qeknzVrIqlZ5wxYwZjx47tcDw+HaLf1WZlZeWhdIoVFRXs37+/3XGv6zz22GNs2rSJJUuWsGzZMj7+8Y93SE5ulA5R7gi8BpwoIv2BNhxR/UJiJxEZCPQEXolr6wnsUtW9ItILGA78MJRZpyHTaDRLWu5NvmpWjR07ln/+53/mgw8+4Pe//z179+717Hv22Wczffp0xo0bx6ZNm1i4cCFf+EKHX9O0HHXUUfTt25dZs2YxatQo9u7dy4EDB9i2bRsf+9jHqKysZMGCBfz1r3/N5daMAicywVXV/SJyEzAHqAAeVtVVIjIZWKyqMVevzwNPaPslwinAAyJyEGeVPsXLuyEK/EajWahwaiYOmUjzy83tzApB1KxKTM+Y+Pgfz5VXXsm8efMYNGgQJ510EmeeeSY9evTIatxHH32Ur3zlK9x5551UVlby1FNPcc0113DppZcydOhQBg8ezMknn5zlXRnFgKVnNEIlUxemlrUtTHt9Ght3bqR3t95MHDIx9JIqO3bsoHv37mzevJkzzjiDl156id69C6cyrLmFRY+lZzRKgkKoWXXJJZewdetWPvroI77zne8UlNgaxYUJrmGkYeHChVFPwSgRLHmNYRhGSJjgGqFTTvsG+ca+l8WFCa4RKlVVVWzevNmEIgBUlc2bN1NVVRX1VAyfmA3XCJW+ffvS2tpKGFF/5UBVVRV9++ZWNt4IDxNcI1QqKyvp379/1NMwjEgwk4JhGEZImOAahuGLoFNlliNmUjAMIy2xVJmxMOtYqkwg8sCUYsJWuIZhpCUfqTLLERNcwyhz/JgK/KbKzMXsUA4mCxPckEgsLGlldIxCwG9VDa+UmPHtuVToSHbupD9M4uzHzy4p4TXBDYFYYUmrXWYUGn5NBROHTKSqon2ARWKqzFzMDsnOBdj20bacyyoVEia4AeK1ik1WWNJqlxmFgF9TwcgBI2k+q5nabrUIQm23WprPam63YZZLhY5UfUrJVmxeCgEwa2kb//7cKj7cte9QW2wVC941yqx2mZFXVjwJ8ybDtlbo0RcuuBMarmrXJZOqGulSZeZSocPr3Bi5llUqFGyFmyMxc0G82MbYve8A33pyuWdlTKtdZuSNFU/Cc1+Dbe8C6rw+9zWnPQ4/pgK/5HKtZOfGk2tZpULBVrg5ksxcEI9XZV6rXWbklXmTYV/CE9S+3U573Co3tmINoqpGLteK9Zny6hS27t3a7lgQZZUKBSuxkyP9J7V4rmC9qLPaZaWJj0f40GiugaS/mQLNW5O0Fw6FUFYpU6zETkj0qammLQNbrAAvTTo/fxMyoiH2CB9bVcYe4SEa0e3R1zUnJGkvcAqhrFK+MBtujtwyYiDVlRW++5vdtkRJ9QgfBRfcCZUJv2uV1U57kVCKgRAmuDkyqrGOe66op66mGsExF3xxWD8qK6RD38pOYnbbUmVba2bt+abhKrj0x9DjOECc10t/HJ2JI0NyCaIoZCI1KYjIxcA0oAJ4SFWnJBwfD0wFYhECP1HVh9xj44A73Pa7VXV6KJNOwqjGunb22OFT5rPvQEf7Wfeqzma3LVWCeoQP0g7ccFXBCGymdtlUQRTFbG6ITHBFpAK4D7gIaAVeE5HZqvrnhK4zVPWmhHOPBu4ChuLsDCxxz/0whKmnxcu/dmsS1zGjRLjgzvY2XMj8Eb7Q7MABkU2mMS+f3GL3x43SpHAGsEZV16rqR8ATwOU+zx0BvKCqW1yRfQG4OE/zzBgvO63Zb0uYIB7hC80OHBCZhvymMhsE4Y8bpW04SpNCHRD/DNYKnJmk35Uicg7wFvANVX3X49yCeVa/ZcRAbnt6ZTv/XPO7LQNyfYQvNDtwQGQa8psqjDdXf9yo8/pGucLtuKvU0XHwOeAEVW0A5gIxO62fc52OIhNEZLGILA6rcGH8RhpAhcih3AmWsMbwxMveWwSuXKnwk2ksnlRmg1xFMeq8vlEKbitwXNznvsD6+A6qullV97offw580u+5cdd4UFWHqurQY489NpCJ+2FUY90hl7FYtJllCTNSUgKuXMnINOTXS4hru9XmPJdcEuwEQZSC+xpwooj0F5EuwFhgdnwHEYn/Dl8GvOm+nwM0iUhPEekJNLltBYVlCTMyoshdubzwk2ksniDzOySS6Wo7aCKz4arqfhG5CUcoK4CHVXWViEwGFqvqbOBrInIZsB/YAox3z90iIt/FEW2Ayaq6JfSbSINlCTMyJmJXrnyF1WYSPRZkfodEzul7DjNWz0jaHgaWSyGPDJ8yP2nYb11NtYX3GgVH4oYSOCvLVKvRYqNpZlNSl7PabrU8P/r5rK/rN5eCRZrlkWRhv+atYBQqUW8ohUE523BLnmRhv/dcUW/RZkZBkqkYFWOug7K14ZYLiWG/hpGSsFM8xo3Xu19fNiTJAZJMjIL2Zw0rJePEIROTmk3CyrdrgmsYhULYob0J403cvJnmXsewp9Nh0fUSoyByHcRENtGmms9ghHxuyPnBNs0Mo1C4d5BHApzj4BtvhDJeS7euTDvmGDZWdEopRg3TG9AksUaCsGLcirRDJ9ugSyTXjawwsQTkhlFshB3am+S6I3fuYuTO3WmrQuRSMBK8y6LHU+yJapJhm2aGUSiEHdqbw3i5Bif4EdNSKRwZjwmuYRQKYYf25jBeptFjiaQT01IqHBmP2XANo5Dw46UQVJ9M+gVMKhtubbdazul7Di+2vlg0hST92nBNcCNg1tI2ps5Zzfqtu+ljFXyNTEj0ZABnVRqfc8FPnwLAyxWsGCPeTHCTUAiCO2tpW9JcuRYQYfjCjydD2N4OAZOv8Nt8YqG9BYplEDNywo8nQ5EnMo86/DafmOCGjGUQM3LCj2dBEScyb1nbgkiy+gKl4bVgghsyVu/MyAk/ngVFmsg8Zrs9qAc7HEvltVBMOR1McEPGMogZOeEnSXmRJjL3CoboJJ08N8xiIr1h5wYUPRQWXKiia5tmAeLX+8C8FAyjI9mECxfKBpuF9oZMovdBrH4Z0EFMLYOY4UlEfrExwsralYxswoWLbYPNTAoBYd4HRs7E/Ge3vQvo4WxhK54MZfioH8+zCReOOr9tppjgBoR5Hxg5M29y+2AFcD7PmxzK8FFXfMgmXDifBSfzgZkUAqJPTXXS+mXmfWD4JmL/2UJ4PM+k2GSsP0SX3zZTTHAD4pYRA5NGkMW8D2yjzEhLj74eEWLh+M/mmnIxKjIV6Sgxk0KOzFraxvAp8/nGjGVUVXaiprqyQ/2y2IZa29bdKIc31GYtbYt6+kYhEbH/bJSP58XkS5sLka5wReRiYBpQATykqlMSjn8T+DKwH9gEXK+qf3WPHQBWul3/pqqXhTZxl0TPhA937aO6soJ7rx7cbvWaakPNVrnGIWLeCBF5KUT1eH73oruZsXrGoc/5LLETTxQeGZH54YpIBfAWcBHQCrwGfF5V/xzX5zzgT6q6S0T+Bfi0ql7tHtuhqt0zGTNoP9zhU+YntdvW1VTz0qTzD33uP6kliXchCPDOlPY/4ETTw3knH8uC/9tkpggjGvLsptaytoVJf5iU9Fg+fWmDzkhWDMlrzgDWqOpaVf0IeAK4PL6Dqi5Q1V3ux0VAQQWD+/VMqOlambRf4oZaMtPDrxb9zUwRRjSE4KaWygMi2806P+aJqDwyohTcOiB+h6DVbfPiS8Bv4z5XichiEVkkIqPyMcF0pMuLMGtpG4P//Xk+3LWvQ5/KCukQzpvM9JCI+fYaoRGCm1oqUc1ms86vL3FUHhlRCm6ylEBJ7Rsi8kVgKDA1rrmfu4T/AvAjEfkHj3MnuMK8eNOmTbnOuR2p8iLEVqtbd3cUW4BuXTp3MA0kM08kw3x7DcBZad47CJprnNegAyRCcFNLJarZbNb5XblGFTARpeC2AsfFfe4LrE/sJCIXArcDl6nq3li7qq53X9cCC4HGZIOo6oOqOlRVhx577LHBzR4nRPeeK+qpq6nu4JmQbrW6LYkQV3ikpUvEfHuNUKLSQkjzmMwzAuDqgVdnZUv1u3KNyiMjSi+F14ATRaQ/0AaMxVmtHkJEGoEHgItV9f249p7ALlXdKyK9gOHAD0ObeRxeeRHSrVaTieYBHxuYllnMAFI/7ge1qXXBnclL9bhuakHs8gftGeHXlzgqj4zIBFdV94vITcAcHLewh1V1lYhMBhar6mwcE0J34Ck3KXHM/esU4AEROYizSp8S790QNbOWtiF42EfwFs06j2i1ChEOqpqXgnGYMKLSPNzUWrp3457Hz2bbR9sOdc3WlSto16yJQyYm9T5ItnKNImDC0jPmAS93MYCeXSu569JTPdM2Wr0zwxcR1S1LVW0XMnPlylexyEj8ay09Y3Sk2tRaemeT57GYqFoIsJGWNI/7+cIrSXiMTHb5U21w5SKQhRzqa4KbB7wS2dT52OyyXLmGLyKKSksnqJns8hdCspywSSu4ItIXZ0Pr/wF9gN3AG0AL8FvVJAWIShg/SWjSJbIxjEBouCr0sjlem1KQ+S5/sSbLyYWUbmEi8gvgYeAj4AfA54EbgbnAxcAfReScfE+yUPCbhCaVu5hhFDNeblw1R9RkbHsttly2QZBy00xEBqmqpwVeRLrgBCCsycfkgibXTTO/uRNSYWkajWInyE2pMDa4whjD76aZeSlkQCZJaJJhXgiGES758oRIJNDkNSIyXEReEJG3RGStiLwjImu5PuWgAAAgAElEQVRzn2ZxkS53Qjqs7plhhEvUZYMS8Rva+9/AfwFnA6fj5DU4PV+TKlRS5U7wg9U9M4xwKTRPCL9uYdtU9bfpu5U2ufrJ9qiuTJrMpqZrJcOnzDe7rhEYUZY7LyQKzRPCr+AuEJGpwNNAfAKZ1/MyqwImWz/ZWUvb2PnR/g7tnQR27Nl/KIVjzPMhNpZhZEqi3TKsCgqFSCahvmHgV3DPdF/jjcIK+NuaN5g6ZzX7DnTcclNg38H27VZ+p0zJsrpC4mp2175deYngKkYKraqvL8FV1fPyPZFSx8tO6+UkYnbdMiOWbjEWqhtLtwgpRTfZahZVSJLqs5QjuFJRSKG+vkN7RWQkcCpwyFNZVYNL/V7CzFraRieRpOkXKzzaLedtmZFlusWkuQ088iqXcgRXLoRp7/brFnY/cDVwM47b6Rjg+LzMqMSI+d4mE9Xqygo+f+ZxOXk+GCVClukWPVetCb9vpR7BlS1+S/IEhV+3sLNU9VrgQ1X9d+BTtK/WYHjgVfmhQoR7rqjn7lH1FgZsZF1dwXPVKuKIriq1+/YH7uhfKoTtp+vXpBB71tklIn2AzUD/vMyoxPCyxR5UPSSqliGsDEi3IZZlusVku/CHEKF2336e314BJrZJCdtP16/g/o+I1OBUYHgdZ3P9obzMqMTwStWYrY3WcjEUIX42xLJMtxhbtU76w6Skxzd2rsh7jtxiJmw/XV8mBVX9rqpuVdXf4NhuT1bV7+RlRiVGrtFp8fjNVmYUGH7LjTdc5VRraN7qvDZc5asy78gBI6ntVpt06N5dakJP4VhMhJ2xzO+mWVcR+Y6I/NytnPsxEbkkLzMqMeJTNYJju4352WYqlJaLoUjJtv5YBpV5PYVj2G1ZTro8GDlgJM1nNVPbrRZBqO1Wm1d7t1+Twi+AJTibZeCUOH8K+J98TKpUiH/871FdSWWFHAp+yCaizHIxFCk9+nrUH0tTbjwDV7GwHfxLKXQ4TD9dv4L7D6p6tYh8HkBVd4t4OPsZQMdUjMlyKGQaURa0PdgIiWzrj2W4Mg5LOCx0OHv8uoV9JCLVuJW/ReQfiMupYHTEyx0skUxWp0Hag40QabgKLv2xU1EXcV4v/XF622qWrmL5ptBSHhYTfle4dwG/A44TkceA4cD4XAcXkYuBaUAF8JCqTkk4fgTwS+CTOK5oV6vqOvfYbcCXgAPA11R1Tq7zCRK/QprJ6tSq+hYx2dQfi6gybzoKLeVhMeE3l8ILIvI6MAwn0myiqn6Qy8AiUgHcB1yEYxN+TURmq+qf47p9CSfY4h9FZCxOXbWrReQTOIUtT8UpbDlXRE5S1fRLypDwevyPJ5vVqfnsRkSWiWUCuX7IlXnTUWgpD4uJTMqk1+GsRDsD54gIqvp0DmOfAaxR1bUAIvIEcDkQL7iXA83u+5nAT1zb8eXAE67HxDsissa93is5zCdQklXurewkdK/qzNZd+2x1Wkxkk1gmE4FOd/2o3boS7mVi4+do3vO7gkl5WEz4ElwReRhoAFYBsbLoipMfN1vqgPit21YOp4Hs0EdV94vINuAYt31RwrkFpVz2+F9CZJpYJlOB9nP9fK+wvUhyLyNf+jkM/2emffCnkvBSCBO/K9xhqvqJgMdO5uWQmOHFq4+fc50LiEwAJgD069cvk/nljD3+lwjJXLrA24sgU4FO542QZerGQPC4l5FLn2HkNzwLehse+BXcV0TkEwn21VxppX0CnL7Aeo8+rSLSGegBbPF5LgCq+iDwIDhVewOZeQpShd5aWG4RsuJJnP/vSX51vLwFMg108PLTre7pRJclO+YjdWMgZBu0YSTFr+BOxxHdjTjuYAKoqjbkMPZrwIki0h9ow9kE+0JCn9nAOBzb7GhgvqqqiMwGfi0i/4WzaXYi8GoOcwmERN/b+OAGwPOYiW4BM28yyR+exNtbINNAh2TeCBVdYO922L3Fe25hiF62QRtGUvwK7sPAPwErOWzDzQnXJnsTMAdnM+5hVV0lIpOBxao6G6da8KPuptgWHFHG7fckzgbbfuCrheChkC701uuYCW4B4ylqejjXQaJtNVN3rmTeCB/tTC22EI7oFahrWrEi6lXjJb6TyHxVLfr6ZUOHDtXFixfn7fr9J7V4rYUAz3US70yxzYaCxeuRvsdx3mJ06Y+d97lscjXX4LEt0X6csDbOCsw1rdAQkSWqOjRdP78r3P8TkV8Dz9G+am8uXgolR7rQWwvLLUJSrfBSbY7Fsn1li9ejPBwW+1xFz6+QhuyaVkp5GhLxK7jVOELbFNeWq1tYyZHM9zY+uCHVMaNASRV88PSE5OcEYVtNtXoOQvyi9HxIQkxkEwMqSi1Pg99Is+vyPZFSwI/vrXkpFCFeK7x8bijlO8osy6KV+SAxGU4ipVTiPaUNV0TuAH6qqkmt9yJyPtBVVYsiTWO+bbhGmZG4SoRwbau54GkjFicBeog0zWxKGiocjyCsGLcipBllTlA23JXAcyKyB6e0ziacMuknAoOBucD3c5yrYRQnBZrrwBcF5O7lJ+lNqeRpSCm4qvos8KyInIiTIawW+DvwK2CCqlrma6O8KYRcB9lQQO5eXslwYpRSngZfbmGlgpkUDCMO10uhZf8Wph1zNBsqhE7SiYN6kNputaF5B6Sy4YY5j1wI2i3MMIxUFKOvasNVtHTv1k7sDqoT1xSmd0DY5YGixFa4hpErRbx5lm7DqrZbLc+Pfj7EGRUnfle4fkvsGIbhhd8y6AVIug0rq+IQLGkFV0RGiMiXROSEhPbr8zUpwygqijijVrrd/1LxDigUUgquiHwfuB2oB+aJyM1xh2/K58QMI1JWPOnkUWiucV5XPOndt0CLPfph4pCJVFVUJT1WSt4BhUK6Fe6lwPmq+nWcQo6fEZF73WNWJt0oTWI22W3vAno47NVLdC+407HZxuPXxSoTYc8DIweMpPmsZmq71QLQSRxJqO1WS/NZzWk3rlrWttA0s4mG6Q00zWyiZW1L3udczKSLNHtTVU+J+1yBk8z7KOATqnpq/qcYHIWwaWZJyIuAVBnCvKocZOOl4HezrUA9IJK5c1VVVPkS6lLD76ZZOsH9H2Cqqv4+of1u4N9Utag23aIW3MQE5eAksLnninoT3UIirLBXP8JewB4QXh4O5ejZEJSXwhiSVFJQ1TtoX+LG8EG6BOVGgRCWTdbPZlsBe0B4eTCYZ4M3KQVXVXer6m4RmScin004fFce51WSrE+SDzdVuxERudhkM8GPsBewB4SXB4N5Nnjj1yTQH7hVROJFNu3y2WiPV7JxS0JeYDRc5Tyy9zgOEOc1H4/wfoS9gD0gknk4mGdDavwK7lbgAuDjIvKciPTI45xKlltGDKS6sqJdmyUhL1AarnLsqM1bc6/ekGqMdMIe1mo7C+I9HATx7dlQzvitabZUVRvd9+OBbwE9VTX6f7MZEPWmGZiXgpEFBeqlYBwmEC+FuIt9RVUfiPv8SZxKuUUVbVYIgmsYYVKI9cEKcU65Emi2sHixdT8vAYpKbA2j3Ej0ky2E+mCFOKcwicSPVkSOFpEXRORt97Vnkj6DReQVEVklIitE5Oq4Y4+IyDsissz9GhzuHRhG4TPt9WkdcszG6oNFRSHOKUyiClyYBMxT1ROBee7nRHYB17rRbBcDPxKRmrjjt6jqYPdrWf6nnDuzlrYxfMp8+k9qYfiU+cxa2hb1lIwoCCmcN99+stmE9Za7725Ugns5MN19Px0YldhBVd9S1bfd9+uB94FjQ5thwMSizNq27kaBtq27ue3plSa6pYqXqGaapyEH8uknGzMNbNi5AUUPmQbSiW65++5GJbgfV9UNAO7rx1J1FpEzgC7AX+Kav+eaGu4VkSPyN9XciK1qvz5jmUWZlQupRDXEyLF8+slmaxood9/dvJXYEZG5QLJ/W7dneJ1a4FFgnKpb/wNuAzbiiPCDwK1A0t9YEZkATADo169fJkPnTLLcCYlYlFkJkkpUQ4wcy2fpmmxNA+VUTicZeRNcVb3Q65iIvCcitaq6wRXU9z36HQW0AHeo6qK4a8cyZuwVkV8A304xjwdxRJmhQ4eGWk8oWe6ERCzKrARJJaohlycfOWBkXsTMq9KuH9NAvuZUDERlUpgNjHPfjwOeTewgIl2AZ4BfqupTCcdq3VfBsf965MyLlnSrV4syK1FSheMWcORYJpS7aSBbohLcKcBFIvI2cJH7GREZKiIPuX2uAs4Bxidx/3pMRFYCK4FewN3hTt8fPaorPY/V1VRbWsZSJZWohpWnIc9YWG92WNXePDFraRu3zFzOvgPtv7+VnYSpY04zoS11LBy3rAg00szInKlzVncQW4DuVZ1NbMuBhquKR2Dtn0NomODmCS/77dZd+5K2W1IbIxISK0rEXNjARDcPFFWJnGIik9y3FhRhREYSF7a7jzyC016fTP30ek775Wncvaggt0iKEhPcPJFJ7lsrvWNERoIL291H1zDjqCM5KE5R7oN6kBmrZ5joBoQJbp4Y1VjHPVfUU1dTjZDcKyEWhdZmpXeMqEhwYXvqqCPBFdt27W891aHNyByz4eaRUY11nnZYP1FoFhRh5J0L7mxnwz3o0e2geh0xMsFWuBGRLgqtskIsKMLIPwl+wV6C0ElMKoLAVrgBkomnQTpzQbcu5j5mhEScC9uYRXczY/WMDl3GnDQm7FmVJPZvKyAy9TRIZy7Ytju5+5hh5JM7ht3B1QOvPrSi7SSduHrg1dwx7I6IZ1YaWKRZQHhtftXVVPPSpPM7tKez4XqdZxhG4eE30sxWuAHhZSLwao95MdQkybdgSW1KjJAqPBiFjwluQGQS6BBjVGMdy+5q4kdXD07pPmYUMSFWeDAKH9s0C4hbRgzsYCLwu1JN5T5mFCHxuQmkE2iC2SiWjNxCZ8sOE9yAiAlmvvIhWK6FIiExN0Gi2MbIQ4UHo/CxTbOQyUY4k22wVVdWmOmhELl3UPKKDsnocZxl5ioRbNOsAMk2SY3lWigiMlm5mj237DDBDZFshTNTDwgjQrzK60hF8vY8Vew1ChMT3BDJVjiz8YAwIsKrvM7n7gc6JoUBzJ5bRpjghki2wplJqkcjYlLVLEtVXNIIhJa1LTTNbKJhegNNM5toWdsS9ZTaYYIbIn6FM5a2sf+kFoZPmQ+QNtWjUUA0XAXfeAOatzqvsU2xEqnYC4UpbC1rW2h+uZkNOzegKBt2bqD55eaCmFsM81IImXReCuaRUOKUQP2wmLDtObDnUFtVRVXkVXubZjaxYeeGDu213Wp5fvTzeR3br5eCCW6B4ZWToaa6kmV3NUUwI8NoT5TCloqG6Q0oHfVMEFaMW5HXsQvaLUxEjhaRF0Tkbfe1p0e/AyKyzP2aHdfeX0T+5J4/Q0S6hDf7/OJZfHL3PqtxZhQEG3duzKg9LHp3651RexREZcOdBMxT1ROBee7nZOxW1cHu12Vx7T8A7nXP/xD4Un6nGx6pNtDM79YoBApV2CYOmUhVRVW7tqqKKiYOmRjRjDoSleBeDkx3308HRvk9UUQEOB+Ymc35hU4qzwPzuy0wyjQLWKEK28gBI2k+q5nabrUIQm232sjtyolElUvh46q6AUBVN4jIxzz6VYnIYmA/MEVVZwHHAFtVdb/bpxUomd2kUY11/Ptzq/hwV8cE5OZ3W0Ak5kyIRY1B0W2CZUpMwKa9Po2NOzfSu1tvJg6ZWBDCNnLAyIKYhxd5E1wRmQske8a4PYPL9FPV9SIyAJgvIiuBvyfp57nzJyITgAkA/fr1y2Do/OPlsXDXpadmnXnMCIl5kw+LbYwyygJW6MJWqORNcFX1Qq9jIvKeiNS6q9ta4H2Pa6x3X9eKyEKgEfgNUCMind1Vbl9gfYp5PAg8CI6XQrb3EzSJ7l+xvAqQ/8xjRgB4RYdZ1JiRgqhMCrOBccAU9/XZxA6u58IuVd0rIr2A4cAPVVVFZAEwGnjC6/xCJ1VehVh+XBPYAqZH3+RZwbKNGisB/1wjPVFtmk0BLhKRt4GL3M+IyFARecjtcwqwWESWAwtwbLh/do/dCnxTRNbg2HT/O9TZB4AlpClygowas6oQhyjECLYgiWSFq6qbgQuStC8Gvuy+fxmo9zh/LXBGPueYb/rUVCcNcLCNsSIhtvoMYlVa5vbgGIkRbLHQXKBk7MVW8SEicinJYxQIDVcFI4hmDwYcr4f4cGGAPQf2MO31aSa4Rm7YxphxiKDtwUVKoUawBYkJboTYxpgBOKaIeJ9eKNosYrnQu1vvpDkaoo5gCxJLz2gYURGLVHt6AnSuhuqj6ZBDt1jJIgqvUCPYgsRWuIaRLbm4ciVGqu3e4qxqr3iwuIUWso7CK+QItqCw9IyGkQ2JogKOYPpdmXpV9+1xnJO0vJgp5XvzwG96RlvhGkY25OrKVUKeCS1rW9qvSvdvIematAjvLWjMhmsY2ZCrYJZIfbOkZW2OPZqWbl07di6ye8sHJrghkFijzBKJlwC5CmaJ1DdL6jsrwrSjE2oKFOG95QMT3DwTS1LTtnU3yuEkNSa6RU6ugpmqum8R4ek727mi6O8tH5gNN8+kS1JjFClBhPYGFakWId6+s7UwLrr6ZoWKCW6esSQ1JUwJCGauTBwyMWkF31LynQ0SE9w8Y0lqjFKmHHxng8QEN89Ykhqj1LHqD/4xwQ0Qr5I5YElqDMMwwQ2MdCVzTGANwzC3sIBI5Y1gGIYBJriBYd4IhmGkwwQ3ILy8DswbwfBFFukMjeLDbLgBYd4Ihm8S0zqe2ATLf51xOkOj+DDBDYhsvBFSeTUYJUqyXLGLHwYS0qSWYRHJcsAEN0Ay8UZI59VglCjJ0jrGiW1Lt65M61nDxs4V9N5/gIlrW8zHtYSIxIYrIkeLyAsi8rb72jNJn/NEZFnc1x4RGeUee0RE3ok7Njj8u8gN82ooU1Kkb2zp1pXmXkezobIzKsKGys40v9xMy9qWECdo5JOoNs0mAfNU9URgnvu5Haq6QFUHq+pg4HxgFxCfDeOW2HFVXRbKrAPEvBrKFM/0jcK0njXs6dT+TzJWJtwoDaIS3MuB6e776cCoNP1HA79V1V15nVWImFdDmeKV1nHo9U5KwySUUpnwcicqwf24qm4AcF8/lqb/WODxhLbvicgKEblXRI7IxyTzyS0jBlJd2f4PzLwaygCvPLiX/Be9u/dJekoplQkvd/K2aSYic4Fkvym3Z3idWqAemBPXfBuwEegCPAjcCkz2OH8CMAGgX79+mQydVyzHQhnjkdbRUh2WPpFU7RWR1cCnVXWDK6gLVTXp0k5EJgKnquoEj+OfBr6tqpekG9eq9hqFToeCjJbqsCgo9Kq9s4FxwBT39dkUfT+Ps6I9hIjUumItOPbf0qy9bOSXxACETCs25AFLdVjaRGXDnQJcJCJvAxe5nxGRoSLyUKyTiJwAHAf8PuH8x0RkJbAS6AXcHcKcjVIiFoCw7V1AD0d3WUitkUciMSlEhZkUjEPcO8gV2wR6HAffsAcmIzP8mhQseY1RnngFIKQITAgMS1RTtlhor1Ge9OjrscL1CkzIknJKVFOANvFCw1a4RnniFYBwwZ3BjZHMTrz44Y65FGKJaooZs4n7wgTXKE+8AhCCXJGlSVTTjjBMGfkk2b2Wwj+SgDGTglG+eAQgBEYmIhq0KSNsorSJFxG2wjWMfJEiUU07MjFlFOqGm9e9Fvs/koAxwTXKkzCEK0WimqxMGYVsJ01jE29Z20LTr8+m4ZFBND10Ci33FdA/ixAxk4JRfiSrupAPT4HYtYLauU9lJ43aGyDFvbasbaH5j99hj+6DWJ7fioMw9xZGxp9bBljgg1F+FGvQQ3MNyTfdBJq3hj0b3zTNbGLDzg0d2mv37ef57RWF/T33iQU+GIYXxbrBk42dtABsvl75fDd2rij873nAmOAa5Ycf4SoAoepApr7DBWLz9crn23v/gbLbVDPBNcqPdMJVIELVgUx9hwvEN3bikIlUSWW7tqqDB5n4913BBpoUAbZpZpQf6TazCn1zyu8cCsR0Eks3OW3RPWz8aKtTjXhvBSMvnBr99zNkTHCN8iSVcBWIUOVMWPkifGB5fh3MpGAYiZSKE38Y+SKMjDDBNYxESkWowsgXYWSEmRTKnFlL26yQZSJBByxESb7zRRgZYYJbxsxa2sZtT69k974DALRt3c1tT68EMNHNRqgsH6yRBjMplDFT56w+JLYxdu87wNQ5qyOaURFTqK5kRkFhglvGrN+amKs1dbuRggLxeTUKGxPcMqZPTXVG7UYKSsWVzMgrJrhlzC0jBlJdWdGurbqygltGDIxoRkVMqbiSGXklEsEVkTEiskpEDoqIZ4YdEblYRFaLyBoRmRTX3l9E/iQib4vIDBHpEs7MS4tRjXXcc0U9dTXVCFBXU809V9Tbhlk2lIormZFXovJSeAO4AnjAq4OIVAD3ARcBrcBrIjJbVf8M/AC4V1WfEJH7gS8BP8v/tEuPUY11JrBBUEquZEbeiERwVfVNABFJ1e0MYI2qrnX7PgFcLiJvAucDX3D7TQeaMcE1osZ8Xo00FLINtw6IDwRvdduOAbaq6v6E9qSIyAQRWSwiizdt2pS3yRqGYaQjbytcEZkLJEuEebuqPuvnEknaNEV7UlT1QeBBcCo++BjXMAwjL+RNcFX1whwv0QocF/e5L7Ae+ACoEZHO7io31m4YhlHQFLJJ4TXgRNcjoQswFpitThG2BcBot984wM+K2TAMI1Kicgv7nIi0Ap8CWkRkjtveR0T+F8Bdvd4EzAHeBJ5U1VXuJW4Fvikia3Bsuv8d9j0YhmFkilXtNQzDyBGr2msYhlFgmOAahmGEhAmuYRhGSJjgGoZhhIQJrmEYRkiY4BqGYYSECa5hGEZIlJUfrohsAv6a4Wm9cMKJoyDKsct9/HK+96jHL8Z7P15Vj03XqawENxtEZLEfh+ZSG7vcxy/ne496/FK+dzMpGIZhhIQJrmEYRkiY4KbnwTIdu9zHL+d7j3r8kr13s+EahmGEhK1wDcMwQqLsBTfqku0icrSIvOCe/4KI9EzS5zwRWRb3tUdERrnHHhGRd+KODQ56fLffgbgxZgdx/z7vfbCIvOL+jFaIyNVxx7K6d6+fZdzxI9x7WePe2wlxx25z21eLyAi/95rh+N8UkT+79ztPRI6PO5b05xDg2ONFZFPcGF+OOzbO/Vm9LSLjMh3b5/j3xo39lohsjTuW670/LCLvi8gbHsdFRH7szm2FiAyJO5bzvQOgqmX9BZwCDAQWAkM9+lQAfwEGAF2A5cAn3GNPAmPd9/cD/5Lh+D8EJrnvJwE/SNP/aGAL0NX9/AgwOof79zU+sMOjPev79zM2cBJwovu+D7ABqMn23lP9LOP63Ajc774fC8xw33/C7X8E0N+9TkUexj8v7uf7L7HxU/0cAhx7PPATj9+7te5rT/d9z6DHT+h/M/BwEPfunn8OMAR4w+P4Z4Hf4tRNHAb8Kah7j32V/QpXVd9U1dVpuh0q2a6qHwGxku2CU7J9pttvOjAqwylc7p7n9/zRwG9VdVeG4wQ1/iECuP+0Y6vqW6r6tvt+PfA+kNbBPAVJf5Yp5jUTuMC918uBJ1R1r6q+A6xxrxfo+Kq6IO7nuwinbl8Q+Ll3L0YAL6jqFlX9EHgBuDjP438eeDzDMTxR1RdxFiteXA78Uh0W4dROrCWYewfMpOCXQEq2e/BxVd0A4L5+LE3/sXT8Jfye+wh0r4gckafxq8QpN78oZs4g9/vP6N5F5AycldFf4pozvXevn2XSPu69bcO5Vz/nBjF+PF/CWXXFSPZzCHrsK93v6UwRiRVyDfXeXTNKf2B+XHMu957L/IK4dyCPVXsLCYm4ZHuq8X2MHX+dWqAep85bjNuAjThC9CBOvbfJeRi/n6quF5EBwHwRWQn8PUm/dvcf8L0/CoxT1YNuc9p7T3apdHNO0cfXzzuA8Z2OIl8EhgLnxjV3+Dmo6l+SnZ/l2M8Bj6vqXhG5AWelf34m885x/BhjgZmqeiCuLZd7z2V+Qdw7UCaCqxGXbE81voi8JyK1qrrBFZX3U8zjKuAZVd0Xd+0N7tu9IvIL4Nv5GN99nEdV14rIQqAR+A1p7j+IsUXkKKAFuMN91PN970nw+lkm69MqIp2BHjiPon7ODWJ8RORCnH9K56rq3li7x8/Br+ikHVtVN8d9/Dnwg7hzP51w7kKf4/oeP46xwFcT5pbLvecyvyDuHTCTgl/yWbJ9tnuen/M72LRcoYrZU0cBSXdgcxlfRHrGHtdFpBcwHPhzAPfvZ+wuwDM4trWnEo5lc+9Jf5Yp5jUamO/e62xgrDheDP2BE4FXfYyZ0fgi0gg8AFymqu/HtSf9OQQ8dm3cx8twKmaD81TV5M6hJ9BE+yetQMZ35zAQZ3Pqlbi2XO/dD7OBa11vhWHANvefehD37pDLrl8pfAGfw/kPthd4D5jjtvcB/jeu32eBt3D+o94e1z4A549uDfAUcESG4x8DzAPedl+PdtuHAg/F9TsBaAM6JZw/H1iJIza/AroHPT5wljvGcvf1S0Hcv8+xvwjsA5bFfQ3O5d6T/SxxTBGXue+r3HtZ497bgLhzb3fPWw18JsvfuXTjz3V/F2P3OzvdzyHAse8BVrljLABOjjv3evd7sga4Lh/37n5uBqYknBfEvT+O4+WyD+dv/kvADcAN7nEB7nPntpI4r6Ug7l1VLdLMMAwjLMykYBiGERImuIZhGCFhgmsYhhESJriGYRghYYJrGIYREia4hmEYIWGCa5QMIvI9EXlXRHak6TdKRO4Ma14JY9eLyCNRjG1EjwmuUUo8h7/sXf8K/DTPc0mKqq4E+opIvyjGN6LFBNcoOkTkBjmciPodEVkAoKqL9HB+Ba9zTwL2quoH7udHRORnIrJARNaKyLniJKp+M34lKiJN4iRCf11EnhKR7m77nSLymoi8IX/s978AAAHQSURBVCIPumHGiMhCEfmBiLwqTiLt/xc3jedwwlqNMsME1yg6VPV+VR0MnI4TovlfGZw+HHg9oa0nTkasb+CI4b3AqUC9OBUnegF3ABeq6hBgMfBN99yfqOrpqjoIqAYuibtuZ1U9A/g6cFdc+2IgXoCNMqEssoUZJcs0nMQyz2VwTi2wKaHtOVVVN+Xke+5jPyKyCieHRV+cag8vuQvYLhxOrHKeiPwr0BWnIsAqHNEGeNp9XeJeJ8b7OLk6jDLDBNcoSkRkPHA8cFOGp+7GSbcYTyz94cG497HPnYEDOBn/P58whyocW/BQVX1XRJpxEt8kXvcA7f/Wqtx5GGWGmRSMokNEPomT+/aLejgZuV/eBP4xw3MWAcNF5B/d8bu6tuCYuH7g2nRHe10ggZPIPI2mUQKY4BrFyE04j+8L3I2zhwBE5Ici0gp0FZFWd8WZyItAY2xzyw+qugmnuOLjIrICR4BPVtWtOEm6VwKzcPK9+uE8nITqRplh6RmNskNEpuHYbedGMPYRwO+Bs/VwLTijTLAVrlGOfB9nkysK+uGUhjexLUNshWsYhhEStsI1DMMICRNcwzCMkDDBNQzDCAkTXMMwjJAwwTUMwwiJ/x+SWm5wyeNoRAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(5, 5))\n",
"for i in np.arange(3):\n",
" x = np.ma.masked_where(color!=i, means[:, 0])\n",
" y = np.ma.masked_where(color!=i, means[:, 1])\n",
" plt.scatter(x, y, c=f'C{i}', label=iris.target_names[i])\n",
"plt.ylim(-1.1, 1.1)\n",
"plt.xlim(-1.1, 1.1)\n",
"plt.title('GTM iris dataset')\n",
"plt.xlabel('z1 (mean)')\n",
"plt.ylabel('z2 (mean)')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best parameters\n",
"Shape of map = 30\n",
"Shape of RBF centers = 4\n",
"Variance of RBFs = 8.0\n",
"Lambda in EM algorithm = 0.25\n"
]
}
],
"source": [
"print(f'Best parameters')\n",
"print(f'Shape of map = {shape_of_map[0]}')\n",
"print(f'Shape of RBF centers = {shape_of_rbf_centers[0]}')\n",
"print(f'Variance of RBFs = {variance_of_rbfs}')\n",
"print(f'Lambda in EM algorithm = {lambda_in_em_algorithm}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# EOF "
]
}
],
"metadata": {
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment