689 lines
61 KiB
Text
689 lines
61 KiB
Text
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# K近邻分类实验"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"在这个练习中,我们使用电信企业的客户流失数据集,`e2.1_Orange_Telecom_Churn_Data.csv`(存放在当前目录下)。我们先读入数据集,做一些数据预处理,然后使用K近邻模型根据用户的特点来预测其是否会流失。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第一步:\n",
|
||
"* 将数据集读入变量`data`中,并查看其前5行。\n",
|
||
"* 去除其中的`\"state\"`,`\"area_code\"`和`\"phone_number\"`三列。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 88,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>state</th>\n",
|
||
" <th>account_length</th>\n",
|
||
" <th>area_code</th>\n",
|
||
" <th>phone_number</th>\n",
|
||
" <th>intl_plan</th>\n",
|
||
" <th>voice_mail_plan</th>\n",
|
||
" <th>number_vmail_messages</th>\n",
|
||
" <th>total_day_minutes</th>\n",
|
||
" <th>total_day_calls</th>\n",
|
||
" <th>total_day_charge</th>\n",
|
||
" <th>total_eve_minutes</th>\n",
|
||
" <th>total_eve_calls</th>\n",
|
||
" <th>total_eve_charge</th>\n",
|
||
" <th>total_night_minutes</th>\n",
|
||
" <th>total_night_calls</th>\n",
|
||
" <th>total_night_charge</th>\n",
|
||
" <th>total_intl_minutes</th>\n",
|
||
" <th>total_intl_calls</th>\n",
|
||
" <th>total_intl_charge</th>\n",
|
||
" <th>number_customer_service_calls</th>\n",
|
||
" <th>churned</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>KS</td>\n",
|
||
" <td>128</td>\n",
|
||
" <td>415</td>\n",
|
||
" <td>382-4657</td>\n",
|
||
" <td>no</td>\n",
|
||
" <td>yes</td>\n",
|
||
" <td>25</td>\n",
|
||
" <td>265.1</td>\n",
|
||
" <td>110</td>\n",
|
||
" <td>45.07</td>\n",
|
||
" <td>197.4</td>\n",
|
||
" <td>99</td>\n",
|
||
" <td>16.78</td>\n",
|
||
" <td>244.7</td>\n",
|
||
" <td>91</td>\n",
|
||
" <td>11.01</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>2.70</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>OH</td>\n",
|
||
" <td>107</td>\n",
|
||
" <td>415</td>\n",
|
||
" <td>371-7191</td>\n",
|
||
" <td>no</td>\n",
|
||
" <td>yes</td>\n",
|
||
" <td>26</td>\n",
|
||
" <td>161.6</td>\n",
|
||
" <td>123</td>\n",
|
||
" <td>27.47</td>\n",
|
||
" <td>195.5</td>\n",
|
||
" <td>103</td>\n",
|
||
" <td>16.62</td>\n",
|
||
" <td>254.4</td>\n",
|
||
" <td>103</td>\n",
|
||
" <td>11.45</td>\n",
|
||
" <td>13.7</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3.70</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>NJ</td>\n",
|
||
" <td>137</td>\n",
|
||
" <td>415</td>\n",
|
||
" <td>358-1921</td>\n",
|
||
" <td>no</td>\n",
|
||
" <td>no</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>243.4</td>\n",
|
||
" <td>114</td>\n",
|
||
" <td>41.38</td>\n",
|
||
" <td>121.2</td>\n",
|
||
" <td>110</td>\n",
|
||
" <td>10.30</td>\n",
|
||
" <td>162.6</td>\n",
|
||
" <td>104</td>\n",
|
||
" <td>7.32</td>\n",
|
||
" <td>12.2</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.29</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>OH</td>\n",
|
||
" <td>84</td>\n",
|
||
" <td>408</td>\n",
|
||
" <td>375-9999</td>\n",
|
||
" <td>yes</td>\n",
|
||
" <td>no</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>299.4</td>\n",
|
||
" <td>71</td>\n",
|
||
" <td>50.90</td>\n",
|
||
" <td>61.9</td>\n",
|
||
" <td>88</td>\n",
|
||
" <td>5.26</td>\n",
|
||
" <td>196.9</td>\n",
|
||
" <td>89</td>\n",
|
||
" <td>8.86</td>\n",
|
||
" <td>6.6</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>1.78</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>OK</td>\n",
|
||
" <td>75</td>\n",
|
||
" <td>415</td>\n",
|
||
" <td>330-6626</td>\n",
|
||
" <td>yes</td>\n",
|
||
" <td>no</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>166.7</td>\n",
|
||
" <td>113</td>\n",
|
||
" <td>28.34</td>\n",
|
||
" <td>148.3</td>\n",
|
||
" <td>122</td>\n",
|
||
" <td>12.61</td>\n",
|
||
" <td>186.9</td>\n",
|
||
" <td>121</td>\n",
|
||
" <td>8.41</td>\n",
|
||
" <td>10.1</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>2.73</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>False</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" state account_length ... number_customer_service_calls churned\n",
|
||
"0 KS 128 ... 1 False\n",
|
||
"1 OH 107 ... 1 False\n",
|
||
"2 NJ 137 ... 0 False\n",
|
||
"3 OH 84 ... 2 False\n",
|
||
"4 OK 75 ... 3 False\n",
|
||
"\n",
|
||
"[5 rows x 21 columns]"
|
||
]
|
||
},
|
||
"execution_count": 88,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# 将数据集读入变量data中,并查看其前5行\n",
|
||
"import pandas as pd\n",
|
||
"data = pd.read_csv('e2.1_Orange_Telecom_Churn_Data.csv')\n",
|
||
"data.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 89,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 去除“state\",\"area_code\"和\"phone_number\"三列\n",
|
||
"data.drop('state', axis=1, inplace=True)\n",
|
||
"data.drop('area_code', axis=1, inplace=True)\n",
|
||
"data.drop('phone_number', axis=1, inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第二步:\n",
|
||
"* 有些列的值是分类数据,如`'intl_plan'`, `'voice_mail_plan'`, `'churned'`这三列,需要把它们转换成数值数据。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 90,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>account_length</th>\n",
|
||
" <th>intl_plan</th>\n",
|
||
" <th>voice_mail_plan</th>\n",
|
||
" <th>number_vmail_messages</th>\n",
|
||
" <th>total_day_minutes</th>\n",
|
||
" <th>total_day_calls</th>\n",
|
||
" <th>total_day_charge</th>\n",
|
||
" <th>total_eve_minutes</th>\n",
|
||
" <th>total_eve_calls</th>\n",
|
||
" <th>total_eve_charge</th>\n",
|
||
" <th>total_night_minutes</th>\n",
|
||
" <th>total_night_calls</th>\n",
|
||
" <th>total_night_charge</th>\n",
|
||
" <th>total_intl_minutes</th>\n",
|
||
" <th>total_intl_calls</th>\n",
|
||
" <th>total_intl_charge</th>\n",
|
||
" <th>number_customer_service_calls</th>\n",
|
||
" <th>churned</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>128</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>25</td>\n",
|
||
" <td>265.1</td>\n",
|
||
" <td>110</td>\n",
|
||
" <td>45.07</td>\n",
|
||
" <td>197.4</td>\n",
|
||
" <td>99</td>\n",
|
||
" <td>16.78</td>\n",
|
||
" <td>244.7</td>\n",
|
||
" <td>91</td>\n",
|
||
" <td>11.01</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>2.70</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>107</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>26</td>\n",
|
||
" <td>161.6</td>\n",
|
||
" <td>123</td>\n",
|
||
" <td>27.47</td>\n",
|
||
" <td>195.5</td>\n",
|
||
" <td>103</td>\n",
|
||
" <td>16.62</td>\n",
|
||
" <td>254.4</td>\n",
|
||
" <td>103</td>\n",
|
||
" <td>11.45</td>\n",
|
||
" <td>13.7</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>3.70</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>137</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>243.4</td>\n",
|
||
" <td>114</td>\n",
|
||
" <td>41.38</td>\n",
|
||
" <td>121.2</td>\n",
|
||
" <td>110</td>\n",
|
||
" <td>10.30</td>\n",
|
||
" <td>162.6</td>\n",
|
||
" <td>104</td>\n",
|
||
" <td>7.32</td>\n",
|
||
" <td>12.2</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>3.29</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>84</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>299.4</td>\n",
|
||
" <td>71</td>\n",
|
||
" <td>50.90</td>\n",
|
||
" <td>61.9</td>\n",
|
||
" <td>88</td>\n",
|
||
" <td>5.26</td>\n",
|
||
" <td>196.9</td>\n",
|
||
" <td>89</td>\n",
|
||
" <td>8.86</td>\n",
|
||
" <td>6.6</td>\n",
|
||
" <td>7</td>\n",
|
||
" <td>1.78</td>\n",
|
||
" <td>2</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>75</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>166.7</td>\n",
|
||
" <td>113</td>\n",
|
||
" <td>28.34</td>\n",
|
||
" <td>148.3</td>\n",
|
||
" <td>122</td>\n",
|
||
" <td>12.61</td>\n",
|
||
" <td>186.9</td>\n",
|
||
" <td>121</td>\n",
|
||
" <td>8.41</td>\n",
|
||
" <td>10.1</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>2.73</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" account_length intl_plan ... number_customer_service_calls churned\n",
|
||
"0 128 0 ... 1 0\n",
|
||
"1 107 0 ... 1 0\n",
|
||
"2 137 0 ... 0 0\n",
|
||
"3 84 1 ... 2 0\n",
|
||
"4 75 1 ... 3 0\n",
|
||
"\n",
|
||
"[5 rows x 18 columns]"
|
||
]
|
||
},
|
||
"execution_count": 90,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.preprocessing import LabelBinarizer\n",
|
||
"\n",
|
||
"lb = LabelBinarizer()\n",
|
||
"\n",
|
||
"for col in ['intl_plan', 'voice_mail_plan', 'churned']:\n",
|
||
" data[col] = lb.fit_transform(data[col])\n",
|
||
"data.head(5)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第三步:\n",
|
||
"* 将除“churned”列之外的所有其他列的数据与“churned”列的数据分开,即创建两张数据表,`X_data`和`y_data`。\n",
|
||
"* 使用课件中提到的某种尺度转换方法(scaling method)来缩放`X_data`。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 91,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 生成X_data和y_data\n",
|
||
"X_data = data.drop('churned', axis=1).values\n",
|
||
"y_data = data['churned'].values"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 92,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# 缩放X_data\n",
|
||
"from sklearn.preprocessing import StandardScaler\n",
|
||
"stdSc=StandardScaler()\n",
|
||
"X_data=stdSc.fit_transform(X_data)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第四步:\n",
|
||
"* 创建一个k=3的K近邻模型,并拟合`X_data`和`y_data`。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<style>#sk-container-id-6 {color: black;background-color: white;}#sk-container-id-6 pre{padding: 0;}#sk-container-id-6 div.sk-toggleable {background-color: white;}#sk-container-id-6 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-6 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-6 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-6 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-6 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-6 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-6 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-6 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-6 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-6 div.sk-item {position: relative;z-index: 1;}#sk-container-id-6 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-6 div.sk-item::before, #sk-container-id-6 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-6 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-6 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-6 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-6 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-6 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-6 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-6 div.sk-label-container {text-align: center;}#sk-container-id-6 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-6 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-6\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=3)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" checked><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=3)</pre></div></div></div></div></div>"
|
||
],
|
||
"text/plain": [
|
||
"KNeighborsClassifier(n_neighbors=3)"
|
||
]
|
||
},
|
||
"execution_count": 93,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# 创建一个3NN模型,并训练\n",
|
||
"from sklearn.neighbors import KNeighborsClassifier\n",
|
||
"knn = KNeighborsClassifier(n_neighbors=3)\n",
|
||
"knn.fit(X_data, y_data)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第五步:\n",
|
||
"* 用上一步训练好的K近邻模型预测相同的数据集,即`X_data`,并评测预测结果的精度。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 94,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" precision recall f1-score support\n",
|
||
"\n",
|
||
" 0 0.94 0.99 0.97 4293\n",
|
||
" 1 0.93 0.62 0.74 707\n",
|
||
"\n",
|
||
" accuracy 0.94 5000\n",
|
||
" macro avg 0.94 0.80 0.85 5000\n",
|
||
"weighted avg 0.94 0.94 0.93 5000\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# 预测并评价\n",
|
||
"from sklearn.metrics import classification_report\n",
|
||
"y_pred = knn.predict(X_data)\n",
|
||
"print(classification_report(y_data, y_pred))\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第六步:\n",
|
||
"* 构建一个同样是`n_neighbors=3`的模型,但是用距离作为聚集K个近邻预测结果的权重。同样计算此模型在X_data上的预测精度。 \n",
|
||
"* 构建另一个K近邻模型:使用均匀分布的权重,但是将闵科夫斯基距离中的指数参数设为1(`p=1`),即使用曼哈顿距离。"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 95,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" precision recall f1-score support\n",
|
||
"\n",
|
||
" 0 1.00 1.00 1.00 4293\n",
|
||
" 1 1.00 1.00 1.00 707\n",
|
||
"\n",
|
||
" accuracy 1.00 5000\n",
|
||
" macro avg 1.00 1.00 1.00 5000\n",
|
||
"weighted avg 1.00 1.00 1.00 5000\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# n_neighbors=3, weights='distance'\n",
|
||
"knn = KNeighborsClassifier(n_neighbors=3, weights='distance')\n",
|
||
"knn.fit(X_data, y_data)\n",
|
||
"y_pred = knn.predict(X_data)\n",
|
||
"print(classification_report(y_data, y_pred))\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 96,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
" precision recall f1-score support\n",
|
||
"\n",
|
||
" 0 0.94 0.99 0.97 4293\n",
|
||
" 1 0.94 0.63 0.75 707\n",
|
||
"\n",
|
||
" accuracy 0.94 5000\n",
|
||
" macro avg 0.94 0.81 0.86 5000\n",
|
||
"weighted avg 0.94 0.94 0.94 5000\n",
|
||
"\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# n_neighbors=3, p=1\n",
|
||
"knn = KNeighborsClassifier(n_neighbors=3, p=1)\n",
|
||
"knn.fit(X_data, y_data)\n",
|
||
"y_pred = knn.predict(X_data)\n",
|
||
"print(classification_report(y_data, y_pred))\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### 第七步:\n",
|
||
"* 将K值从1变化到20,训练20个不同的K近邻模型。权重使用均匀分布的权重(缺省的)。闵科夫斯基距离的指数参数(`p`)可以设为1或者2(只要一致即可)。将每个模型得到的精度和其`k`值存到一个列表或字典中。\n",
|
||
"* 将`accuracy`和`k`的关系绘成图表。当`k=1`时,你观察到了什么? 为什么?"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 97,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"[(1, 1.0), (2, 0.9218), (3, 0.9396), (4, 0.912), (5, 0.928), (6, 0.9094), (7, 0.9194), (8, 0.9052), (9, 0.9144), (10, 0.9024), (11, 0.9112), (12, 0.9002), (13, 0.9086), (14, 0.8984), (15, 0.9032), (16, 0.8944), (17, 0.8998), (18, 0.8934), (19, 0.8996), (20, 0.8928)]\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"scores = []\n",
|
||
"for k in range(1, 21):\n",
|
||
" knn = KNeighborsClassifier(n_neighbors=k)\n",
|
||
" knn.fit(X_data, y_data)\n",
|
||
" y_pred = knn.predict(X_data)\n",
|
||
" scores.append((k, knn.score(X_data, y_data)))\n",
|
||
"print(scores)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[<matplotlib.lines.Line2D at 0x7fc1cc197c40>]"
|
||
]
|
||
},
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAG6CAYAAAAoFxMCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqfElEQVR4nO3deXxM5/4H8M+ZyWQiO1kkiJAQmoo9llI7oQtabdHauqhq+6uWlksX1C3V6r2qvdWWWzvlVlXtsROE2MWWCBIikX2yT5KZ8/tjzFSa/WTW+Lxfr7x+P3POnPPMjTQfz/M930cQRVEEEREREdWIzNIDICIiIrJFDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERSWBn6QHUZVqtFvfu3YOLiwsEQbD0cIiIiKgaRFFETk4OGjVqBJms4vkmhigTunfvHvz8/Cw9DCIiIpLgzp07aNKkSYXHGaJMyMXFBYDum+Dq6mrh0RAREVF1ZGdnw8/Pz/B7vCIMUSakX8JzdXVliCIiIrIxVZXisLCciIiISAKGKCIiIiIJGKKIiIiIJGCIIiIiIpKAIYqIiIhIAoYoIiIiIgkYooiIiIgkYIgiIiIiksAqQ9TatWsxadIkdO7cGUqlEoIgYOXKlTW+jlarxXfffYeQkBDUq1cPXl5eGD16NG7evFnhe/bs2YPevXvDxcUFrq6u6Nu3L/bv31+LT0NERER1kVWGqE8++QQ///wz4uPj4evrK/k6kyZNwnvvvQdRFPHee+9h8ODB+P333xEaGorY2Ngy569duxaDBw/G1atXMWHCBIwfPx6XL1/GwIED8dtvv9XmIxmNRiviRFw6tp5PxIm4dGi0oqWHRERE9EgSRFG0ut/C+/btQ8uWLeHv748vv/wSM2fOxIoVKzBhwoRqX+PgwYPo168fevXqhb1798Le3h4AsGvXLjz11FMYNGgQ9uzZYzg/MzMTAQEBsLOzw7lz5wwbDt69excdOnQAANy8ebPKfXQelp2dDTc3N6hUKqNs+7I7Oglzt11BkqrQ8JqvmwNmPxuMwW2kh00iIiL6S3V/f1vlTNSAAQPg7+9fq2ssW7YMADBv3jxDgAKAIUOGoE+fPggPD0dCQoLh9f/973/IysrC//3f/5XasblJkyZ49913kZaWhi1bttRqTLWxOzoJk9eeLRWgACBZVYjJa89id3SShUZGRET0aLLKEGUMhw4dgpOTE3r06FHmWFhYGADg8OHDpc4HgEGDBlXrfHPSaEXM3XYF5U0Z6l+bu+0Kl/aIiIjMqE6GqLy8PCQlJaF58+aQy+Vljrds2RIAStVF6f9//bGqzi+PWq1GdnZ2qS9jOHUro8wM1MNEAEmqQpy6lWGU+xEREVHV6mSIUqlUAAA3N7dyj+vXN/XnVfWe8s4vz4IFC+Dm5mb48vPzq/ngy5GSU3GAknIeERER1V6dDFGWMnPmTKhUKsPXnTt3jHJdbxcHo55HREREtWdn6QGYgn42qaKZI/0y28OzTg+/x8PDo8rzy6NUKqFUKqUNuhJdmjeAr5sDklWF5dZFCQB83BzQpXkDo9+biIiIylcnZ6KcnJzg6+uLW7duQaPRlDleXv1TZXVPldVLmYNcJmD2s8EAdIHpYfo/z342GHLZ348SERGRqdTJEAUAvXv3Rl5eHo4dO1bmmL4/VK9evUqdDwDh4eEVnq8/xxIGt/HF0jEd4eNWesnOx80BS8d0ZJ8oIiIiM7P5EJWWloZr164hLS2t1OtvvvkmAODTTz9FUVGR4fVdu3bh0KFDGDRoUKleVC+99BLc3Nzw3Xff4e7du4bX7969i++//x6enp547rnnTPxpKje4jS8iZvTDuG66cXcLaICIGf0YoIiIiCzAKmuili9fjoiICADApUuXDK/pezn17NkTb7zxBgDg+++/x9y5czF79mzMmTPHcI2+ffvijTfewPLly9GxY0c8/fTTSEpKwsaNG9GgQQN89913pe5Zv359fP/99xg7diw6duyIkSNHAgA2btyI9PR0bNy4sUbdyk1FLhMQ2rwBVkfGQyuCS3hEREQWYpUhKiIiAqtWrSr12rFjx0otzelDVGV++uknhISE4Oeff8a3334LZ2dnPPfcc/jiiy8QGBhY5vwxY8bA09MT8+fPx4oVKyAIAjp16oRPPvkEAwYMqP0HMxJvF13xemqO2sIjISIienRZ5d55dYWx987Tu5WWh76LDsHJXo7Lnw822nWJiIjIxvfOo8rpZ6LyijTIU5dYeDRERESPJoYoG+SktIOTvW47Gy7pERERWQZDlI3yejAblcIQRUREZBEMUTZKv8UL98sjIiKyDIYoG+Xl+mAmKpszUURERJbAEGWjDG0OchmiiIiILIEhykYZaqI4E0VERGQRDFE2ijVRRERElsUQZaPYtZyIiMiyGKJslLcrWxwQERFZEkOUjdIv52XkFaFYo7XwaIiIiB49DFE2yr2eAnYyAQCQxif0iIiIzI4hykbJZAKf0CMiIrIghigb5s2tX4iIiCyGIcqGebHNARERkcUwRNkw/RN6bHNARERkfgxRNszLmct5RERElsIQZcO8uQkxERGRxTBE2TB9r6hU1kQRERGZHUOUDePTeURERJbDEGXD9H2i0nLV0GpFC4+GiIjo0cIQZcM8HxSWF2tEZBUUW3g0REREjxaGKBtmbydDAyd7AOwVRUREZG4MUTbOm1u/EBERWQRDlI3T10Wx4SYREZF5MUTZOC8+oUdERGQRDFE2zpv75xEREVkEQ5SNY68oIiIiy2CIsnGGTYhZWE5ERGRWDFE2zrD1Sy5DFBERkTkxRNk4Q2F5NmuiiIiIzIkhysbpa6LyijTIU5dYeDRERESPDoYoG+ektIOTvRwAi8uJiIjMiSGqDvB2fdDmgEt6REREZsMQVQd4PdiImMXlRERE5sMQVQd4uXL/PCIiInNjiKoD2HCTiIjI/Bii6gBu/UJERGR+DFF1gH4mKpUzUURERGbDEFUHeDFEERERmR1DVB2g3z+PNVFERETmwxBVB+hrojLyilBUorXwaIiIiB4NDFF1QH1HBRRyAQCQxl5RREREZsEQVQcIgmBouMklPSIiIvNgiKojWFxORERkXgxRdYQXe0URERGZFUNUHeHNrV+IiIjMiiGqjuDWL0REROZltSEqKioKTz31FNzd3eHk5IRu3bph06ZNNbrG1atX8corr8DHxwdKpRL+/v6YMmUKMjIyyj2/pKQEv/zyC7p37w4vLy+4uLggODgY06dPR3JysjE+lsmwJoqIiMi87Cw9gPIcPHgQYWFhcHBwwKhRo+Di4oLNmzdj5MiRuHPnDqZNm1blNSIjIzFgwAAUFBRg2LBhCAwMxPnz57FkyRLs3r0bx48fh4eHR6n3jBw5Er///jtatGiBUaNGQalUIjIyEl9//TXWrl2Ls2fPwsfHx1Qfu1b0vaJSWRNFRERkHqKVKS4uFgMDA0WlUimeO3fO8HpWVpYYFBQk2tvbi7dv367yOm3atBEBiFu3bi31+ldffSUCECdNmlTq9ZMnT4oAxC5duohFRUWljr333nsiAHHu3Lk1+iwqlUoEIKpUqhq9T4rzCZmi/4ztYrf5+0x+LyIiorqsur+/rW4578CBA4iLi8PLL7+M9u3bG153c3PDrFmzUFRUhFWrVlV6jbi4OERHRyM0NBRDhw4tdWzatGnw8PDAmjVrkJeXZ3j95s2bAIABAwZAoVCUes8zzzwDAEhNTa3NRzMpfWF5ao4aWq1o4dEQERHVfVYXog4dOgQAGDRoUJljYWFhAIDDhw9Xeg19/VLz5s3LHJPJZGjatCny8/MRGRlpeP3xxx8HAOzbtw/FxcWl3rN9+3YAQP/+/av5KczP80GzzRKtiMz8IguPhoiIqO6zupqo2NhYAEDLli3LHPPx8YGzs7PhnIp4enoCAG7dulXmmFarRUJCAgAgJibGEIxCQkIwZcoUfPvttwgODsaQIUOgVCpx4sQJnDlzBnPnzsXw4cMrva9arYZa/Vdhd3Z2dqXnG5NCLkMDJ3tk5BUhNVcNjwehioiIiEzD6maiVCoVAN3yXXlcXV0N51QkKCgIAQEBiIqKwo4dO0odW7x4MdLT0wEAWVlZZY4tXrwY8fHx+O6777Bo0SIcO3YMAwcOxPPPP1/l2BcsWAA3NzfDl5+fX5XvMSZDmwP2iiIiIjI5qwtRxiAIAn744QcoFAoMHToUI0aMwPTp0xEWFoZp06YhJCQEgG5pT0+r1eLNN9/EJ598gu+++w5JSUlQqVTYuXMnrl69im7duiEqKqrS+86cORMqlcrwdefOHZN+zr/zYq8oIiIis7G6EKWfgapotik7O7vCWaqHhYWF4ejRoxgyZAgOHDiAJUuWID09HVu2bEHv3r0BAN7e3obzf/nlFyxbtgxffPEFJk2aBB8fH7i6umLIkCH47bffkJeXh1mzZlV6T6VSCVdX11Jf5uTNrV+IiIjMxupqovS1ULGxsejUqVOpY8nJycjNzUWXLl2qda2uXbsaisIftnjxYgBA586dDa/t2rULANC3b98y57dr1w7169fHuXPnqnVfS+HWL0REROZjdTNR+lmi8PDwMsf27NlT6hwp4uPjERERgeDgYMOyHgAUFemeaCuvjYFarUZOTg6USusu1vZ6UEyemssQRUREZGpWF6L69++PgIAArF+/HufPnze8rlKpMH/+fNjb22PcuHGG15OSknDt2rUyy3+5ubkQxdL9klQqFcaOHQuNRoMFCxaUOtajRw8AwPz580s9YQcAc+bMQUlJSbmzVNbE0CuKM1FEREQmZ3XLeXZ2dli+fDnCwsLQq1evUtu+xMfHY9GiRWjWrJnh/JkzZ2LVqlVYsWIFJkyYYHj9jz/+wKxZs9CvXz80atQIKSkp+PPPP5Gamop58+aVacL59ttvY9WqVdi/fz9at26NwYMHo169ejh27BhOnToFLy8vfP7552b6X0Ea1kQRERGZj9WFKEBXlxQREYHZs2dj48aNKC4uRkhICBYuXIiRI0dW6xohISFo164dwsPDkZaWBjc3N3Tr1g1Tp04td0bJ1dUVkZGRWLhwIbZu3YqVK1dCo9GgSZMmeOutt/Dxxx+jSZMmxv6oRuXNp/OIiIjMRhD/vuZFRqN/klClUpnlSb08dQken62rG4ueGwZnpVVmZCIiIqtW3d/fVlcTRdI5Ke3gZC8HoNtDj4iIiEyHIaqO8XZ9UBeVzbooIiIiU2KIqmPYtZyIiMg8GKLqGBaXExERmQdDVB2jn4liTRQREZFpMUTVMewVRUREZB4MUXWMN2eiiIiIzIIhqo7hJsRERETmwRBVx3A5j4iIyDwYouoYfWF5Zn4xikq0Fh4NERFR3cUQVcfUd1RAIRcAAGm5XNIjIiIyFYaoOkYQBHg5s1cUERGRqTFE1UFe3PqFiIjI5Bii6iB2LSciIjI9hqg6iF3LiYiITI8hqg7iTBQREZHpMUTVQfpeUansFUVERGQyDFF1EGeiiIiITI8hqg7S10Rx6xciIiLTYYiqg/T756XlqqHVihYeDRERUd3EEFUHeTorIQhAiVZEZn6RpYdDRERUJzFE1UEKuQwNHO0BsC6KiIjIVBii6igvFpcTERGZFENUHcWGm0RERKbFEFVH6XtFpbBXFBERkUkwRNVR+if02OaAiIjINBii6ihvLucRERGZFENUHcXlPCIiItNiiKqjWFhORERkWgxRdRT3zyMiIjIthqg6Sl9Ynl+kQa66xMKjISIiqnsYouooR3s7OCvtAAAp2ayLIiIiMjaGqDqMXcuJiIhMhyGqDmNxORERkekwRNVhLC4nIiIyHYaoOoy9ooiIiEyHIaoO0z+hl8qtX4iIiIyOIaoO83Lmch4REZGpMETVYYaZKIYoIiIio2OIqsNYE0VERGQ6DFF1mP7pvMz8YhSVaC08GiIiorqFIaoOc3dUQCEXAACpuVzSIyIiMiaGqDpMEIS/isu59QsREZFRMUTVcV6uurooFpcTEREZF0NUHceu5URERKbBEFXHMUQRERGZBkNUHffXJsSsiSIiIjImhqg6Tt8rijVRRERExmW1ISoqKgpPPfUU3N3d4eTkhG7dumHTpk01usbVq1fxyiuvwMfHB0qlEv7+/pgyZQoyMjIqfI9Wq8Uvv/yCnj17wt3dHY6OjggKCsKrr76KnJyc2n4ss+NyHhERkWnYWXoA5Tl48CDCwsLg4OCAUaNGwcXFBZs3b8bIkSNx584dTJs2rcprREZGYsCAASgoKMCwYcMQGBiI8+fPY8mSJdi9ezeOHz8ODw+PUu9Rq9V44YUXsH37drRt2xYTJkyAUqlEQkICdu7ciXnz5sHFxcVUH9sk9Fu/pHATYiIiIuMSrUxxcbEYGBgoKpVK8dy5c4bXs7KyxKCgINHe3l68fft2lddp06aNCEDcunVrqde/+uorEYA4adKkMu95//33RQDil19+WeaYRqMRNRpNjT6LSqUSAYgqlapG7zOmpKwC0X/GdjFw5g5Ro9FabBxERES2orq/v61uOe/AgQOIi4vDyy+/jPbt2xted3Nzw6xZs1BUVIRVq1ZVeo24uDhER0cjNDQUQ4cOLXVs2rRp8PDwwJo1a5CXl2d4PTExEd9//z2efPJJzJgxo8w1ZTIZZDKr+5+rSh7O9hAEoEQrIiO/yNLDISIiqjOsbjnv0KFDAIBBgwaVORYWFgYAOHz4cKXXSE5OBgA0b968zDGZTIamTZvi3LlziIyMRP/+/QEAv/32G0pKSvDiiy8iJycHf/75JxISEtCwYUOEhYWhcePGVY5drVZDrf5r2Sw7O7vK95iaQi5DA0d7pOcVITVHDc8HHcyJiIiodqwuRMXGxgIAWrZsWeaYj48PnJ2dDedUxNPTEwBw69atMse0Wi0SEhIAADExMYYQdebMGQBAVlYWWrVqhaSkJMN77O3t8eWXX+KDDz6o9L4LFizA3LlzKz3HErxclEjPK0JKjhqP+Vp6NERERHWD1a1PqVQqALrlu/K4uroazqlIUFAQAgICEBUVhR07dpQ6tnjxYqSnpwPQBSa9lJQUAMDcuXPRrl07XL58GdnZ2di+fTs8PT0xdepU7Nq1q9L7zpw5EyqVyvB1586dSs83F+8HW79w/zwiIiLjsboQZQyCIOCHH36AQqHA0KFDMWLECEyfPh1hYWGYNm0aQkJCAKBUjZNWqwUAeHt7Y/PmzQgODoaLiwuefvppLF++HADwzTffVHpfpVIJV1fXUl/WgG0OiIiIjE9yiLp3754xx2Ggn4GqaLYpOzu7wlmqh4WFheHo0aMYMmQIDhw4gCVLliA9PR1btmxB7969AegC09/vO2DAADg6Opa5llKpxOnTpyV9Jkv7q2s5QxQREZGxSA5RzZo1w7Bhw7B9+3bDLI4x6Guhyqt7Sk5ORm5ubrn1UuXp2rUrtm/fjszMTBQWFuL06dMYPnw4Ll26BADo3Lmz4dxWrVoBANzd3ctcRyaTwcXFBQUFBTX9OFbBmyGKiIjI6CSHqG7dumHbtm0YNmwYmjZtis8++wy3b9+u9YD0s0Th4eFlju3Zs6fUOVLEx8cjIiICwcHBhmU9AOjXrx8A4MqVK2Xek5qairS0NDRr1kzyfS1Jv/VLCvfPIyIiMhrJIerIkSO4du0apk6dipKSEvzzn/9EixYtMHjwYGzevBklJSWSrtu/f38EBARg/fr1OH/+vOF1lUqF+fPnw97eHuPGjTO8npSUhGvXrpVZ/svNzYUoiqVeU6lUGDt2LDQaDRYsWFDqWO/evfHYY49h//792Lt3r+F1URQxa9YsAMBLL70k6TNZmqFrOWeiiIiIjMcYnT2Li4vF3377TRw8eLAol8tFmUwment7i9OnTxevX79e4+sdOHBAVCgUoouLizhx4kRx6tSpor+/vwhAXLRoUalzx48fLwIQV6xYUer1NWvWiH5+fuL48ePFmTNniq+//rro5eUlAhDnzZtX7n0jIyNFR0dH0c7OTnzppZfEqVOnil26dBEBiB07dhRzc3Nr9DmsoWO5KIrirdRc0X/GdrH1J7tErZZdy4mIiCpT3d/fRt/25c6dO+LcuXNFHx8fUSaTiTKZTOzTp4+4cePGGv0CP3nypDh48GDR1dVVrFevntilSxfx119/LXNeRSHq/Pnz4jPPPCP6+vqKCoVC9PT0FJ955hnxwIEDld43OjpaHDFihOjh4SEqFAoxMDBQnDlzppiTk1PtsetZS4jKUxeL/jO2i/4ztovZBUUWHQsREZG1q+7vb0EU/7bmVQtarRbbtm3D8uXLsWvXLmi1WjRt2hT37t2DRqPB448/js2bN1e7MNzW6Z8kVKlUFm930Gb2HuSqS3BgWm8EeDlbdCxERETWrLq/v43SJ+rmzZuYNWsW/Pz88PzzzyM8PBwjRozA/v37cfv2bSQkJODDDz/EtWvXMHnyZGPckmqIvaKIiIiMS/K2L8XFxdi8eTOWLVuGw4cPQ6vVonnz5pg/fz5effXVUj2YfHx8sHDhQmRnZ2P16tVGGTjVjJeLEjfT8hiiiIiIjERyiGrUqBEyMjIgl8sxbNgwTJo0qdxNgx/m7+9vs72WbJ2+4Sa3fiEiIjIOySHK0dERU6ZMweuvvw5f3+rtavv2229j9OjRUm9JtaDvFZWay5koIiIiY5Acom7fvg1BEGr0HmvaT+5Ro+8VlZrNEEVERGQMkgvLs7OzcfHiReTn55d7PC8vDxcvXkR2drbkwZHxsLCciIjIuCSHqM8//xw9evSARqMp97hGo0GPHj3wxRdfSB4cGQ+3fiEiIjIuySFq9+7dGDhwIFxcXMo97urqirCwMOzcuVPy4Mh4vDgTRUREZFSSQ1RCQkKVTTMDAwORkJAg9RZkRPrlvKz8YqhLyp89JCIiouqTHKIEQYBaXfmshlqtrnC5j8zL3VEBe7nu252WW2Th0RAREdk+ySGqdevW2L17NyraNUar1WLXrl1o1aqV5MGR8QiCwF5RRERERiQ5RI0ePRoxMTF47bXXoFKpSh1TqVR47bXXcOPGDYwZM6bWgyTj8GRdFBERkdFI7hP17rvvYvPmzVi1ahW2bt2K0NBQNG7cGImJiYiKikJWVhZ69eqFd99915jjpVpgmwMiIiLjkTwTpVAosG/fPkydOhUajQZ79+7FypUrsXfvXmi1Wnz00UfYs2cPFAqFMcdLtaAPUakMUURERLUmeSYKABwcHLBo0SIsXLgQ165dg0qlgru7O1q1agW5XG6sMZKRGLZ+Ya8oIiKiWqtViNKTy+V4/PHHjXEpMiH91i8p3PqFiIio1iQv55Ht8XJmTRQREZGx1GomKicnB99//z327duHe/fulds3ShAExMXF1eY2ZCSGmSgu5xEREdWa5BCVmpqKJ554AnFxcXB1dUV2djbc3NxQVFSEgoICAECjRo1YWG5F9DVRablF0GpFyGSChUdERERkuyQv582ZMwdxcXFYvXo1MjMzAQAffPAB8vLycPLkSXTp0gXNmjXD5cuXjTZYqh1PZ3sIAqDRisjIZ9dyIiKi2pAconbu3In+/ftjzJgxEITSMxqhoaHYtWsXbt++jblz59Z6kGQcdnIZPJzsAbC4nIiIqLYkh6ikpCR06NDB8Ge5XG5YxgOA+vXrY8iQIdi0aVPtRkhG5enMuigiIiJjkByi3NzcUFxcbPhz/fr1cffu3VLnuLq64v79+9JHR0bn7arvFcWZKCIiotqQHKICAgJw+/Ztw587dOiAvXv3Ij09HQBQUFCAbdu2oWnTprUeJBkPt34hIiIyDskhatCgQdi/fz/y8/MBAJMmTUJKSgratWuHF198EW3atEFcXBwmTJhgrLGSEXDrFyIiIuOQHKLeeustLFu2zBCinn/+eXz99dfIy8vD5s2bkZycjKlTp+Kjjz4y2mCp9rxcWBNFRERkDIIoiqIxL6jRaJCWlgZvb+8yT+09avS9s1QqFVxdXS09HADAjotJeGf9WXT2r4/fJj9h6eEQERFZner+/pY8E/Xaa6/h3//+d5nX5XI5GjZs+MgHKGul71qemsvlPCIiotqQHKLWr1+PlJQUY46FzMBQWJ6thpEnIYmIiB4pkkNUYGAgkpKSjDkWMgN9TVRBsQa56hILj4aIiMh21Wo5b8eOHUhMTDTmeMjEHO3t4KzUbZnINgdERETSSd6AeMSIETh48CCeeOIJTJ8+HaGhoRXWQrFXlHXxdlEiV12ClGw1Ar2cLT0cIiIimyQ5RAUEBEAQBIiiiPfee6/C8wRBQEkJl42siZeLEjfT8lhcTkREVAuSQ9S4ceP4BJ6N0m/9kpLNXlFERERSSQ5RK1euNOIwyJzYtZyIiKj2JBeWk+3y4v55REREtcYQ9Qjy5tYvREREtVarwvLqEAQBcXFxUm9DJuDtoquJ4nIeERGRdJJDlFarLbewXKVSISsrCwDg6+sLe3t7yYMj09Bv/cLlPCIiIukkh6jbt29Xemzq1Km4f/8+9u7dK/UWZCJezroQlZVfDHWJBko7uYVHREREZHtMUhPVrFkzbNy4EZmZmfj4449NcQuqBXdHBezlum89l/SIiIikMVlhuUKhwMCBA7Fp0yZT3YIkEgSBT+gRERHVkkmfzsvPz0dGRoYpb0ESebFXFBERUa2YLEQdPXoUGzZsQKtWrUx1C6oFb85EERER1YrkwvJ+/fqV+3pJSQkSExMNheefffaZ1FuQCRlmorj1CxERkSSSQ9ShQ4fKfV0QBNSvXx+DBg3C1KlTMXDgQKm3IBPS94riTBQREZE0teoTRbZL3yuKNVFERETSWO22L1FRUXjqqafg7u4OJycndOvWrcZP+l29ehWvvPIKfHx8oFQq4e/vjylTplS72H3y5MkQBAGCICA5OVnKx7BarIkiIiKqHckzUSqVCvHx8WjRogUcHR3LHM/Ly0NcXByaNWsGV1fXGl374MGDCAsLg4ODA0aNGgUXFxds3rwZI0eOxJ07dzBt2rQqrxEZGYkBAwagoKAAw4YNQ2BgIM6fP48lS5Zg9+7dOH78ODw8PCp8/969e/Hjjz/CyckJeXl5NRq/LfhrOY81UURERFJInon6/PPP0aNHD2g0mnKPazQa9OjRA1988UWNrltSUoKJEydCJpPhyJEj+Pnnn/HNN9/gwoULCAoKwqxZsxAfH1/ldSZOnIi8vDxs2bIFv//+O77++mvs3bsXX331FWJiYiptAqpSqfDaa6/hhRdeQOfOnWs0fluhLyxPyy2CRiua7b4arYgTcenYej4RJ+LSzXpvIiIiY5Iconbv3o2BAwfCxcWl3OOurq4ICwvDzp07a3TdAwcOIC4uDi+//DLat29veN3NzQ2zZs1CUVERVq1aVek14uLiEB0djdDQUAwdOrTUsWnTpsHDwwNr1qypcIZpypQpKCgowH/+858ajd2WeDrbQxB0oSYjr8gs99wdnYSeCw9g9LJITPn1PEYvi0TPhQewOzrJLPcnIiIyJskhKiEhAS1btqz0nMDAQCQkJNTouvqn/gYNGlTmWFhYGADg8OHDlV5DX7/UvHnzMsdkMhmaNm2K/Px8REZGljm+bds2rFq1Ct999x28vb1rNHZbYieXwcNJtzm0OYrLd0cnYfLas0hSlV4+TFYVYvLaswxSRERkcySHKEEQoFZX/stXrVZXuNxXkdjYWAAoN6D5+PjA2dnZcE5FPD09AQC3bt0qc0yr1RqCXUxMTKlj6enpmDhxIoYPH47Ro0fXaNyA7vNmZ2eX+rJmXmaqi9JoRczddgXlLdzpX5u77QqX9oiIyKZIDlGtW7fG7t27IYrl/+LTarXYtWtXjTuWq1QqALrlu/K4uroazqlIUFAQAgICEBUVhR07dpQ6tnjxYqSnpwMAsrKySh17++23UVRUhKVLl9ZozHoLFiyAm5ub4cvPz0/SdczFXPvnnbqVUWYG6mEigCRVIU7d4hZBRERkOySHqNGjRyMmJgavvfZamVCjL8y+ceMGxowZU+tB1pQgCPjhhx+gUCgwdOhQjBgxAtOnT0dYWBimTZuGkJAQALqlPb2NGzdi06ZN+Pbbb+Hj4yPpvjNnzoRKpTJ83blzxyifx1S8zbR/XnVnuvikIBER2RLJLQ7effddbN68GatWrcLWrVsRGhqKxo0bIzExEVFRUcjKykKvXr3w7rvv1ui6+hmoimabsrOzUb9+/SqvExYWhqNHj2LevHk4cOAAduzYgTZt2mDLli3Yv38/Ll26ZKh5ysjIwDvvvIOnn34aY8eOrdF4H6ZUKqFUKiW/39wMvaJMvPWLvp2Csc4jIiKyBpJDlEKhwL59+/DJJ59g2bJl2Lt3r+GYq6srPvroI3z++edQKBQ1uq6+Fio2NhadOnUqdSw5ORm5ubno0qVLta7VtWtXbN++vczrixcvBgBD+4KEhASkp6djx44dEASh3Gv5+voCAM6dO1fqqUFbZpiJyjXtTFSX5g3g6+ZQ4ZKeAMDHzQFdmjcw6TiIiIiMSXKIAgAHBwcsWrQICxcuxLVr16BSqeDu7o5WrVpBLpdLumbv3r2xYMEChIeHY9SoUaWO7dmzx3COVPHx8YiIiEBwcLBhWc/DwwOvv/56uefv2LEDycnJePnll1GvXr1KG3TaGm/XB4Xl2aYNUXKZgBmDW+P9jefLHNNH1tnPBkMuKz/AEhERWaNahSg9uVyOxx9/3BiXQv/+/REQEID169fjvffeM8z6qFQqzJ8/H/b29hg3bpzh/KSkJKhUKvj6+pYqRs/NzYWTk1OpmSWVSoWxY8dCo9FgwYIFhtf9/PywfPnycsfTp08fJCcn45tvvpFcK2WtzFVYDgA5hcUAdIHq4afwfNwcMPvZYAxu42vyMRARERmT5MLyK1euYMmSJUhNTS33eEpKCpYsWYKrV6/W6Lp2dnZYvnw5tFotevXqhTfffBPTpk1Du3btEBMTg/nz56NZs2aG82fOnInHHnsMW7ZsKXWdP/74A/7+/pgwYQJmzZqFN954Ay1btjTUSf29Ceej6K/98worfMrSGERRxKoTui7zs55qjf+83NFwbNu7PRmgiIjIJkmeifryyy+xf//+CgvHPTw88PXXX+PcuXNYsWJFja7dt29fREREYPbs2di4cSOKi4sREhKChQsXYuTIkdW6RkhICNq1a4fw8HCkpaXBzc0N3bp1w9SpU9G3b98ajaeu0hdyFxZrkaMugatDzerXqut4XDpupOTCyV6Olzr7wcVBgW/3OyPmfi4ib6XjmbaNTHJfIiIiU5Icoo4ePYr+/fuXahPwMLlcjv79++PIkSOSrt+lSxfs2rWryvNWrlyJlStXlnm9Xbt22LZtm6R7P0zfQb0uqmcvh4vSDjnqEqTmqE0WolYevw0AGNGpCVwe3OPJll6IuZ+LozFpDFFERGSTJC/nJScnV9lMsnHjxkhK4nYe1szLVd/mwDR1UXcy8rH/6n0AwLjuzQyv9wryAgAcjU016VIiERGRqUgOUU5OTkhJSan0nJSUFDg4sPePNfNy/qsuyhTWRsZDKwI9W3iihbez4fUuzRrA3k6Ge6pCxKXmmuTeREREpiQ5RHXs2BF//PFHma1T9DIzM7FlyxZ07Nix3ONkHfRtDkzRtbygSINfo3Rd28c/0azUsXr2cnRppusLdSQmzej3JiIiMjXJIeqdd95Beno6+vbtW6bu6fDhw+jbty8yMzNr3LGczMuUW79sPZ8IVUExmtSvh36tvcscf7KlbqPoo7HlP+FJRERkzSSHqGHDhuGDDz7AhQsX0LdvXzg6OiIgIACOjo7o168fLl68iA8//BDDhw834nDJ2LxN1CtKFEVDQfm47v7lNtLU10VF3syAukRj1PsTERGZmuQQBQDffPMN/vzzT4SFhcHJyQl3796Fs7MzhgwZgh07dmDhwoXGGieZiJeLaWqiTt3KwLXkHDgoZHipc/kPILT2cYGnsxIFxRqcic806v2JiIhMrdYdy5955hk888wzxhgLWYC+V5Sxn85b/aC55nMdGsPd0b7ccwRBQK+Wnvj9XCKOxKThiUBPo46BiIjIlIyy7YtGo0FaWhrU6vJ/ETdt2tQYtyET8HY1/nJekqoAuy8nAyhbUP53TwbpQtTR2FT8Y0hro42BiIjI1GoVos6cOYNZs2bhyJEjKCoqKvccQRBQUlJSm9uQCelrolQFxVCXaKC0k7Zx9MPWRSZAoxXRtXkDtPZxrfTcni10dVGX72UjLVcNzwctF4iIiKyd5Jqo8+fP48knn8SJEycwaNAgiKKItm3bYtCgQfD09IQoiujduzfGjh1rzPGSkbnVU8BervtrYIwn9AqLNdhwKgEAMKGKWShAV5MV7KsLWsdusNUBERHZDskhat68eQCAkydPYuvWrQCA5557Drt27cLt27fx1ltvITo6GrNnzzbOSMkkBEF4qLi89iFqx8UkpOcVwdfNAQODG1brPU8G6WqhDsew1QEREdkOySEqIiICQ4cOxWOPPWZ4Tb99R7169fD999+jUaNGmDVrVu1HSSZlCFG1LC4XRRGrTtwGAIzp5g87efX+evVqqd8CJo1bwBARkc2QHKJUKhUCAgIMf1YoFMjN/Wv7DplMhj59+mD//v21GyGZ3F8NN2vX5uDcnSxcvKuCvZ0Mo0Ir31fxYZ3868NBIUNqjhrX7+fUagxERETmIjlEeXt7IzPzr94+Pj4+iI2NLXVOYWEh8vPzpY+OzEL/hF5ta6JWPWiu+WzbRvCoQYG4g0KObgEeAICj3AKGiIhshOQQFRwcjOvXrxv+3KNHD4SHh+PEiRMAgKtXr2LTpk1o3ZqPrVs7Q6+oWoSolJxC7LyUBKB6BeV/9+SDJb0j3AKGiIhshOQQ9fTTT+PIkSNIStL94pwxYwZEUUTPnj3h5eWFkJAQZGVlsSbKBhijsHzDyTso1ojo2NQdIU3cavz+Xg/20Tt5KwOFxdwChoiIrJ/kEPXWW28hMTERHh66ZZh27dph//79GDx4MDw9PTFgwABs27YNzz33nNEGS6bhXcutX4pKtFh3UtehvKrmmhVp4e0MH1cHFJVocepWhqRrEBERmZPkZpsKhQING5Z+hP2JJ57Ajh07aj0oMq/abv2y+3IyUnLU8HJRYkgbX0nXEAQBvYI8sen0XRyNTTVsTkxERGStarUBMdUN+sLy9LwiaLQ1bzGgLyh/pWtT2NtJ/yv15EOtDoiIiKwdQxTBw8keggBotCIy8srfvqci0YkqnInPhJ1MwMtdardHYo8WnhAE4FpyDu5n167dAhERkakxRBHs5DJ4ONkDqHld1MoHs1BPhfjC29WhVuNo4GSPkMa6onTORhERkbVjiCIAgJeENgfpuWr8eeEeAOkF5X/3V/dytjogIiLrxhBFAB7uWl79EPVr1B0UlWgR0tgNHZu6G2UcTz5odRARmwathPosIiIic2GIIgA1D1ElGi3WRf7V1kAQBKOMo0PT+nCylyM9rwhXkrKNck0iIiJTYIgiAA9vQly9mqh9V+/jnqoQDZzs8UxbaW0NymNvJ0P3QF3vMWvrXq7RijgRl46t5xNxIi5d0pOMRERUd0juE0V1i3cNu5brC8pHd/GDg0Ju1LH0CvLCvqspOBqThrf7tDDqtaXaHZ2EuduuIEn1V8j0dXPA7GeDMVhibywiIrJtnIkiADA8WVedEHUtORuRNzMglwkY083f6GPR94s6HZ+B/KISo1+/pnZHJ2Hy2rOlAhQAJKsKMXntWeyOTrLQyIiIyJIYoghAzWqiVh3X1UKFPd4Qvm71jD6WZh6OaFK/Hoo1Ik7etOwWMBqtiLnbrqC8hTv9a3O3XeHSHhHRI4ghigA8tPVLTiFEseJAoMovxh/nEgEA47o3M8lYBEEwzEYdjrFsXdSpWxllZqAeJgJIUhVyvz8iokcQQxQB+KuwvLBYixx1xUtom07fQUGxBq19XNC1eQOTjafXg1YHlu4XVd3mo1I3byYiItvFEEUAgHr2crgodc8ZVLQRsUYrYnXkbQDGbWtQnidaeEImAHGpeUjMKjDZfaqin6Ez1nlERFR3MESRgZer/gm98mdVDl5LwZ2MArjVU2B4+8YmHYtbPQXa+7kDACIsOBvVpXkD+LpVHJAE6J7S62LCWTkiIrJODFFkUFVx+aoTtwEAI0P9UM/euG0NyqOvizoSY7l99OQyAR+Gtar0nNnPBkMuM92sHBERWSeGKDLQL0mVF6JupOTiaGwaBAEYa4K2BuXpFfRgC5gbaRZ9+i35QWG5XTlB6fNhbdgniojoEcVmm2TgVUnDzTUPZqH6t24IvwaOZhlPuybucHGwg6qgGJcSVYblPXMqKNLgl4hbAICFI0LQyN0RKTmFWH70Ji4lZuOeynL1WkREZFmciSID7wq2fskpLMZvZ+4CACY80cxs47GTy9Aj8MFTehZqdbDp9B2k5xWhSf16GNa+MboHemBY+8Z4t19L3fEHmzATEdGjhyGKDLxdy5+J2nzmLvKKNAj0ckKPFh5mHdOTD5b0LLGPXrFGi5+P3AQATOodCDv5Xz8u/Vt7o6GrEul5Rdh9OdnsYyMiIstjiCKD8mqitFoRq0/oOpSbuq1BeXo9KC4/m5CFnMJis9576/l7SMwqgKezEi92alLqmJ1chlGhTQEA6yLjzTouIiKyDgxRZFBeTdTRG2m4mZYHZ6Udnu/YpKK3moxfA0c093SCRiviRFy62e6r1Yr48XAcAOD1ns3L3WR5VBc/yATg5K0M3EjJMdvYiIjIOjBEkYG+JkpVUIzCYg0AYNXx2wCAFzo1gbPSMs8hPGnoXm6+VgfhV+7jRkouXBzsMKZb03LP8XWrh/6PNQQArDuZYLaxERGRdWCIIgO3egrY2+n+SqTmqBGfnoeD11MAAOO6m6etQXn0/aLMtQWMKIpYeugGAN3ndnFQVHjumAftHjafuYuCIo1ZxkdERNaBIYoMBEGAl/NfS3prTsRDFIHeQV4I8HK22Li6BTSAnUzA7fR8JKTnm/x+x+PSceGuCko7GV7t0bzSc59s4Qm/BvWQXViCbRfvmXxsRERkPRiiqBT9E3oJGXnYdPoOAPO2NSiPi4MCHZvWB2Cep/R+eDALNSrUD54PQmVFZDIBL3fRzUZxSY+I6NHCEEWleDrZAwAW7YlBdmEJ/BvUQ+8gLwuP6q/u5aZe0jt/JwvHbqTDTiZgYq+Aar3nxc5NoJALuHAnC9GJKpOOj4iIrAdDFBnsjk7CsQdPwCVm6TpxZ+QXI/yK5fsg6euijt9IR4nGdM0tfziom4Ua1r4xmtSvXmd2T2clhjzY+oWzUUREjw6GKAKgC1CT155F/t+Ko3MLSzB57Vnsjk6y0Mh02jR2g7ujAjnqEpy/k2WSe8Tez0H4lfsQBGByn+rNQum90lX3BN/W84lm72dFRESWwRBF0GhFzN12BeVt8at/be62KxbdBFguE9Cjhb57uWlaHSx90BdqUHBDtPB2qdF7uzRvgBbezsgv0uCPc4mmGB4REVkZhijCqVsZSFIVVnhcBJCkKsSpWxnmG1Q5epuw1cHdzHz8eV73dN3bfVrU+P2CIBhmo9adTIAoWi5wEhGReVhtiIqKisJTTz0Fd3d3ODk5oVu3bti0aVONrnH16lW88sor8PHxgVKphL+/P6ZMmYKMjLJhIDY2FvPnz0evXr3QqFEj2Nvbw8/PD+PGjcO1a9eM9bGsUkpOxQFKynmm0vNB080Ld7KgyjfuktmyIzdRohXRo4UH2vm5S7rG8x2bwEEhw7XkHJxNyDTq+IiIyPpYZYg6ePAgevTogYiICLz00kt46623kJycjJEjR+Kbb76p1jUiIyMRGhqKX3/9FU888QTee+89BAUFYcmSJejevTvS00tvIfLpp5/i448/RmZmJoYNG4YPPvgAISEhWLNmDTp27IgjR46Y4qNaBf2eecY6z1QauddDC29naEXgWJzxlvTSctX4NUrXzuEdCbNQem71FBjarhEAYF0kC8yJiOo6qwtRJSUlmDhxImQyGY4cOYKff/4Z33zzDS5cuICgoCDMmjUL8fFVb/g6ceJE5OXlYcuWLfj999/x9ddfY+/evfjqq68QExODjz/+uNT5gwcPxtmzZ3Hp0iUsXboUCxcuxM6dO7FhwwYUFBRg8uTJpvrIFteleQP4ujmgoq2FBQC+bg7o0ryBOYdVrr+2gDHekt6KY7egLtGinZ87ugd61Opar3TV9YzafikJmXlFxhgeERFZKasLUQcOHEBcXBxefvlltG/f3vC6m5sbZs2ahaKiIqxatarSa8TFxSE6OhqhoaEYOnRoqWPTpk2Dh4cH1qxZg7y8PMPrEyZMQIcOHcpca9SoUQgKCsKVK1eQlma+vdvMSS4TMPvZYAAoE6T0f579bDDksopilvn0etCz6khMmlHqjrILi7H6uC6Uv90nEIJQu8/Ytokb2jR2RVGJFr+duVvr8RmLfgPnrecTcSIu3aIPCRAR1RVWF6IOHToEABg0aFCZY2FhYQCAw4cPV3qN5GRdX6Pmzctu2SGTydC0aVPk5+cjMjKyWmNSKHR7p9nZWWYDXnMY3MYXS8d0hI9b6SU7HzcHLB3TEYMf9EGytK7NG8BeLkNiVgFupeVV/YYqrI2MR466BC29nTHwwWbCtaErMNfNRq0/lQCtFYSV3dFJ6LnwAEYvi8SUX89j9LJI9Fx4wOJtK4iIbJ3VpYLY2FgAQMuWLcsc8/HxgbOzs+Gcinh66pZ8bt26VeaYVqtFQoKuXiUmJgb9+/ev9FqnTp3C5cuXERoaCnd390rPVavVUKvVhj9nZ2dXer61GdzGFwODfXDqVgZScgrh7aJbwrOGGSg9R3s7dG5WH8fj0nE0Nq1We/oVFmvwS4Tu78hbvQMhM9LnHNquEb7YcRW30vJw4ma6oTWDJej7f/09yiWrCjF57VmrCshERLbG6maiVCrdthlubm7lHnd1dTWcU5GgoCAEBAQgKioKO3bsKHVs8eLFhqLyrKysKscyfvx4yGQyfPXVV1WOfcGCBXBzczN8+fn5VfkeayOXCege6IFh7Ruje6CHVQUoPX338iMxtauL+t/pO0jLLUJj93oY2r6RMYYGAHBS2uH5jo0BAOtOVl2/Zyq20P+LiMiWWV2IMgZBEPDDDz9AoVBg6NChGDFiBKZPn46wsDBMmzYNISEhAHRLexUpKCjAc889h2vXrmHevHno06dPlfedOXMmVCqV4evOnTvG+kj0EP0+eidupqOoRNoWMCUaLX46chMA8GavACjkxv1RePlBz6jwy/eRkm2Z1hC20v+LiMhWWV2I0s9AVTTblJ2dXeEs1cPCwsJw9OhRDBkyBAcOHMCSJUuQnp6OLVu2oHfv3gAAb2/vct9bWFiIYcOG4eDBg5g5cyZmzZpVrbErlUq4urqW+iLje8zHFZ7O9sgv0kjux7Tt4j3czSyAp7M9RoYaf8awtY8rOvvXR4lWxMYoy4RpW+n/RURkq6wuROlrocqre0pOTkZubm659VLl6dq1K7Zv347MzEwUFhbi9OnTGD58OC5dugQA6Ny5c5n3FBQUYOjQodi7dy+mT5+O+fPn1+LTkCnIZAJ6tpDe6kCrFbH0kG6Ll1d7NIeDQm7U8em90k03G7XhVIJFlsxspf8XEZGtsroQpZ8lCg8PL3Nsz549pc6RIj4+HhEREQgODjYs6+kVFBRg2LBh2Lt3Lz788EMsXLhQ8n3ItP6qi6p524n911IQcz8XLko7jO3ub+yhGQxp44v6jgrcUxXi0PUUk92nIl2aN4CXs7LSc6yl/xcRkS2yuhDVv39/BAQEYP369Th//rzhdZVKhfnz58Pe3h7jxo0zvJ6UlIRr166VWf7Lzc0t00dIpVJh7Nix0Gg0WLBgQalj+iW8vXv3YurUqfj666+N/+HIaPRNN6PvqZCeq67i7L+Iooj/HLwBABjT3R+uDgqTjA8AHBRyvNhZt1S4NtL8BebFGi0cFJX/iH/2jHX0/yIiskVW1+LAzs4Oy5cvR1hYGHr16oVRo0bBxcUFmzdvRnx8PBYtWoRmzZoZzp85cyZWrVqFFStWYMKECYbX//jjD8yaNQv9+vVDo0aNkJKSgj///BOpqamYN29emSacb731Fvbu3QsfHx+4uLhgzpw5ZcY2YcKEUvcmy/F2dUBrHxdcS87Bsbh0w3YrVTlxMx3n72RBaSfDaz3K9hEzttFdmuLnIzdxKCYVdzLy4dfA0eT31Ju3/QruZBbAWWkHR3s5UnLKhk0He9MsZRIRPQqsLkQBQN++fREREYHZs2dj48aNKC4uRkhICBYuXIiRI0dW6xohISFo164dwsPDkZaWBjc3N3Tr1g1Tp05F3759y5x/+/ZtALq6q7lz55Z7zT59+jBEWZFeQV64lpyDozGp1Q5R+lqolzr7wcul8qUuY2ju6YSeLTwRcSMNv0Yl4KOw1ia/JwBsPZ+IdScTIAjAD690RI8WnqX6f+27moz/RtzGV7uvo3dLL6P1yCIiepQIojH2zqBy6Z8kVKlUfFLPBI7GpmLsf0+hoasSkTP7V7lly6W7Kjz7fQTkMgGHPuxjtlmhXZeSMHndWXg6K3H8H/1gb2faVfQbKbkY+n0E8os0eK9fC0wd1KrMOZl5Rej11UHkqEvw7aj2GNa+sUnHRERkS6r7+9vqaqKIqiu0WQMo7WS4n61GbEpulef/cEhXCzWsXSOzLqsNCG4Ibxcl0nLV2HvlvknvVVCkwTvrziK/SIPuAR6YMiCo3PPqO9ljUu8AAMA34TGS+20RET3KGKLIZjko5Oga4AGg6u7lN1Jysfuybk/Ft/oEmnxsD1PIZRgVap4C88+2RuP6/Rx4uSjx7ej2lRaNv9azOTydlUjIyMevUQkmHRcRUV3EEEU2rVdLfb+oylsd/HQ4DqIIDAxuiKCGLuYYWikjuzSFTNAVtt+oxqyZFJtO38H/ztyFTACWjOpQZf8nR3s7TOnfAgCwZP8N5KlLTDIuIqK6iiGKbJq+X9TJW+koLNaUe05iVgG2nEsEALxt5lkovcbu9dCvta5D/oZTxp/1uZacjc+2RgMApg1qhe6BHtV636guTeHv4Yi0XLVhM2ZrpNGKOBGXjq3nE3EiLp37/RGRVWCIIpsW1NAZDV2VKCzW4vTt8reAWXbkJkq0IroHeKBD0/pmHuFfXumqa+z525m7FQY+KXLVJXh73VkUFmvRO8gLk3tXPygq5DJMHairm/r5yE1k5BUZbVzGsjs6CT0XHsDoZZGY8ut5jF4WiZ4LD2B3dJKlh0ZEjziGKLJpgiAYZqPK2wImPVdtqPd5u69lZqH0egV5oUn9elAVFGPHReMEAFEUMfP3S7iZmgdfNwf8e2T7GrcreLZtIwT7uiJHXYIfHjQitRa7o5Mwee3ZMhspJ6sKMXntWQYpIrIohiiyefru5UfKqYtaefw2Cou1CGnsZthvz1LkMgGju+j201t70jgF5utOJmDbhXuwkwn4/uUOaOBkX+NryGQCpg/WtUFYHRmPxKwCo4yttjRaEXO3XUF5C3f61+Zuu8KlPSKyGIYosnn6cHQ1KRspOX/NWOQUFmPV8dsAgHf6BlbZR8ocXursBzuZgHMJWbh8T1X1GyoRnajC59uuAABmDG6NTv7S98DrHeSFbgENUFSixeK9MbUal7GcupVRZgbqYSKAJFUhTt3KMN+giIgewhBFNs/DWYk2jXXN0CIemo1afzIB2YUlCPRywqBgH0sNrxQvFyXC2ujGsv6k9ALz7MJivL3uLIo0WgwMbog3nqzdFjaCIGD6YF039c1n7yL2fk6trmcMDwdiY5xHRGRsDFFUJ/xVF6ULUYXFGix/8LTZW70DrWpbkzEPCsz/OJeIXAltBURRxPT/XURCRj6a1K+HRS+0M8osW8em9RH2eENoReDrPddrfb3aqqpFQ03PIyIyNoYoqhN6PRSitFoRm8/eRWqOGo3cHKxuS5NuAQ0Q4OWEvCIN/njQeqEmVhy7jd2Xk2Evl+GHVzrCzVFhtLF9FNYKMgEIv3IfZxPKf9rRXLo0b4D6lXw2AYCvmwO6NJe+jElEVBsMUVQndPR3Rz2FDGm5avxwKA6L9+nqeib2CjD5XnU1JQiCod3BupMJqMn2lWcTMjF/51UAwCfPPIa2TdyNOrYW3i54oVMTAMDCXddqNDZji03JQX5Rxa0gRACznw2utCs7EZEpWddvFyKJDl5Lgf4hrUXh15GaUwRBgKSn1cxhRMfGUNrJcDUpG+fuZFXrPZl5Rfi/9edQohXxdIgvxnbzN8nY3h8QBHs7GU7eysDhKrbTMZWMvCK8seo01CVatGroDB/Xskt2DV2V6PuggSkRkSUwRJHN0/cSUv9tE11RBN7/9bxV9hJyd7THM20bAQDWRVZdYK7Vipi66TwSswrQzMMRX44IMdnTho3c62F8d11AW7j7OrRmbiFQVKLF5LVncDezAP4ejvj1ze449o9+2DCxG74d1R7Lx3WGh5MC97PV+PHQTbOOTQp2WyequxiiyKZV1ktIz1p7CY3ppusZtf3iPWTlV94p/KcjN3Hweirs7WT44ZVOcHEwXh1Ued7u0wIuSjtcTcrGtov3THqvv5u77TJO3sqAs9IOy8d1Rn0ne8hlAroHemBY+8YYENwQs4e2AQD85+ANk+1FaAzstk5UtzFEkU2z5V5C7f3cEezrCnWJFr+duVvheaduZWBRuO5puc+HPo7gRq4mH1t9J3tM6h0AAPgmPAZFf5vlM5U1J25j3ckECALw7aj2aFnBZtHPtvVF7yAvFGm0mLXlktlny6qD3daJ6j6GKLJpttxLSBAEvPJgNmp9BQXmablq/N+Gs9BoRTzfoTFGhvqZbXyv9WwOT2clEjLysTHK+Jsm/93xG2mY86B56PSw1uj/WMMKzxUEAf8c3gb1FHKcupWB/525Y/Lx1QS7rRM9GhiiyKbZei+hYe0bw8lejptpeThxM73UMY1WxPu/nsf9bDVaejvjn8+1MWvXdUd7O0zp3wIA8O3+G8iT0NOquuLT8/D2el1YfK5DY7z1YBasMn4NHA2bJ8/feQ2pOWqTja+mbHmGlIiqjyGKbFqX5g3g6+aAiqKFtfcSclbaYXgHXR+rdX/rYP79gRuIuJGGego5fnilIxzt7cw+vpGhTdG0gSPSctVYceyWSe6RU1iMN1adRlZ+Mdr5uWPB89Uvmn+1RzM83sgVqoJizNt+xSTjk8KWZ0iJqPoYosimyWUCZj8bDABlgpT+z9beS0jfM2r3pSTsjk7C1vOJWHbkJv79oNfVF8+1qbA2yNTs7WSYNkg32/PT4ZvIzKu8AL6m9LNtsSm5aOiqxM9jO8FBIa/2++3kMix4PgQyAfjzwj0cup5i1PFJZeszpERUPQxRZPMGt/HF0jEd4eNW+heSj5sDlo7piMFtfC00suoJbuSK5p6O0IjAW2vPYsqv5/HFg4aaPQI98HzHJhYd37NtGyHY1xU56hL8cOiGUa+9KPw69l9LgdJOhp/HdkbDcvpBVaVtE3dMeEK3d+Anf0Qjv8h0y47V1aV5AzR0UVZ6jjXPkBJR9Zh/fYDIBAa38cXAYB+cupWBlJxCeLvofkFZ8wyU3u7oJNxKyy/32PG4dOyOTrJoEJTJBEwf3AoTVkRh1Yl4TOjRHI3d69X6un+cS8TSQ3EAgK9eaIt2fu6SrzVtUBD2XE7G3cwCfLsvFjOfeqzW46uNEq0WLvUUuF9JndY/hrS2ib+fGq1okz9XRObAmSiqMx7uJdQ90MMm/kOvf4qrMtbwFFfvIC90bd4ARSVafPtgmbE2zt/JwvTNFwEAb/cJrPX+hk5KO3w+7HEAwPKIW7h8T1XrMUoliiL+sfkSbqTkwsFOBk/n0l3z9X8tz8Rbdm/C6mCfK6LKMUQRWZCtPMUlCAJmDGkNAPjtzF3E3s+RfK1kVSHeXH0aRSVaDHjMGx8OamWUMfZ/rCGeDvGFRiti5u+XLBY8F++LxZZzibCTCVg+PhQnZw0wdFvfMLEbVk7oAgBYfSIeRyy0rU51sM8VUdUYoogsyJae4urYtD4GBTeEVoSh+WdNFRZrMGnNaaTkqBHU0BmLR3WAzIgzhrOfDYaLgx0u3lVh1fHbRrtudW0+cxff7o8FAPxzeBv0bOlZZoa0VysvTHiiGQDgo98uQJVfbPZxVoV9roiqhyGKyIJs7Smuj8JaQSYAey7fx9mEmi1HiaKIGZsv4sJdFdwdFVg+LhTOSuOWZXq7OuAfD2bMFoVfR2JWgVGvX5nIm+n4x++6JcrJfQIxqkvTCs+dMbg1AjydcD9bjc/+jDbXEKvNVmZIiSyNIYrIgmytz1XLhi4Y8eBpwYW7rpXbZb0iSw/HYev5e7CTCfjhlY5o6uFokjGODm2Kzv71kV+kweyt0TUao1RxqbmYtOYMijUing7xxUdVLFHWs5fjXyPbQy4TsPX8PWw38/6EVbGlGVIiS2KIIrIgW+xz9f7AINjbyXDyVgYOV7OmZ9+V+/h6j24JcPbQx/FEoKfJxieTCVjwfAgUcgH7rqZgd3Syye4FAOm5ary6IgqqgmJ0bOqOb15qV60lyvZ+7ninTyAAXWuGlGzrCSS2NkNKZCkMUUQWZmt9rhq718O4broGoV/tvl7l5r8x93Mw5ddzEEVgTLemGPvgvabUsqELJvfWBZTZf15GdqFp6o4KizWYuPo0EjLy0bSBI5aN61yjZqH/178l2jR2RVZ+MaZvvmiWWbPq6NK8AVwcKl5qtbYZUiJLYYgisgKD2/giYka/Uk9xRczoZ3UBSu+dvi3gorTDlaRsbKtkKSozrwhvrDqNvCINugU0wOxnHzfbGN/u2wIBnk5IyVHjq93XjH59rVbEtP9dwNmELLg62OGXCaHwcK68webfKeQy/Pul9rC3k+HQ9VRsOGUdGylvv3gPOYUVNy0VYX0zpESWwBBFZCVsqc9VfSd7vNlLt0nwN+ExKCrRljmnWKPF2+vOIiEjH34N6uGHVzpBITfff3IcFHJ88VwIAGBtZALOxBu3CHpR+HXsuJgEhVzAT2M7o4W3s6TrtGzogulhuhqqf+64gvj0PGMOs8aOxqbiw/9dAAD0beVVZoYU0PW68uJSHhFDFBFJ81rP5vB0ViIhIx8boxLKHP982xWcuJkOJ3s5/js+FA2c7Mu5iml1D/TAi510hfAzf79UbtiTYmNUAn540G19wfNt0T3Qo1bXe61Hc3Rt3gD5RRpM23TBYq0DLt1V4a0HBfLPtPXFf8eH4lipGdKueDrEB1oReG/DOatsz0BkTgxRRCSJk9IO7/VvAUDXYPLQ9RRsPZ+IE3HpWH3iNtZExkMQgG9HdUCQhTZQBoBZTz0GDyd7xNzPxc9H4mp9vYjYNHy8RdeW4L3+LfFCp9rvbSiTCfjmpXZwVtrhdHwmfj5ys9bXrKn49Dy8uvIU8oo06NHCw1AgX3qG1BNfjmgLfw9HJGYV4KPfLlhNHReRJTBEEZFko0KbwtPZHul5RZiwIsqwNchnWy8DAD4c1AoDghtadIz1nezx6TO6JyCXHLiBW2nSl8ti7udg8tozKNGKGNa+ET4Y0NJYw0ST+o6GJzX/tfc6riZlG+3aVUnNUWPcL6eQlluEYF9X/DimE5R25RfIuzgo8P3ojlDIBYRfuW+RpqZE1oIhiogkO3DtPtJyiyo8HuDpZMbRVGxY+0Z4sqUnikq0mPX7JUmzJyk5hXh1RRRy1CUIbVYfX73QFoJg3Lq1Fzo1wcDghijWiPhg43moSzRGvX55ctUleHXlKcSn62rXVr4WChcHRaXvCWnihlkPNnmev/MaLt213F6FRJbEEEVEklS1ebIA4PPt1rE1iCAI+GJ4CBwUMpy4mY7NZxNr9P6CIg0mrjqNxKwCNPd0ws9jO1c4U1PbcS54PgQeTva4lpyDxftijX6PhxWVaPHWmjOITsyGh5M9Vr/Wtdq9nyY80QyDghuiSKPFuxvOIsdEbSSIrBlDFBFJYmtbgzT1cMT7A4IA6J6CS89VV+t9Gq2I9zeew4W7KtR3VGDFhFDUN2GRvKezEvOf1z1V+NPhOJy+bZr//bRaER/+7wIibqTB0V6OFa+GonkNZg4FQcDXL7RDY/d6iE/Px0yJM3xEtowhiogkscWtQV7v2RyP+eqaW36x42q13vPlrqvYc/k+7OUy/DyuM5qZYYky7HEfvNCpCbQiMHXTBeSpK+7ZJIUoivhi51X8eUG3Dc/SMZ3Qtol7ja/j5qjAdy93gJ1MwPaLSfg1yjr6XBGZC0MUEUlii1uDKOQyLHg+BIIA/H4uEUdjK9+2Zk1kPJYdvQUA+PrFtghtZr4O3Z89G4zG7vWQkJGPL3ZWL/BV17KjN/HfiL8+V+8gL8nX6ti0Pj560Odqzp+XcS3ZfAXxVdFoRZyISzc8NWoNS8tUtzBEEZEktrZ5sl57P3eM794MAPDxlmgUFJVfvH3wegpmb9W1Mpg2MAjD2jc21xABAK4OCnz9YlsAwPqTCTh4PcUo1/397F3M36nr4D7rqdZ4rkPtWzRMfDIAfVp5QV2ixTvrziK/yLgzZ1Lsjk5Cz4UHMHpZpOGp0Z4LD2B3dJKlh0Z1CEMUEUlii5sn630Y1gq+bg5IyMjHkgNli7ev3MvGu+vOQivqnph7t18LC4wSeCLQE6/1aA4AmPHbRWTmVfwkZHUcup6C6b9dBAC80bM53uwVWOsxAg/6XL3YDg1dlYhLzTO0uLCU3dFJmLz2bJmavWRVISavPcsgRUbDEEVEktna5sl6zko7fD6sDQBg2ZGbiE5UGZZ9dlxMwqsrdE0nuwd4YP5zIUZvZVAT0we3QgtvZ6TkqPHJ1mjJxdsX7mTh7XVnUaIVMbx9I0OLAmPxcFbi21EdIBOA387cxeYzd416/erSPzVa3v9K+tfmbrOOp0bJ9gkiH6cwmezsbLi5uUGlUsHV1dXSwyEyGY1WxKlbGUjJKYS3i24JzxpnoP7urTVnsPtyMhRyAcWa0v8pbOiqRPj7veHmWHnPJHO4dFeF5344hhKtiG9Hta/x0uKttDyMWHocGXlFeLKlJ/47PhT2dqb5N/SS/bH4194YONrL8ee7PSXvKSjVibh0jF4WWeV5GyZ2q/V2PVR3Vff3N2eiiKjWbGnz5If1bqUrqP57gAKA+9lqnLiZZu4hlSukiRv+r5+uO/qnf0QjuZLWEn+XklOIcb+cREZeEUIau2HpmE4mC1AA8E7fFngi0AP5RRq8u/4sCotN3zD0Ybb41CjZLoYoInokabQiluyvuJmlAOta9nm7byDaNXFDdmFJtfesyyksxoRfonAnowD+Ho5Y8WoonJV2Jh2nXCZg8cj28HTWNQydt73ihqym0MCxej28rOmpUbJdDFFE9EiytWahCrkM37zUHko7GY7GpmHtyYRKz1eXaDBpzRlcScqGp7M9Vr/WBZ7OSrOM1dvVAf8e2R6CAKw7mYDtF++Z5b5n4jMwd1vVRe3W+NQo2SaGKCJ6JNnisk8Lb2fMHNIaADB/x9UKN1PWakVM3XQBx+PS4WQvx8pXu8Dfw7z7GD7Z0gtv99E9/Tdz8yXEp0vf+Lkq2YXF+OSPSxix9ARupOYZZtsqWlR+sqWnzSw5k3VjiCKiR5ItNgsFgHHdm6FHCw8UFGswddN5lGi0pY6LoojPt1/BjotJUMgF/DS2M9o0drPIWD8YEITO/vWRoy7Bu+vPmWRD5d3RSRjwzWGsjdTNzL3UuQkiZvTFj+U8NerioAtX/ztzF3uv3Df6WOjRY7UhKioqCk899RTc3d3h5OSEbt26YdOmTTW6xtWrV/HKK6/Ax8cHSqUS/v7+mDJlCjIyKp6e37NnD3r37g0XFxe4urqib9++2L9/f20/DhFZGVttFiqT6fasc3Gww7mELCw9HFeqK/d/Dt3AyuO3AQDfvNQePVt6WmysdnIZlozuAHdHBS4lqrBw13WjXTtJVYA3V5/GW2vPIiVHjWYejlg/sSu+eqEd3B3tMbiNLyJm9MOGid3w7aj22DCxG859OhCju/hBFIH3NpzDpbsqo42HHk1W2eLg4MGDCAsLg4ODA0aNGgUXFxds3rwZ8fHxWLRoEaZNm1blNSIjIzFgwAAUFBRg2LBhCAwMxPnz57Fv3z4EBQXh+PHj8PAo/Xjr2rVrMXbsWHh5eWHkyJEAgI0bNyItLQ2bNm3CCy+8UKPPwRYHRNZN35QRQKm+QvpgZc29rn4/exdTN12o8PinzwTj9Z7NzTiiiu27ch9vrD4NAFg2rjMGBjeUfC2NVsS6k/H4avd15KpLYCcT8FbvQLzbrwUcFPIq31+s0eK1lVE4GpsGbxcl/ninBxq515M8HlOy1dYhdUF1f39bXYgqKSlB69atcffuXURGRqJ9+/YAAJVKhS5duuD27duIiYmBv79/pdcJCQlBdHQ0tm7diqFDhxpe//rrrzF9+nRMmjQJP/74o+H1zMxMBAQEwM7ODufOnUOTJrqtEO7evYsOHToAAG7evAkXF5dqfxaGKCLrtzs6CXO3XSlVZO7r5oDZzwZbbYACgF2XkjB53dkKj/9oZQHwn9uvYHnELbjVU2DnlCfRWEJwuZ6cg3/8fhHnErIAAB2auuPL59uilU/1/7sM6GqoXlx6Atfv56C1jwv+91Z3uDhYvh/Yw2z176WerQdAmw1R4eHhCAsLw6uvvopffvml1LFVq1ZhwoQJmDt3Lj777LMKrxEXF4cWLVogNDQUp06dKnVMq9XC29sbBQUFSElJgZOTrtjy559/xqRJk8q99ty5czFnzhysWrUK48aNq/ZnYYgisg229h98jVZEz4UHKny6UICua3zEjH5W8zmKSrR48cfjuHBXhU7+9fHrm92gkFevoqSwWIPvD9zAj4fjUKIV4ay0w/TBrfBKV3/Jny8xqwDD/3MMqTlq9Arywi/jO8OumuMxNf0M6d9/OdvCDClg+wEQsOFmm4cOHQIADBo0qMyxsLAwAMDhw4crvUZycjIAoHnzslPZMpkMTZs2RX5+PiIj/+pqa4z7qtVqZGdnl/oiIutna81Cba09AwDY28nw/csd4eJghzPxmfjX3phqve9EXDqGfHsU3x+8gRKtiIHBDbF3ai+M696sVt+nxu718N/xnVFPIceRmFR89udlyVvqGJOtb1vzqO1baHUhKjZW1/yuZcuWZY75+PjA2dnZcE5FPD11hZS3bt0qc0yr1SIhQfcUR0zMXz/Eld1X/1pV912wYAHc3NwMX35+fpWeT0QkhS22ZwAAvwaOWDiiLQBg6aE4HI5JhUYrliqM14eDrPwiTP/tAkYvi8SttDx4uyjx45iO+HlsJ/i6GaeGqW0Td3w7StfPav3JBCw/WvZ3hrnZYkDWs/UAKIVpW9dKoFLpnpZwcyv/kVxXV1fDORUJCgpCQEAAoqKisGPHDjz99NOGY4sXL0Z6ejoAICsrq1r31U/lVXXfmTNnYurUqYY/Z2dnM0gRkdHZansGAHgqxBdju/ljTWQ83ll3Fo72cqTkqA3Hfdwc8FQbH/x54R7ScosAAGO6NcX0wa3haoK6pUGP++CTp4Mxb/sVzN91FX4N6ll0yclWAzJQswBYV/YttLoQZQyCIOCHH37As88+i6FDh2L48OEIDAzEhQsXEB4ejpCQEFy6dAkymXEn4pRKJZRK83QEJqJHl749Q7KqsNx/9etroqytPYPex08/hgPXUpCYVYBcdUmpY8mqQvxy7DYAXXPRL58PQedmpv0cr/Vohvj0PKw+EY/3N57Hr2710N7P3aT3rEhqtrrqk2CdAdmWA6BUVrecp58JqmjWR1/sVZWwsDAcPXoUQ4YMwYEDB7BkyRKkp6djy5Yt6N27NwDA29u7WvfV1zZV575ERKYmlwmY/WwwgLJdufV/nv1ssNXWdinkMhRV0XjTRWmHP9/tYfIABej+4f3ZM8Ho28oLhcVavLEqCncy8k1+34cVlWixYNdV/HPn1SrPdaunsMqA7FavejOF1hgApbK6EFVZ/VFycjJyc3PLrVsqT9euXbF9+3ZkZmaisLAQp0+fxvDhw3Hp0iUAQOfOnat138rqpYiILGFwG18sLacrt4+bg9U/vXXqVgZSHyzVVSRHXYILd8zXDNNOrit8D/Z1RVpuEV5bGQVVQbFZ7h2XmosRS4/jp8M3AQA9Aj0goOJta1QFxViw86pV1RbdzczHl7uuVXmeXAA8nKu3SbQtsLoQpZ8lCg8PL3Nsz549pc6RIj4+HhEREQgODkZISIjZ7ktEZGzldeWOmNHPqgMUYL3LPk5KO/wyIRQ+rg6ITcnF2+vOoPhv2+oYkyiK2HAqAc8sicClRBXcHRX4cUxHrJvYrdyA7OvmgGfb6r63yyNuYdKa08j723KoJZy6lYFh3x/DteQcw9Y6FQVAjQi89NMJnInPNN8ATcjq+kSVlJSgVatWSExMrLDZ5vXr19GsWTMAQFJSElQqFXx9fUstt+Xm5sLJyQmC8Ne3UqVS4dlnn8XRo0fLNOHMzMxE8+bNoVAo2GyTiMiETsSlY/SyyCrP2zCxm0UKkC/fU+HFH08gv0iDlzo3wcIRbUv9LjGGzLwi/OP3i9hzWbeH3xOBHvjXS+1LBaeK+pdtu3APH/7vAtQlWjzm64r/ju9ssa7rG04l4LOt0SjWiHi8kSt+HtcZl+5mldsnaurAIKyNjMeFuyo4KGT4z8sd0f8x6d3rTclmm20CNdv2ZcKECVi1ahVWrFiBCRMmGF5fu3YtZs2ahX79+qFRo0ZISUnBn3/+idTUVMybNw+ffPJJmftWtu3Lxo0b8eKLL9boczBEERGVpW8WWlVhvCWbhR68loLXV0VBKwIfhbXCO31bGO3ax26kYeqm87ifrYZCLuDDQa0w8ckAyGrwWc8lZGLi6jNIy1XDy0WJZeM6m7UYvlijxT+3X8GqE/EAgKfb+mLRC+1Qz1639U5FATC/qARvrzuLQ9dTIZcJmP9cG4wMbWq2cVeXzTbbBIC+ffsiIiICPXr0wMaNG7F06VI0bNgQv/76a7X2zQN02760a9cO4eHhWLRoEbZu3YquXbviwIED5QYoABgzZgx27dqF1q1bY8WKFVi5ciWCg4MRHh5e4wBFRETls4XC+L6tvTF36OMAgK/3XMe2C/dqfc2iEi0W7LyKMf89ifvZagR4OWHL2z0wqXdgjQIUAHRoWh9/vPMEWvu4IDVHjZE/ncCOi+ZpZJmZV4Rx/z1lCFAfDgrC96M7GAIUUHEDW0d7Oywb1xkvdGoCjVbEjM2X8N3+WKtodCqFVc5E1RWciSIiqpgtbA8yb/sV/DfiFuztZNgwsSs6+Ut7Ku5GSi6m/HoOl+/pnvZ+uWtTfPL0Y3C0r12noVx1Cd7bcA4HrqUA0AWad/q2MPryo9715By8sToKdzIK4GQvx79Htsegx31qfB1RFLEo/Dr+czAOAPBK16b4fFgbq3mi1KaX8+oKhigiospZ+76FGq2It9aewd4r99HAyR5b3n4C/h5O1X6/KIpYfyoB87ZfQWGxFvUdFfhyRFuESQgelY1x/s6r+G+EruP68x0aY8GIECjt5FW8s2bCLyfjg43nkVekgV+Delg+LrTGmz//3arjtzFn22WIIhD2eEN8O6oDHBTGHbcUDFFWgCGKiMj25ReVYNTPkbh4V4UATyf8/vYTcHes+jH9jLwizNh8EXuv6IrHe7bwxDcvtUNDV9P0SVobGY/Zf16GRisitFl9/DS2Mxo41b6dgCiK+M/BG1gUrtsqrXuAB354pSPqG+HaALDzUhLe//U8ijRahDarj+XjQuHmaPzu9DXBEGUFGKKIiOqGlJxCPPef40jMKkCX5g2w5vUulc70HI1NxbRNF5CSoysenx7WGq/3bF7j2qeaiohNw+R1Z5BTWIKmDRzxy4TOaOEtfbYov6gEH/120VBvNb67Pz55JhgKuXFLqk/EpePNNaeRU1iCoIbOWPlqF4s9cQgwRFkFhigiorrjenIOXlh6HDnqEjzfoTG+eqEtom5nllqKLNFqsWjPdSx7sJlxoJcTlozugMcbmW/HixspuXhtZRQSMvLh4mCHH17piCdbetX4OolZBXhz9WlcvpcNhVzA58PaYHQX0z1Jdy05G+N/OYX72Wr4ujlg1WtdENSwdsuFUjFEWQGGKCKiuuVITCpeXRkFjVaEs9Ku1N5/ns72cLCT425WAQDdxskfPxVc6qk1c8nIK8Jba87g1O0MyGUC5gx9HGO7+Vf7/VG3MzB57Rmk5RbBw8keS8d0MstWM4lZBRj335OIS82Dq4Md/jshFKFm2Prn72y6xQEREZE16hXkhVGhfgBQZvPktNwi3M0qgLNS9xj/P4eHWCRAAUADJ3useaMLRnTUtRL49I9ozN12uVpbxfx6KgEvL4tEWm4RHvN1xdZ3e5htr77G7vXw21tPoGNTd2QXlmDM8pPYcznZLPeWgiGKiIiomjRa0dBOoCJOSjn6tfau9BxzUNrJsejFtvgorBUAYMWx23hjVRRyCnV7Amq0Ik7EpWPr+USciEuHuliDOX9exj9+v4RijYinQnyweXJ3NKnvaNZx13eyx7o3umHAYw2hLtFi8tozWBsZb9YxVBeX80yIy3lERHWLtW9ZU5Gdl5IwddN5FBZr0aqhC8Z198f3B2+U6tFlL5eh6MFegVMHBuH/+pmu31R1lGi0+HRrNDacugMAeK9/S3wwoKVZxlTd39+16/JFRET0CLHWzZOr8lSILxq718Mbq0/j+v0cfPxHdJlz9AFqUq8AvNe/pbmHWIadXIb5z4XA28UB3+6PxZL9sUjJLsQ/h7eBIAhW0V+MIYqIiKiavF2q1+OpuueZUzs/d/w++Qn0XXQIJZXURv154R6mD25tFU1PBUHABwOD4O2qxKd/ROPXqDu4ck+FlBw1krPVhvMs1emeNVFERETV1KV5A/i6OZTZ809PgO4XurkKsWvqbmZBpQEKAJJUhTh1K8NMI6qeV7r6Y+mYTrCTCbiYmF0qQAFAsqoQk9eexe5o8+wfqMcQRUREVE22sHlyZWx1ORIABjzWEG71yu9kro+Fc7ddqdYTiMbCEEVERFQDg9v4YumYjvBxK71k5+PmgKVjOlrN5snlseXlyFO3MpCeV1ThcRHmn0VjTRQREVENDW7ji4HBPlZR3FwT+uXIZFUhypuvEaALg9a4HGmNs2gMUURERBLIZYJVtTGoDv1y5OS1ZyEApYKUtS9HWuMsGpfziIiIHiG2uhxpjUX9nIkiIiJ6xNjicqQ1zqKxY7kJsWM5ERGRce2OTsLcbVdKdVs3dp8odiwnIiKiOseaZtEYooiIiMimWEtRPwvLiYiIiCRgiCIiIiKSgCGKiIiISAKGKCIiIiIJGKKIiIiIJGCIIiIiIpKAIYqIiIhIAoYoIiIiIgkYooiIiIgkYMdyE9JvS5idnW3hkRAREVF16X9vV7W9MEOUCeXk5AAA/Pz8LDwSIiIiqqmcnBy4ublVeFwQq4pZJJlWq8W9e/fg4uICQTD/xohkfNnZ2fDz88OdO3cq3dmbbA+/t3UTv691lym/t6IoIicnB40aNYJMVnHlE2eiTEgmk6FJkyaWHgaZgKurK/+DXEfxe1s38ftad5nqe1vZDJQeC8uJiIiIJGCIIiIiIpKAIYqoBpRKJWbPng2lUmnpoZCR8XtbN/H7WndZw/eWheVEREREEnAmioiIiEgChigiIiIiCRiiiIiIiCRgiCIiIiKSgCGKqArNmjWDIAjlfvXp08fSw6MqrF27FpMmTULnzp2hVCohCAJWrlxZ4fnZ2dmYOnUq/P39oVQq0axZM3z00UfIzc0136CpWmryvZ0zZ06FP8eCIOD27dtmHTtVLDExEYsXL8agQYPQtGlT2Nvbw8fHByNGjMDJkyfLfY+lfm7ZsZyoGtzc3PD++++Xeb1Zs2ZmHwvVzCeffIL4+Hh4enrC19cX8fHxFZ6bl5eH3r174/z58xg0aBBGjx6Nc+fOYdGiRTh8+DCOHDkCBwcHM46eKlOT763e+PHjy/25dXd3N/4ASZLvvvsOCxcuRGBgIAYNGgQvLy/Exsbijz/+wB9//IH169dj5MiRhvMt+nMrElGl/P39RX9/f0sPgyTau3evePv2bVEURXHBggUiAHHFihXlnvvZZ5+JAMQZM2aUen3GjBkiAHH+/PmmHi7VQE2+t7NnzxYBiAcPHjTfAEmSzZs3i4cOHSrz+pEjR0SFQiHWr19fLCwsNLxuyZ9bLucRUZ02YMAA+Pv7V3meKIpYvnw5nJ2d8emnn5Y69umnn8LZ2RnLly831TBJgup+b8m2PP/88+jdu3eZ15988kn07dsXmZmZuHTpEgDL/9xyOY+oGtRqNVauXIl79+7B1dUVoaGh6Nq1q6WHRUYUGxuLe/fuISwsDE5OTqWOOTk5oUePHtizZw/u3LkDPz8/C42SauvIkSM4efIkZDIZWrZsiQEDBsDZ2dnSw6JqUigUAAA7O118sfTPLUMUUTUkJyfj1VdfLfVaaGgoNmzYgMDAQAuNiowpNjYWANCyZctyj7ds2RJ79uxBbGwsQ5QNmz17dqk/u7u749tvv8W4ceMsNCKqroSEBOzbtw++vr4ICQkBYPmfWy7nEVXh1Vdfxf79+3H//n3k5eXh3LlzGDt2LKKiotC/f3/k5ORYeohkBCqVCoDuIYLyuLq6ljqPbEu7du3wyy+/4ObNmygoKMCtW7fw3XffQRAETJgwAX/++aelh0iVKC4uxtixY6FWq7Fw4ULI5XIAlv+55UwUURX+/i/X9u3bY/Xq1QCANWvWYNmyZZg6daolhkZE1fTcc8+V+nOzZs3w7rvv4rHHHsPAgQPxySefYOjQoRYaHVVGq9ViwoQJOHLkCCZOnIixY8daekgGnIkikmjSpEkAgGPHjll4JGQM+n/JVvQv1uzs7FLnUd3Qv39/BAYG4tKlS4bvMVkPrVaL1157DevXr8eYMWPw448/ljpu6Z9bhigiiTw9PQHoepSQ7dPXVOhrLP6uqtoLsl36n+X8/HwLj4QeptVq8eqrr2LVqlUYPXo0Vq5cCZmsdGyx9M8tQxSRRPrOuWy4WTe0bNkSjRo1wrFjx8oE47y8PBw7dgzNmzdnUXkdk5eXh8uXL8PJyckQpsjy9AFq9erVGDlyJNasWWOog3qYpX9uGaKIKnHt2rVy/3V67do1zJgxAwDw8ssvm3tYZAKCIOCNN95Abm4u5s2bV+rYvHnzkJubi4kTJ1podFQbOTk5iImJKfN6QUEBJk6ciJycHLz00kuGx+bJsvRLeKtXr8aLL76ItWvXlhugAMv/3AqiKIomuzqRjZszZw7+9a9/oVevXvD394eTkxNiYmKwc+dOFBcXY+bMmZg/f76lh0mVWL58OSIiIgAAly5dwtmzZ9GjRw+0aNECANCzZ0+88cYbAHT/cu3RowcuXLiAQYMGoWPHjjh79izCw8MRGhqKw4cPo169ehb7LFRadb+3t2/fRkBAAEJDQ/HYY4/Bx8cH9+/fx759+3D37l2EhITg4MGD8PDwsOTHoQfmzJmDuXPnwtnZGVOmTCk33A4fPhzt27cHYOGfW5P1QieqAw4dOiS+9NJLYsuWLUVXV1fRzs5O9PHxEYcNGybu2bPH0sOjahg/frwIoMKv8ePHlzo/KytLfP/990U/Pz9RoVCITZs2FadNmyZmZ2db5gNQhar7vVWpVOI777wjhoaGil5eXqKdnZ3o4uIidunSRfzqq6/E/Px8y34QKqWq7yvK2d7HUj+3nIkiIiIikoA1UUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEERFV06FDhyAIAubMmWPpoRCRFWCIIiIiIpKAIYqIiIhIAoYoIiIiIgkYooiIakmlUqF3796QyWT47rvvLD0cIjITO0sPgIjIliUlJWHw4MG4du0aNmzYgJEjR1p6SERkJgxRREQSxcTEICwsDOnp6dixYwcGDBhg6SERkRkxRBERSRAVFYWnn34aAHDw4EF06tTJwiMiInNjTRQRUQ0dPXoU/fr1g7OzM44dO8YARfSIYogiIqqhc+fOITc3Fx06dEBAQIClh0NEFsIQRURUQ++++y5ef/11/P7773j55ZdRUlJi6SERkQWwJoqIqIZkMhmWLVtm+L8AsG7dOtjZ8T+pRI8S/sQTEUkgCAJ++uknyGQy/PTTT9BqtdiwYQODFNEjhD/tREQSCYKApUuXQiaTYenSpRBFEb/++iuDFNEjgjVRRES1IAgC/vOf/+Cdd97B5s2bMXLkSBQXF1t6WERkBoIoiqKlB0FERERkazgTRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERSfD/dZAp83fT1SsAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"%matplotlib inline\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"plt.rcParams['font.size'] = 14\n",
|
||
"plt.xlabel('k')\n",
|
||
"plt.ylabel('accuracy')\n",
|
||
"plt.plot([k for k, v in scores], [v for k, v in scores], 'o-')"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "Python 3 (ipykernel)",
|
||
"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.10.8"
|
||
},
|
||
"vscode": {
|
||
"interpreter": {
|
||
"hash": "1f0d395e06aa83586067b19165efc9b683889967164248deef4bbf1fa27cfb00"
|
||
}
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|