Chinese Translation for Charpter 5

pull/256/head
KAN 3 years ago
parent b0507786dd
commit 80099c7ca4

@ -0,0 +1,337 @@
# 介绍聚类
聚类是一种无监督学习,它假定数据集未标记或其输入与预定义的输出不匹配。它使用各种算法对未标记的数据进行排序,并根据它在数据中识别的模式提供分组。
[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare")
> 🎥 点击上面的图片观看视频。当您通过聚类学习机器学习时,请欣赏一些尼日利亚舞厅曲目 - 这是2014 年PSquare上高度评价的歌曲。
## [课前测验](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/27/)
### 介绍
[聚类](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124)对于数据探索非常有用。让我们看看它是否有助于发现尼日利亚观众消费音乐的趋势和模式。
✅花一点时间思考聚类的用途。在现实生活中,每当你有一堆衣服需要整理家人的衣服时,就会发生聚类🧦👕👖🩲. 在数据科学中,聚类用于在尝试分析用户的偏好或确定任何未标记数据集的特征。在某种程度上,聚类有助于理解杂乱的状态,就像一个袜子抽屉。
[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering")
> 🎥单击上图观看视频:麻省理工学院的 John Guttag 介绍聚类
在专业环境中,聚类可用于确定诸如市场细分之类的事情,例如确定哪些年龄组购买哪些商品。另一个用途是异常检测,可能是从信用卡交易数据集中检测欺诈。或者您可以使用聚类来确定一批医学扫描中的肿瘤。
✅ 想一想您是如何在银行、电子商务或商业环境中“意外”遇到聚类的。
> 🎓有趣的是,聚类分析起源于 1930 年代的人类学和心理学领域。你能想象它是如何被使用的吗?
或者,您可以使用它对搜索结果进行分组 - 例如,通过购物链接、图片或评论。当您有一个大型数据集想要减少并且想要对其执行更细粒度的分析时,聚类非常有用,因此该技术可用于在构建其他模型之前了解数据。
✅一旦你的数据被组织成聚类,你就为它分配一个聚类 ID这个技术在保护数据集的隐私时很有用您可以改为通过其聚类 ID 来引用数据点,而不是通过更多的可明显区分的数据。您能想到为什么要引用聚类 ID 而不是聚类的其他元素来识别它的其他原因吗?
在此[学习模块中](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-15963-cxa)加深您对聚类技术的理解
## 聚类入门
[Scikit-learn 提供了大量](https://scikit-learn.org/stable/modules/clustering.html)的方法来执行聚类。您选择的类型将取决于您的用例。根据文档,每种方法都有不同的好处。以下是 Scikit-learn 支持的方法及其适当用例的简化表:
| 方法名称 | 用例 |
| ---------------------------- | -------------------------------------------------- |
| K-Means | 通用目的,归纳的 |
| Affinity propagation | 许多,不均匀的聚类,归纳的 |
| Mean-shift | 许多,不均匀的聚类,归纳的 |
| Spectral clustering | 少数,甚至聚类,转导的 |
| Ward hierarchical clustering | 许多,受约束的聚类,转导的 |
| Agglomerative clustering | 许多,受约束的,非欧几里得距离,转导的 |
| DBSCAN | 非平面几何,不均匀聚类,转导的 |
| OPTICS | 不平坦的几何形状,具有可变密度的不均匀聚类,转导的 |
| Gaussian mixtures | 平面几何,感应的 |
| BIRCH | 具有异常值的大型数据集,归纳的 |
> 🎓我们如何创建聚类与我们如何将数据点收集到组中有很大关系。让我们分析一些词汇:
>
> 🎓 [“转导”与“归纳”](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> 转导推理源自观察到的映射到特定测试用例的训练用例。归纳推理源自映射到一般规则的训练案例,然后才应用于测试案例。
>
> 示例假设您有一个仅部分标记的数据集。有些东西是“记录”有些是“CD”有些是空白的。您的工作是为空白提供标签。如果您选择归纳方法您将训练一个寻找“记录”和“CD”的模型并将这些标签应用于未标记的数据。这种方法将难以对实际上是“盒式磁带”的东西进行分类。另一方面转导方法可以更有效地处理这些未知数据因为它可以将相似的项目组合在一起然后将标签应用于一个组。在这种情况下聚类可能反映“圆形音乐事物”和“方形音乐事物”。
>
> 🎓 [“非平面”与“平面”几何](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> 源自数学术语,非平面与平面几何是指通过“平面”([欧几里德](https://wikipedia.org/wiki/Euclidean_geometry))或“非平面”(非欧几里得)几何方法测量点之间的距离。
>
> 在此上下文中,“平面”是指欧几里得几何(其中一部分被教导为“平面”几何),而非平面是指非欧几里得几何。几何与机器学习有什么关系?好吧,作为植根于数学的两个领域,必须有一种通用的方法来测量聚类中点之间的距离,并且可以以“平坦”(flat)或“非平坦”(non-flat)的方式完成,具体取决于数据的性质. [欧几里得距离](https://wikipedia.org/wiki/Euclidean_distance)测量为两点之间线段的长度。[非欧距离](https://wikipedia.org/wiki/Non-Euclidean_geometry)是沿曲线测量的。如果您的可视化数据似乎不存在于平面上,您可能需要使用专门的算法来处理它。
>
> ![Flat vs Nonflat Geometry Infographic](../images/flat-nonflat.png)
> [Dasani Madipalli ](https://twitter.com/dasani_decoded)作图
>
> 🎓 ['距离'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> 聚类由它们的距离矩阵定义,例如点之间的距离。这个距离可以通过几种方式来测量。欧几里得聚类由点值的平均值定义,并包含“质心”或中心点。因此,距离是通过到该质心的距离来测量的。非欧式距离指的是“聚类心”,即离其他点最近的点。聚类心又可以用各种方式定义。
>
> 🎓 ['约束'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [约束聚类](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf)将“半监督”学习引入到这种无监督方法中。点之间的关系被标记为“无法链接”或“必须链接”,因此对数据集强加了一些规则。
>
> 一个例子:如果一个算法在一批未标记或半标记的数据上不受约束,它产生的聚类质量可能很差。在上面的示例中,聚类可能将“圆形音乐事物”和“方形音乐事物”以及“三角形事物”和“饼干”分组。如果给出一些约束或要遵循的规则(“物品必须由塑料制成”、“物品需要能够产生音乐”),这可以帮助“约束”算法做出更好的选择。
>
> 🎓 '密度'
>
> “嘈杂”的数据被认为是“密集的”。在检查时,每个聚类中的点之间的距离可能或多或少地密集或“拥挤”,因此需要使用适当的聚类方法分析这些数据。[本文](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html)演示了使用 K-Means 聚类与 HDBSCAN 算法探索具有不均匀聚类密度的嘈杂数据集之间的区别。
## 聚类算法
有超过 100 种聚类算法,它们的使用取决于手头数据的性质。让我们讨论一些主要的:
- **层次聚类**。如果一个对象是根据其与附近对象的接近程度而不是较远对象来分类的则聚类是根据其成员与其他对象之间的距离来形成的。Scikit-learn 的凝聚聚类是分层的。
![Hierarchical clustering Infographic](../images/hierarchical.png)
> [Dasani Madipalli ](https://twitter.com/dasani_decoded)作图
- **质心聚类**。这种流行的算法需要选择“k”或要形成的聚类数量然后算法确定聚类的中心点并围绕该点收集数据。[K-means 聚类](https://wikipedia.org/wiki/K-means_clustering)是质心聚类的流行版本。中心由最近的平均值确定,因此叫做质心。与聚类的平方距离被最小化。
![Centroid clustering Infographic](../images/centroid.png)
> [Dasani Madipalli](https://twitter.com/dasani_decoded)作图
- **基于分布的聚类**。基于统计建模,基于分布的聚类中心确定一个数据点属于一个聚类的概率,并相应地分配它。高斯混合方法属于这种类型。
- **基于密度的聚类**。数据点根据它们的密度或它们彼此的分组分配给聚类。远离该组的数据点被视为异常值或噪声。DBSCAN、Mean-shift 和 OPTICS 属于此类聚类。
- **基于网格的聚类**。对于多维数据集,创建一个网格并将数据划分到网格的单元格中,从而创建聚类。
## 练习 - 对你的数据进行聚类
适当的可视化对聚类作为一种技术有很大帮助,所以让我们从可视化我们的音乐数据开始。这个练习将帮助我们决定我们应该最有效地使用哪种聚类方法来处理这些数据的性质。
1. 打开此文件夹中的*notebook.ipynb*文件。
1. 导入`Seaborn`包以获得良好的数据可视化。
```python
!pip install seaborn
```
1. 附加来自*nigerian-songs.csv*的歌曲数据。加载包含有关歌曲的一些数据的数据帧。准备好通过导入库和转储数据来探索这些数据:
```python
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("../data/nigerian-songs.csv")
df.head()
```
检查前几行数据:
| | name | album | artist | artist_top_genre | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- |
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
1. 获取有关数据帧的一些信息,调用`info()`
```python
df.info()
```
输出看起来像这样:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 530 entries, 0 to 529
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 530 non-null object
1 album 530 non-null object
2 artist 530 non-null object
3 artist_top_genre 530 non-null object
4 release_date 530 non-null int64
5 length 530 non-null int64
6 popularity 530 non-null int64
7 danceability 530 non-null float64
8 acousticness 530 non-null float64
9 energy 530 non-null float64
10 instrumentalness 530 non-null float64
11 liveness 530 non-null float64
12 loudness 530 non-null float64
13 speechiness 530 non-null float64
14 tempo 530 non-null float64
15 time_signature 530 non-null int64
dtypes: float64(8), int64(4), object(4)
memory usage: 66.4+ KB
```
1. 通过调用`isnull()`和验证总和为 0 来仔细检查空值:
```python
df.isnull().sum()
```
看起来不错:
```output
name 0
album 0
artist 0
artist_top_genre 0
release_date 0
length 0
popularity 0
danceability 0
acousticness 0
energy 0
instrumentalness 0
liveness 0
loudness 0
speechiness 0
tempo 0
time_signature 0
dtype: int64
```
1. 描述数据:
```python
df.describe()
```
| | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
| count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
| mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
| std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
| min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
| 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
| 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
| 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
| max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 |
> 🤔如果我们正在使用聚类,一种不需要标记数据的无监督方法,为什么我们用标签显示这些数据?在数据探索阶段,它们派上用场,但它们不是聚类算法工作所必需的。您也可以删除列标题并按列号引用数据。
查看数据的普遍值。请注意流行度可以是“0”表示没有排名的歌曲。让我们尽快删除它们。
1. 使用条形图找出最受欢迎的类型:
```python
import seaborn as sns
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top[:5].index,y=top[:5].values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
![most popular](../images/popular.png)
✅如果您想查看更多顶部值,请将顶部更改`[:5]`为更大的值,或将其删除以查看全部。
请注意,当顶级流派被描述为“缺失”时,这意味着 Spotify 没有对其进行分类,所以让我们避免它。
1. 通过过滤掉丢失的数据避免
```python
df = df[df['artist_top_genre'] != 'Missing']
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
现在重新检查genres
![most popular](../images/all-genres.png)
1. 到目前为止,前三大流派主导了这个数据集。让我们专注于`afro dancehall`, `afropop`, 和`nigerian pop`,另外过滤数据集以删除任何具有 0 流行度值的内容(这意味着它在数据集中没有被归类为流行度并且可以被视为我们的目的的噪音):
```python
df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
df = df[(df['popularity'] > 0)]
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
1. 做一个快速测试,看看数据是否以任何特别强的方式相关:
```python
corrmat = df.corr()
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
```
![correlations](../images/correlation.png)
> 唯一强相关性是`energy`和之间`loudness`,这并不奇怪,因为嘈杂的音乐通常非常有活力。否则,相关性相对较弱。看看聚类算法可以如何处理这些数据会很有趣。
>
> > 🎓请注意,相关性并不意味着因果关系!我们有相关性的证据,但没有因果关系的证据。一个[有趣的网站](https://tylervigen.com/spurious-correlations)有一些强调这一点的视觉效果。
这个数据集是否围绕歌曲的流行度和可舞性有任何收敛FacetGrid 显示无论流派如何,都有同心圆排列。对于这种类型,尼日利亚人的口味是否会在某种程度的可舞性上趋于一致?
✅尝试不同的数据点(能量、响度、语音)和更多或不同的音乐类型。你能发现什么?查看`df.describe()`表格以了解数据点的一般分布。
### 练习 - 数据分布
这三种流派是否因其受欢迎程度而对其可舞性的看法有显着差异?
1. 检查我们沿给定 x 和 y 轴的流行度和可舞性的前三种类型数据分布。
```python
sns.set_theme(style="ticks")
g = sns.jointplot(
data=df,
x="popularity", y="danceability", hue="artist_top_genre",
kind="kde",
)
```
您可以发现围绕一般收敛点的同心圆,显示点的分布。
> 🎓请注意,此示例使用 KDE核密度估计该图使用连续概率密度曲线表示数据。这允许我们在处理多个分布时解释数据。
总的来说,这三种流派在流行度和可舞性方面松散地对齐。在这种松散对齐的数据中确定聚类将是一个挑战:
![distribution](../images/distribution.png)
1. 创建散点图:
```python
sns.FacetGrid(df, hue="artist_top_genre", size=5) \
.map(plt.scatter, "popularity", "danceability") \
.add_legend()
```
相同轴的散点图显示了类似的收敛模式
![Facetgrid](../images/facetgrid.png)
一般来说,对于聚类,你可以使用散点图来展示数据的聚类,所以掌握这种类型的可视化是非常有用的。在下一课中,我们将使用过滤后的数据并使用 k-means 聚类来发现这些数据中以有趣方式重叠的组。
---
## 🚀挑战
为下一课做准备,制作一张图表,说明您可能会在生产环境中发现和使用的各种聚类算法。
聚类试图解决什么样的问题?
## [课后测验](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/28/)
## 复习与自学
在应用聚类算法之前,正如我们所了解的,了解数据集的性质是一个好主意。[在此处](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)阅读有关此主题的更多[信息](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
[这篇有用的文章将](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/)引导您了解各种聚类算法在给定不同数据形状的情况下的不同行为方式。
## 作业
[研究用于聚类的其他可视化](./assignment.zh-cn.md)

@ -0,0 +1,13 @@
# 研究用于聚类的其他可视化
## 说明
在本节课中您使用了一些可视化技术来掌握绘制数据图为聚类数据做准备。散点图在寻找一组对象时尤其有用。研究不同的方法和不同的库来创建散点图并在notebook上记录你的工作。你可以使用这节课的数据其他课的数据或者你自己的数据(但是请把它的来源记在你的notebook上)。用散点图绘制一些数据,并解释你的发现。
## 评判规则
| 评判标准 | 优秀 | 中规中矩 | 仍需努力 |
| -------- | -------------------------------- | ----------------------------------------------- | -------------------- |
| | notebook上有五个详细文档的散点图 | notebook上的散点图少于5个而且文档写得不太详细 | 一个不完整的notebook |

@ -0,0 +1,253 @@
# K-Means 聚类
[![Andrew Ng explains Clustering](https://img.youtube.com/vi/hDmNF9JG3lo/0.jpg)](https://youtu.be/hDmNF9JG3lo "Andrew Ng explains Clustering")
> 🎥 单击上图观看视频Andrew Ng 解释聚类
## [课前测验](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/29/)
在本课中,您将学习如何使用 Scikit-learn 和您之前导入的尼日利亚音乐数据集创建聚类。我们将介绍 K-Means 聚类 的基础知识。请记住,正如您在上一课中学到的,使用聚类的方法有很多种,您使用的方法取决于您的数据。我们将尝试 K-Means因为它是最常见的聚类技术。让我们开始吧
您将了解的术语:
- 轮廓打分
- 手肘方法
- 惯性
- 方差
## 介绍
[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering)是一种源自信号处理领域的方法。它用于使用一系列观察将数据组划分和划分为“k”个聚类。每个观察都用于对最接近其最近“平均值”或聚类中心点的给定数据点进行分组。
聚类可以可视化为[Voronoi 图](https://wikipedia.org/wiki/Voronoi_diagram),其中包括一个点(或“种子”)及其相应的区域。
![voronoi diagram](../images/voronoi.png)
> [Jen Looper](https://twitter.com/jenlooper)作图
K-Means 聚类过程[分三步执行](https://scikit-learn.org/stable/modules/clustering.html#k-means)
1. 该算法通过从数据集中采样来选择 k 个中心点。在此之后,它循环:
1. 它将每个样本分配到最近的质心。
2. 它通过取分配给先前质心的所有样本的平均值来创建新质心。
3. 然后,它计算新旧质心之间的差异并重复直到质心稳定。
使用 K-Means 的一个缺点包括您需要建立“k”即质心的数量。幸运的是“肘部法则”有助于估计“k”的良好起始值。试一下吧。
## 前置条件
您将使用本课的*notebook.ipynb*文件,其中包含您在上一课中所做的数据导入和初步清理。
## 练习 - 准备
首先再看看歌曲数据。
1. 创建一个箱线图,`boxplot()`为每一列调用:
```python
plt.figure(figsize=(20,20), dpi=200)
plt.subplot(4,3,1)
sns.boxplot(x = 'popularity', data = df)
plt.subplot(4,3,2)
sns.boxplot(x = 'acousticness', data = df)
plt.subplot(4,3,3)
sns.boxplot(x = 'energy', data = df)
plt.subplot(4,3,4)
sns.boxplot(x = 'instrumentalness', data = df)
plt.subplot(4,3,5)
sns.boxplot(x = 'liveness', data = df)
plt.subplot(4,3,6)
sns.boxplot(x = 'loudness', data = df)
plt.subplot(4,3,7)
sns.boxplot(x = 'speechiness', data = df)
plt.subplot(4,3,8)
sns.boxplot(x = 'tempo', data = df)
plt.subplot(4,3,9)
sns.boxplot(x = 'time_signature', data = df)
plt.subplot(4,3,10)
sns.boxplot(x = 'danceability', data = df)
plt.subplot(4,3,11)
sns.boxplot(x = 'length', data = df)
plt.subplot(4,3,12)
sns.boxplot(x = 'release_date', data = df)
```
这个数据有点嘈杂:通过观察每一列作为箱线图,你可以看到异常值。
![outliers](../images/boxplots.png)
您可以浏览数据集并删除这些异常值,但这会使数据非常少。
1. 现在,选择您将用于聚类练习的列。选择具有相似范围的那些并将`artist_top_genre`列编码为数字类型的数据:
```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
y = df['artist_top_genre']
X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
y = le.transform(y)
```
1. 现在您需要选择要定位的聚类数量。您知道我们从数据集中挖掘出 3 种歌曲流派,所以让我们尝试 3 种:
```python
from sklearn.cluster import KMeans
nclusters = 3
seed = 0
km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X)
# Predict the cluster for each data point
y_cluster_kmeans = km.predict(X)
y_cluster_kmeans
```
您会看到打印出的数组其中包含数据帧每一行的预测聚类0、1 或 2
1. 使用此数组计算“轮廓分数”:
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## 轮廓分数
寻找接近 1 的轮廓分数。该分数从 -1 到 1 不等,如果分数为 1则该聚类密集且与其他聚类分离良好。接近 0 的值表示重叠聚类,样本非常接近相邻聚类的决策边界。[来源](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)。
我们的分数是**0.53**,所以正好在中间。这表明我们的数据不是特别适合这种类型的聚类,但让我们继续。
### 练习 - 建立模型
1. 导入`KMeans`并启动聚类过程。
```python
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
```
这里有几个部分需要解释。
> 🎓 range这些是聚类过程的迭代
> 🎓random_state“确定质心初始化的随机数生成。” [来源](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓WCSS“聚类内平方和”测量聚类内所有点到聚类质心的平方平均距离。[来源](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce)。
> 🎓InertiaK-Means 算法尝试选择质心以最小化“惯性”,“惯性是衡量内部相干程度的一种方法”。[来源](https://scikit-learn.org/stable/modules/clustering.html)。该值在每次迭代时附加到 wcss 变量。
> 🎓k-means++:在[Scikit-learn 中,](https://scikit-learn.org/stable/modules/clustering.html#k-means)您可以使用“k-means++”优化,它“将质心初始化为(通常)彼此远离,导致可能比随机初始化更好的结果。
### 手肘方法
之前,您推测,因为您已经定位了 3 个歌曲genre所以您应该选择 3 个聚类。但真的是这样吗?
1. 使用手肘方法来确认。
```python
plt.figure(figsize=(10,5))
sns.lineplot(range(1, 11), wcss,marker='o',color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
使用`wcss`您在上一步中构建的变量创建一个图表,显示肘部“弯曲”的位置,这表示最佳聚类数。也许**是**3
![elbow method](../images/elbow.png)
## 练习 - 显示聚类
1. 再次尝试该过程,这次设置三个聚类,并将聚类显示为散点图:
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
labels = kmeans.predict(X)
plt.scatter(df['popularity'],df['danceability'],c = labels)
plt.xlabel('popularity')
plt.ylabel('danceability')
plt.show()
```
1. 检查模型的准确性:
```python
labels = kmeans.labels_
correct_labels = sum(y == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
这个模型的准确性不是很好,聚类的形状给了你一个提示。
![clusters](../images/clusters.png)
这些数据太不平衡,相关性太低,列值之间的差异太大,无法很好地聚类。事实上,形成的聚类可能受到我们上面定义的三个类型类别的严重影响或扭曲。那是一个学习的过程!
在 Scikit-learn 的文档中,你可以看到像这样的模型,聚类划分不是很好,有一个“方差”问题:
![problem models](../images/problems.png)
> 图来自 Scikit-learn
## 方差
> 方差被定义为“来自均值的平方差的平均值”[源](https://www.mathsisfun.com/data/standard-deviation.html)。在这个聚类问题的上下文中,它指的是我们数据集的数量往往与平均值相差太多的数据。
>
> ✅这是考虑可以纠正此问题的所有方法的好时机。稍微调整一下数据?使用不同的列?使用不同的算法?提示:尝试[缩放数据](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/)以对其进行标准化并测试其他列。
>
> > 试试这个“[方差计算器](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)”来更多地理解这个概念。
---
## 🚀挑战
花一些时间在这个笔记本上,调整参数。您能否通过更多地清理数据(例如,去除异常值)来提高模型的准确性?您可以使用权重为给定的数据样本赋予更多权重。你还能做些什么来创建更好的聚类?
提示:尝试缩放您的数据。笔记本中的注释代码添加了标准缩放,使数据列在范围方面更加相似。您会发现,当轮廓分数下降时,肘部图中的“扭结”变得平滑。这是因为不缩放数据可以让方差较小的数据承载更多的权重。在[这里](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)阅读更多关于这个问题的[信息](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226)。
## [课后测验](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/30/)
## 复习与自学
看看[像这样](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/)的 K-Means 模拟器。您可以使用此工具来可视化样本数据点并确定其质心。您可以编辑数据的随机性、聚类数和质心数。这是否有助于您了解如何对数据进行分组?
另外,看看斯坦福大学的[k-means 讲义](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html)。
## 作业
[尝试不同的聚类方法](./assignment.zh-cn.md)

@ -0,0 +1,12 @@
# 尝试不同的聚类方法
## 说明
在本课中,您学习了 K-Means 聚类。有时 K-Means 不适合您的数据。使用来自这些课程或其他地方的数据归功于您的来源创建notebook并展示不使用 K-Means 的不同聚类方法。你学到了什么?
## 评判规则
| 评判标准 | 优秀 | 中规中矩 | 仍需努力 |
| -------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ---------------------------- |
| | 一个具有良好文档记录的聚类模型的notebook | 一个没有详细文档或不完整的notebook| 提交了一个不完整的工作 |

@ -0,0 +1,27 @@
# 机器学习中的聚类模型
聚类clustering)是一项机器学习任务,用于寻找类似对象并将他们分成不同的组(这些组称做“聚类”(cluster))。聚类与其它机器学习方法的不同之处在于聚类是自动进行的。事实上,我们可以说它是监督学习的对立面。
## 区域性话题: 尼日利亚观众音乐品味的聚类模型🎧
尼日利亚多样化的观众有着多样化的音乐品味。使用从Spotify上抓取的数据受到[本文](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)的启发让我们看看尼日利亚流行的一些音乐。这个数据集包括关于各种歌曲的舞蹈性、声学、响度、言语、流行度和活力的分数。从这些数据中发现一些模式pattern会是很有趣的事情!
![A turntable](../images/turntable.jpg)
<a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a><a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>上的照片
在本系列课程中,您将发现使用聚类技术分析数据的新方法。当数据集缺少标签的时候,聚类特别有用。如果它有标签,那么分类技术(比如您在前面的课程中所学的那些)可能会更有用。但是如果要对未标记的数据进行分组,聚类是发现模式的好方法。
> 这里有一些有用的低代码工具可以帮助您了解如何使用聚类模型。尝试 [Azure ML for this task](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-15963-cxa)
## 课程安排
1. [介绍聚类](../1-Visualize/translations/README.zh-cn.md)
2. [K-Means聚类](../2-K-Means/translations/README.zh-cn.md)
## 致谢
这些课程由Jen Looper在🎶上撰写并由 [Rishit Dagli](https://rishit_dagli) 和[Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan)进行了有帮助的评审。
[尼日利亚歌曲数据集](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) 来自Kaggle抓取的Spotify数据。
一些帮助创造了这节课程的K-Means例子包括:[虹膜探索(iris exploration)](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering)[介绍性的笔记(introductory notebook)](https://www.kaggle.com/prashant111/k-means-clustering-with-python),和 [假设非政府组织的例子(hypothetical NGO example)](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering)。
Loading…
Cancel
Save