This repository has been archived on 2024-01-06. You can view files and clone it, but cannot push or open issues or pull requests.
justhomework/AIandML/e2_matchine_learning/e2.0_k-means.ipynb

939 lines
108 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# K-means实验"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"用pandas读取啤酒数据集`e2.0_beer.txt`。"
]
},
{
"cell_type": "code",
"execution_count": 29,
"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>name</th>\n",
" <th>calories</th>\n",
" <th>sodium</th>\n",
" <th>alcohol</th>\n",
" <th>cost</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Budweiser</td>\n",
" <td>144</td>\n",
" <td>15</td>\n",
" <td>4.7</td>\n",
" <td>0.43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Schlitz</td>\n",
" <td>151</td>\n",
" <td>19</td>\n",
" <td>4.9</td>\n",
" <td>0.43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Lowenbrau</td>\n",
" <td>157</td>\n",
" <td>15</td>\n",
" <td>0.9</td>\n",
" <td>0.48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kronenbourg</td>\n",
" <td>170</td>\n",
" <td>7</td>\n",
" <td>5.2</td>\n",
" <td>0.73</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Heineken</td>\n",
" <td>152</td>\n",
" <td>11</td>\n",
" <td>5.0</td>\n",
" <td>0.77</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Old_Milwaukee</td>\n",
" <td>145</td>\n",
" <td>23</td>\n",
" <td>4.6</td>\n",
" <td>0.28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Augsberger</td>\n",
" <td>175</td>\n",
" <td>24</td>\n",
" <td>5.5</td>\n",
" <td>0.40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Srohs_Bohemian_Style</td>\n",
" <td>149</td>\n",
" <td>27</td>\n",
" <td>4.7</td>\n",
" <td>0.42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Miller_Lite</td>\n",
" <td>99</td>\n",
" <td>10</td>\n",
" <td>4.3</td>\n",
" <td>0.43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Budweiser_Light</td>\n",
" <td>113</td>\n",
" <td>8</td>\n",
" <td>3.7</td>\n",
" <td>0.40</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Coors</td>\n",
" <td>140</td>\n",
" <td>18</td>\n",
" <td>4.6</td>\n",
" <td>0.44</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Coors_Light</td>\n",
" <td>102</td>\n",
" <td>15</td>\n",
" <td>4.1</td>\n",
" <td>0.46</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Michelob_Light</td>\n",
" <td>135</td>\n",
" <td>11</td>\n",
" <td>4.2</td>\n",
" <td>0.50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Becks</td>\n",
" <td>150</td>\n",
" <td>19</td>\n",
" <td>4.7</td>\n",
" <td>0.76</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Kirin</td>\n",
" <td>149</td>\n",
" <td>6</td>\n",
" <td>5.0</td>\n",
" <td>0.79</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Pabst_Extra_Light</td>\n",
" <td>68</td>\n",
" <td>15</td>\n",
" <td>2.3</td>\n",
" <td>0.38</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Hamms</td>\n",
" <td>139</td>\n",
" <td>19</td>\n",
" <td>4.4</td>\n",
" <td>0.43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Heilemans_Old_Style</td>\n",
" <td>144</td>\n",
" <td>24</td>\n",
" <td>4.9</td>\n",
" <td>0.43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Olympia_Goled_Light</td>\n",
" <td>72</td>\n",
" <td>6</td>\n",
" <td>2.9</td>\n",
" <td>0.46</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Schlitz_Light</td>\n",
" <td>97</td>\n",
" <td>7</td>\n",
" <td>4.2</td>\n",
" <td>0.47</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name calories sodium alcohol cost\n",
"0 Budweiser 144 15 4.7 0.43\n",
"1 Schlitz 151 19 4.9 0.43\n",
"2 Lowenbrau 157 15 0.9 0.48\n",
"3 Kronenbourg 170 7 5.2 0.73\n",
"4 Heineken 152 11 5.0 0.77\n",
"5 Old_Milwaukee 145 23 4.6 0.28\n",
"6 Augsberger 175 24 5.5 0.40\n",
"7 Srohs_Bohemian_Style 149 27 4.7 0.42\n",
"8 Miller_Lite 99 10 4.3 0.43\n",
"9 Budweiser_Light 113 8 3.7 0.40\n",
"10 Coors 140 18 4.6 0.44\n",
"11 Coors_Light 102 15 4.1 0.46\n",
"12 Michelob_Light 135 11 4.2 0.50\n",
"13 Becks 150 19 4.7 0.76\n",
"14 Kirin 149 6 5.0 0.79\n",
"15 Pabst_Extra_Light 68 15 2.3 0.38\n",
"16 Hamms 139 19 4.4 0.43\n",
"17 Heilemans_Old_Style 144 24 4.9 0.43\n",
"18 Olympia_Goled_Light 72 6 2.9 0.46\n",
"19 Schlitz_Light 97 7 4.2 0.47"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# beer dataset\n",
"import pandas as pd\n",
"url = 'e2.0_beer.txt'\n",
"beer = pd.read_csv(url, sep=' ')\n",
"beer"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"去掉`name`项,保留`calories`、`sodium`、`alcohol`和`cost`数据,作为特征`X`。"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"# define X\n",
"X = beer.drop('name', axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"建立K-means聚类器使类别数为3并进行数据拟合。"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<style>#sk-container-id-3 {color: black;background-color: white;}#sk-container-id-3 pre{padding: 0;}#sk-container-id-3 div.sk-toggleable {background-color: white;}#sk-container-id-3 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-3 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-3 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-3 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-3 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 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-3 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-3 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-3 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 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-3 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-3 div.sk-item {position: relative;z-index: 1;}#sk-container-id-3 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-3 div.sk-item::before, #sk-container-id-3 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-3 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-3 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-3 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-3 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-3 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-3 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-3 div.sk-label-container {text-align: center;}#sk-container-id-3 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-3 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=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-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KMeans</label><div class=\"sk-toggleable__content\"><pre>KMeans(n_clusters=3)</pre></div></div></div></div></div>"
],
"text/plain": [
"KMeans(n_clusters=3)"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# K-means with 3 clusters\n",
"# 注意使K-means聚类器的对象名称为 km\n",
"from sklearn.cluster import KMeans\n",
"km = KMeans(n_clusters=3)\n",
"km.fit(X)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"将聚类结果传递给pandas数据框并按类别排序查看各个啤酒参与聚类的结果。"
]
},
{
"cell_type": "code",
"execution_count": 32,
"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>name</th>\n",
" <th>calories</th>\n",
" <th>sodium</th>\n",
" <th>alcohol</th>\n",
" <th>cost</th>\n",
" <th>cluster</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Budweiser_Light</td>\n",
" <td>113</td>\n",
" <td>8</td>\n",
" <td>3.7</td>\n",
" <td>0.40</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Coors_Light</td>\n",
" <td>102</td>\n",
" <td>15</td>\n",
" <td>4.1</td>\n",
" <td>0.46</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Miller_Lite</td>\n",
" <td>99</td>\n",
" <td>10</td>\n",
" <td>4.3</td>\n",
" <td>0.43</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Schlitz_Light</td>\n",
" <td>97</td>\n",
" <td>7</td>\n",
" <td>4.2</td>\n",
" <td>0.47</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Heineken</td>\n",
" <td>152</td>\n",
" <td>11</td>\n",
" <td>5.0</td>\n",
" <td>0.77</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Old_Milwaukee</td>\n",
" <td>145</td>\n",
" <td>23</td>\n",
" <td>4.6</td>\n",
" <td>0.28</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Augsberger</td>\n",
" <td>175</td>\n",
" <td>24</td>\n",
" <td>5.5</td>\n",
" <td>0.40</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Srohs_Bohemian_Style</td>\n",
" <td>149</td>\n",
" <td>27</td>\n",
" <td>4.7</td>\n",
" <td>0.42</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Lowenbrau</td>\n",
" <td>157</td>\n",
" <td>15</td>\n",
" <td>0.9</td>\n",
" <td>0.48</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Coors</td>\n",
" <td>140</td>\n",
" <td>18</td>\n",
" <td>4.6</td>\n",
" <td>0.44</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Schlitz</td>\n",
" <td>151</td>\n",
" <td>19</td>\n",
" <td>4.9</td>\n",
" <td>0.43</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Michelob_Light</td>\n",
" <td>135</td>\n",
" <td>11</td>\n",
" <td>4.2</td>\n",
" <td>0.50</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Becks</td>\n",
" <td>150</td>\n",
" <td>19</td>\n",
" <td>4.7</td>\n",
" <td>0.76</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Kirin</td>\n",
" <td>149</td>\n",
" <td>6</td>\n",
" <td>5.0</td>\n",
" <td>0.79</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>Hamms</td>\n",
" <td>139</td>\n",
" <td>19</td>\n",
" <td>4.4</td>\n",
" <td>0.43</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>Heilemans_Old_Style</td>\n",
" <td>144</td>\n",
" <td>24</td>\n",
" <td>4.9</td>\n",
" <td>0.43</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Kronenbourg</td>\n",
" <td>170</td>\n",
" <td>7</td>\n",
" <td>5.2</td>\n",
" <td>0.73</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Budweiser</td>\n",
" <td>144</td>\n",
" <td>15</td>\n",
" <td>4.7</td>\n",
" <td>0.43</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Olympia_Goled_Light</td>\n",
" <td>72</td>\n",
" <td>6</td>\n",
" <td>2.9</td>\n",
" <td>0.46</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Pabst_Extra_Light</td>\n",
" <td>68</td>\n",
" <td>15</td>\n",
" <td>2.3</td>\n",
" <td>0.38</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" name calories sodium alcohol cost cluster\n",
"9 Budweiser_Light 113 8 3.7 0.40 0\n",
"11 Coors_Light 102 15 4.1 0.46 0\n",
"8 Miller_Lite 99 10 4.3 0.43 0\n",
"19 Schlitz_Light 97 7 4.2 0.47 0\n",
"4 Heineken 152 11 5.0 0.77 1\n",
"5 Old_Milwaukee 145 23 4.6 0.28 1\n",
"6 Augsberger 175 24 5.5 0.40 1\n",
"7 Srohs_Bohemian_Style 149 27 4.7 0.42 1\n",
"2 Lowenbrau 157 15 0.9 0.48 1\n",
"10 Coors 140 18 4.6 0.44 1\n",
"1 Schlitz 151 19 4.9 0.43 1\n",
"12 Michelob_Light 135 11 4.2 0.50 1\n",
"13 Becks 150 19 4.7 0.76 1\n",
"14 Kirin 149 6 5.0 0.79 1\n",
"16 Hamms 139 19 4.4 0.43 1\n",
"17 Heilemans_Old_Style 144 24 4.9 0.43 1\n",
"3 Kronenbourg 170 7 5.2 0.73 1\n",
"0 Budweiser 144 15 4.7 0.43 1\n",
"18 Olympia_Goled_Light 72 6 2.9 0.46 2\n",
"15 Pabst_Extra_Light 68 15 2.3 0.38 2"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# save the cluster labels and sort by cluster\n",
"beer['cluster'] = km.labels_\n",
"beer.sort_values(by='cluster')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"查看聚类结果中各个簇的中心点坐标"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[102.75 , 10. , 4.075 , 0.44 ],\n",
" [150. , 17. , 4.52142857, 0.52071429],\n",
" [ 70. , 10.5 , 2.6 , 0.42 ]])"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# review the cluster centers\n",
"km.cluster_centers_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"用pandas查看各类别样本的坐标均值并回答是否和先前计算相同\n",
"\n",
"答:"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_50398/58857758.py:2: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.\n",
" beer.groupby('cluster').mean()\n"
]
},
{
"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>calories</th>\n",
" <th>sodium</th>\n",
" <th>alcohol</th>\n",
" <th>cost</th>\n",
" </tr>\n",
" <tr>\n",
" <th>cluster</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>102.75</td>\n",
" <td>10.0</td>\n",
" <td>4.075000</td>\n",
" <td>0.440000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>150.00</td>\n",
" <td>17.0</td>\n",
" <td>4.521429</td>\n",
" <td>0.520714</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>70.00</td>\n",
" <td>10.5</td>\n",
" <td>2.600000</td>\n",
" <td>0.420000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" calories sodium alcohol cost\n",
"cluster \n",
"0 102.75 10.0 4.075000 0.440000\n",
"1 150.00 17.0 4.521429 0.520714\n",
"2 70.00 10.5 2.600000 0.420000"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# calculate the mean of each feature for each cluster\n",
"beer.groupby('cluster').mean()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_50398/1501469021.py:2: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.\n",
" centers = beer.groupby('cluster').mean()\n"
]
}
],
"source": [
"# save the DataFrame of cluster centers\n",
"centers = beer.groupby('cluster').mean()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"聚类结果可视化\n",
"\n",
"> **要求** 请运行、阅读和理解以下程序,并通过添加`注释`或者`markdown cell`,以说明每段代码的功能。"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# allow plots to appear in the notebook\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"# set the font size\n",
"plt.rcParams['font.size'] = 14\n"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"# create a \"colors\" array for plotting\n",
"import numpy as np\n",
"colors = np.array(['red', 'green', 'blue', 'yellow'])"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'alcohol')"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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SeaNN94osc3IkSPL7Otw4W1/7tixw9SoUcP86U9/MitXriwzDNm9P42puE/Hjh1rJJnly5d7tT+792lF/dmqVStjWVaxvxwWuvLKK40k88svvxQtq4r+ZMxQGGvRooWioqK0bt06ZWZmFlv3ySefSJL69u0rqeB6bVpamrp166bY2NhibWNjY9WtWzf99NNP2r9/f2CKryZ86bdVq1YVrfu1a665RpK0evXqqi28GoqMjJQkOZ3Fny+9atUqSVL//v1LbEN/FsjPz9eIESPUokUL/fGPfyy3Lf1ZPmOMFixYoDp16qhPnz769ttvNX36dE2dOlXLli2Tx+MpsQ19Wr42bdrIGKMlS5YUW75v3z5t3bpV7dq1U506dYqWV0V/hv1T6+2sTp06+stf/qLx48fr4osv1g033CC3263vv/9eK1as0H333acHHnhAUsGXulQQoErTokULff7559q9e7cSExMD9hlCXWX77dSpUzp48KDatGmjiIiIUtufu1/8x6xZsySV/ANw9+7diouLU4MGDUpsQ38WmDJlijZv3qyvv/5aUVFR5balP8uXkpKiY8eOqVOnTho7dqxmzJhRbH2HDh300UcfqUmTJkXL6NPyPfPMM1q3bp1uvvlmDRo0SC1bttSRI0e0cOFCNW/eXO+++26x9lXRn4ShMPfQQw+pcePGuuuuu/TKK68ULe/evbtuu+22or9lZ2RkSJLi4+NL3Y/b7S7WDgUq22/0s29mzJihJUuWqE+fPhowYECxdRkZGapXr16p29Gf0vfff6+nnnpKjzzyiDp27Fhhe/qzfEeOHJEkbdmyRTt37tTrr7+uG264QRkZGXr22Wf12muv6eabb9bXX39dtA19Wr6LL75YX3/9tW655RYtXLiwaHmdOnU0atQoNW/evFj7quhPLpOFuaeeekrDhg3TY489pv379+vkyZP68ssvlZ2drV69epV72yIQCj755BM98MADSkpK0ty5c4NdTrVy9uxZjRgxQhdddJEmTZoU7HLCQuFlsPz8fD399NMaOXKkLrjgAiUnJ2vGjBm6/PLLtWHDBq1duzbIlVYf33zzjbp27aoLLrhA3377rU6dOqV//etfuuOOO/Tf//3fuvXWW6u8BsJQGFu2bJkmTZqkBx54QH/4wx/UpEkTxcXFqXv37vr4448VGRmp8ePHS/rPmYqy0nTh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z+vBBx9U69atNXjwYCUlJenQoUNas2aNBg4cqOeff1733Xdf0cSE119/vTIzM7VkyRIlJSUV3XFWkebNm+u5557T+PHj1bZtWw0dOlSxsbH6+OOP9eOPP+qGG27QsGHDzvszjR07Vl9//bXeeOMNrVu3TldffbUaNWqkw4cPa+fOndqwYYPmzZun5ORkHThwQB06dFC7du3Utm1bNW7cWEePHtWHH36o3NxcPfzww+ddD4DAIwwBqJQHHnhAbdq00bRp07RkyRJlZWWpXr16uvzyyzV06FBJ0pQpU1S7dm3Nnj1bL730kurXr69bb71VTzzxhNq0aeP1scaNG6eLLrpI06dP19y5c3X27Fm1bNlS06ZN04MPPlip8UFlsSxLs2fP1oABA/Taa6/pk08+KfpMLVq00NSpU3X11VdLKpjB+oknntCKFSu0bNkyHT16VHXr1tVll12m//7v/9a111573vUACDzLGGOCXQQAAECwMGYIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADYGmEIAADY2v8Hv+qxEqtkCZUAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# scatter plot of calories versus alcohol, colored by cluster (0=red, 1=green, 2=blue)\n",
"plt.scatter(beer.calories, beer.alcohol, c=colors[beer.cluster], s=50)\n",
"\n",
"# cluster centers, marked by \"+\"\n",
"plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')\n",
"\n",
"# add labels\n",
"plt.xlabel('calories')\n",
"plt.ylabel('alcohol')"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.19454664171120434"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# calculate SC for K=3\n",
"from sklearn import metrics\n",
"from sklearn.preprocessing import StandardScaler\n",
"scaler = StandardScaler()\n",
"scaler.fit(X)\n",
"X_scaled=scaler.transform(X)\n",
"metrics.silhouette_score(X_scaled, km.labels_)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"# calculate SC for K=2 through K=19\n",
"k_range = range(2, 20)\n",
"scores = []\n",
"for k in k_range:\n",
" km = KMeans(n_clusters=k, random_state=1)\n",
" km.fit(X_scaled)\n",
" scores.append(metrics.silhouette_score(X_scaled, km.labels_))"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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fCqVqvJ26b25iPQFxxQRNUOjR49Gv379EB0dXeP+F154ASEhIXj66aexe/du2Nvb48CBA8jOzka3bt3u+8SYLvXu3RvdunXDpEmTYGpqiq1bt+LixYsYN25clTlqOnfujG+//RbPPfcc2rdvj5EjR6Jdu3bIy8vD5cuXERUVhRkzZuC7775rUB6ZTIbQ0FAMHz4cI0eOxGOPPQZ3d3fExMQgMjIS7dq1w6efftrQj40PPvgAsbGx+OmnnxAbG4uHHnoIhoaGuHz5Mnbs2IHo6Ohax/n07t0bgYGB2LdvH/r06YMBAwYgOTkZW7ZswSOPPILNmzdXOX7evHlITU1Fv3794OHhAUEQEB0djSNHjqB3797o169f5bGDBg3Cpk2bMHbsWDz44IOQy+UYPXo0unbtihEjRuC9997Dhx9+CG9vb4wYMQLu7u7IzMxEQkICDhw4gI8++ggdO3bUqB/Gjh0LCwsL9O7dG+7u7lCpVNi9ezfOnTuHCRMmwN3dXav+JWpUTT8LABFp4r/zFP3XwYMHK+fr+e88RaIoivv27RN79eolGhoaira2tuLUqVPF9PT0es+NUzHvUFJSUrV9NbVVcXxiYqL46aefit7e3qKBgYHo7u4uLlq0SCwuLq7x8xw5ckScPHmy2KZNG1GpVIp2dnZijx49xLfffls8f/585XEV8xQtXLiwxnbqcvr0aXHChAminZ2dqFQqRXd3d/Gll14Sb926Ve1YbeYpEkVRLCoqEpcuXSp2795dNDY2Fs3MzMROnTqJr732mnj79u3K42rqP1Esn8dn2rRpoo2NjWhsbCz27t1b3LlzZ43zFG3YsEGcOHGi2K5dO9HExES0tLQUu3XrJn722WdV5kQSRVG8ceOGOHHiRNHOzk6UyWTV2hJFUdy9e7f4yCOPiPb29qJSqRSdnJzEPn36iB9++KF49erVyuNqynKvb7/9Vhw9erTo7u4uGhkZiba2tmJAQIC4cuVKsaSkpF79SdRUBFHkYkpEREREHFNEREREBBZFRERERABYFBEREREBYFFEREREBIBFEREREREAFkVEREREAFgUEREREQFgUUREREQEgEUREREREQAWRUREREQAWBQRERERAWBRRERERAQA+H+4DuxwiRKNtwAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot the results\n",
"plt.plot(k_range, scores)\n",
"plt.xlabel('Number of clusters')\n",
"plt.ylabel('Silhouette Coefficient')\n",
"plt.grid(True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# PCA实验"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"请使用PCA算法将前文中的啤酒数据`X`降维到2维空间并绘制出降维之后的数据点并且计算降维导致的重建误差。\n",
"\n",
"参见:[PCA算法文档](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html)\n",
"\n",
"> 提示着重看文档中的示例Examples"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-11.41071341 -18.7563276 -24.2856944 -36.55439065 -19.00636267\n",
" -13.15190363 -43.12530515 -17.5095788 33.85968231 20.12053057\n",
" -7.70749236 30.40940729 -2.06904 -17.75787186 -15.55267904\n",
" 64.28684296 -6.80198502 -12.25534761 61.13554293 36.13268615]\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fd3c9bb7ac0>"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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gnrr16+fJGnz5s0KBALq1atXycWmLMtS//79JRW9wFuWpWuuuabka6Wnpys3N1eHDx8uk6OqY6KRorrz+UNvvvmmrr32WiUnJ2vVqlVq1apVuV8rGuazOio7fn748GHl5uZG5bwEKxAIaPz48VqwYIFGjBih+fPny+Uq/Su2qj0K0fzzVyw3N1dZWVnasmWLYmNjS/2eXLBggSTpoosukmVZev3115nTKrRr106SVL9+/XKfL3785MmTjplLVmxCbMCAAUpOTi7z+JdffqmlS5eqffv2ysjI0P/8z/+UPNe3b1+tX79eK1as0JgxY0p93PLly0vGRLM333xTQ4cO1TnnnKNVq1apTZs2FY5lPsvXt29fzZ49WytWrND1119f6rlonpdgFJea559/XsOHD9cLL7xQ7r6Q9PR0NWvWTJmZmcrLyyt15kleXp4yMzPVsmVLpaSkhDJ+WPF6vbrpppvKfW7t2rXKysrSVVddpYYNGyotLY05rULxP5p37NhR5rmCggLt3r1b8fHxatiwoZo0aeKMuQzlueWoWGXXsfn000+5oFwlli5darxer2nSpInZuXNnleOZz/IVFBSYVq1aVXqBvs8//9y2fOHK7/eXXF/luuuuq/JaIU64AJpdyruOjTHMaVWKr6f07LPPlnr8t7/9rZFkRo0aVfKYE+bSMsYYmzoVfmD16tXq37+/Jk2aVOa4vCTNmjVLM2bMUGpqqoYOHaqcnBwtWrRIp0+f1rvvvquMjAwbUttv586d6tKli/Lz83X99deXLLv+UFpamsaNG1fqMeazfKtWrdKgQYMUFxen66+/XvXq1dPixYu1b98+zZkzR1OnTrU7Yth54IEH9OCDDyohIUG33XZbmesmSdI111yjLl26SCr6l29GRoa2bt2qgQMHqmvXrtq0aZNWrFih7t27a82aNapTp06Iv4vIMG7cOC1YsEDr169Xr169Sh5nTiv32Wef6eKLL9bRo0f105/+VO3bt9fmzZu1cuVKpaam6oMPPii5/IUj5tLuZoUila3YFFu4cKHp1q2bqVOnjklKSjKDBw82H3/8cQhThp/ieavsrW/fvuV+LPNZvg0bNpgrrrjCJCYmmjp16pgePXqUud8Rvle8ilDZ27x580p9zPHjx83tt99uUlJSTExMjGnRooWZOnWq8fl89nwTEaKiFRtjmNOq7N+/34wbN840adLExMTEmJSUFPPLX/7SHDlypMzYSJ9LVmwAAIBjcFYUAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwDIoNAABwjP8PVrmPyTNb4+IAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"pca = PCA(n_components=2)\n",
"pca.fit(X)\n",
"X_pca = pca.transform(X)\n",
"plt.scatter(X_pca[:, 0], X_pca[:, 1], c=colors[beer.cluster], s=50)\n"
]
}
],
"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
}