吴恩达《Machine Learning》精炼笔记 8:聚类 KMeans 及其 Python实现

简介: 吴恩达《Machine Learning》精炼笔记 8:聚类 KMeans 及其 Python实现

系列文章:


吴恩达《Machine Learning》精炼笔记 1:监督学习与非监督学习

吴恩达《Machine Learning》精炼笔记 2:梯度下降与正规方程

吴恩达《Machine Learning》精炼笔记 3:回归问题和正则化

吴恩达《Machine Learning》精炼笔记 4:神经网络基础

吴恩达《Machine Learning》精炼笔记 5:神经网络

吴恩达《Machine Learning》精炼笔记 6:关于机器学习的建议

吴恩达《Machine Learning》精炼笔记 7:支持向量机 SVM


本周的主要知识点是无监督学习中的两个重点:聚类和降维。本文中首先介绍的是聚类中的K均值算法,包含:

  • 算法思想
  • 图解K-Means
  • sklearn实现
  • Python实现


无监督学习unsupervised learning


无监督学习简介


聚类和降维是无监督学习方法,在无监督学习中数据是没有标签的。


比如下面的数据中,横纵轴都是xx,没有标签(输出yy)。在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,快速这个数据的中找到其内在数据结构。


image.png

无监督学习应用

  • 市场分割
  • 社交网络分析
  • 组织计算机集群
  • 了解星系的形成


image.png


聚类


聚类clustering


聚类试图将数据集中的样本划分成若干个通常是不相交的子集,称之为“簇cluster”。聚类可以作为一个单独过程,用于寻找数据内部的分布结构,也能够作为其他学习任务的前驱过程。聚类算法涉及到的两个问题:性能度量和距离计算


性能度量


聚类性能度量也称之为“有效性指标”。希望“物以类聚”。聚类的结果是“簇内相似度高”和“簇间相似度低”。


常用的外部指标是:

  1. Jaccard 系数
  2. FM 系数
  3. Rand 系数


上述3个系数的值都在[0,1]之间,越小越好


常用的内部指标是:

  1. DB指数
  2. Dunn指数


DBI的值越小越好,Dunn的值越大越好。


距离计算


xi,xj Lp的距离定义为:

image.png

规定:p≥1,常用的距离计算公式有

  • p=2时,即为欧式距离,比较常用,即:

image.png

  • p=1时,即曼哈顿距离,即:

image.png

  • p趋于无穷,为切比雪夫距离,它是各个坐标距离的最大值:

image.png

余弦相似度


余弦相似度的公式为:

image.png

Pearson皮尔逊相关系数


皮尔逊相关系数的公式如下:

image.png


K-均值算法


算法思想


K-均值,也叫做k-means算法,最常见的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。假设将数据分成n个组,方法为:

  • 随机选择K个点,称之为“聚类中心”
  • 对于数据集中的每个数据,按照距离K个中心点的距离,将其和距离最近的中心点关联起来,与同个中心点关联的所有点聚成一类。
  • 计算上面步骤中形成的类的平均值,将该组所关联的中心点移动到平均值的位置
  • 重复上面两个步骤,直到中心点不再变化。


图解K-means

  1. 给定需要划分的数据,随机确定两个聚类中心点
  2. 计算其他数据和这两个中心点的距离,划入距离小的类中,假设两个类是C1,C2
  3. 确定上述步骤中两个类是C1,C2的均值,这个均值就是新的聚类中心
  4. 重复:计算数据和这两个中心点的距离,划入距离小的类中,形成新的类;再确定新的聚类中心
  5. 直至中心点不再变化,结束


image.pngimage.pngimage.pngimage.pngimage.png

全过程


K-means算法过程


吴恩达视频的中的伪代码为


repeat {
  for i= to m
  #  计算每个样例属于的类
  c(i) := index (from 1 to K)  of cluster centroid closest to x(i)
 for k = 1 to K
  # 聚类中心的移动,重新计算该类的质心
 u(k) := average (mean) of points assigned to cluster K
}

西瓜书中的伪代码


image.png

优化目标Optimization Objective


K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(畸变函数Distortion function) :

image.png

其中μ代表与xi最近的聚类中心点


优化目标就是找出使得代价函数最小的cμ,即:


image.png

随机初始化

在运行K-均值算法的之前,首先要随机初始化所有的聚类中心点:

  • 选择K<m,即聚类中心的个数小于训练样本的实例数量
  • 随机训练K个训练实例,然后令K个聚类中心分别和这K个训练实例相等


关于K-means的局部最小值问题:


image.png


Scikit learn 实现K-means


make_blobs数据集


make_blobs聚类数据生成器make_blobs方法常被用来生成聚类算法的测试数据。它会根据用户指定的特征数量、中心点数量、范围等来生成几类数据。


主要参数


sklearn.datasets.make_blobs(n_samples=100, n_features=2,centers=3, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)[source]


  • n_samples是待生成的样本的总数
  • n_features是每个样本的特征数
  • centers表示类别数
  • cluster_std表示每个类别的方差
import numpy as np
import matplotlib.pyplot as plt
# 导入 KMeans 模块和数据集
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 定义画布
plt.figure(figsize=(12,12))
# 定义样本量和随机种子
n_samples = 1500
random_state = 170
# X是测试数据集,y是目标分类标签0,1,2
X, y = make_blobs(n_samples=n_samples, random_state=random_state)
X
array([[-5.19811282e+00,  6.41869316e-01],
       [-5.75229538e+00,  4.18627111e-01],
       [-1.08448984e+01, -7.55352273e+00],
       ...,
       [ 1.36105255e+00, -9.07491863e-01],
       [-3.54141108e-01,  7.12241630e-01],
       [ 1.88577252e+00,  1.41185693e-03]])
y
array([1, 1, 0, ..., 2, 2, 2])
# 预测值的簇类
y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
y_pred
array([0, 0, 1, ..., 0, 0, 0], dtype=int32)
X[:,0]  # 所有行的第1列数据
array([ -5.19811282,  -5.75229538, -10.84489837, ...,   1.36105255,
        -0.35414111,   1.88577252])
# 子图1的绘制
plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.title("incorrrect Number of Blods")

image.png

transformation = [[0.60834549, -0.63667341],[-0.40887718, 0.85253229]]
X_aniso = np.dot(X, transformation)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_aniso)
# 子图2的绘制
plt.subplot(222)
plt.scatter(X_aniso[:, 0], X_aniso[:, 1], c=y_pred)
plt.title("Anisotropicly Distributed Blobs")

image.png

X_varied, y_varied = make_blobs(n_samples=n_samples,
                               cluster_std=[1.0,2.5,0.5],random_state=random_state)
y_pred = KMeans(n_clusters=3, random_state=random_state).fit_predict(X_varied)
plt.subplot(223)
plt.scatter(X_varied[:, 0], X_varied[:, 1], c=y_pred)
plt.title("Unequal Variance")

image.png

X_filtered = np.vstack((X[y == 0][:500],
                      X[y == 1][:100],
                      X[y == 2][:10]))
y_pred = KMeans(n_clusters=3,random_state=random_state).fit_predict(X_filtered)
plt.subplot(224)
plt.scatter(X_filtered[:, 0],
           X_filtered[:, 1],
           c=y_pred)
plt.title("Unevenly Sized Blobs")
plt.show()

image.png


基于 python实现K-means算法


这是在网上找到的一个基于Python找到的`K-means实验算法,学习使用


11.jpg

相关文章
|
1月前
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
|
1月前
|
SQL 机器学习/深度学习 开发工具
【机器学习 Azure Machine Learning】Azure Machine Learning 访问SQL Server 无法写入问题 (使用微软Python AML Core SDK)
【机器学习 Azure Machine Learning】Azure Machine Learning 访问SQL Server 无法写入问题 (使用微软Python AML Core SDK)
|
1月前
|
Python
【python】】Python 的 queue 模块使用笔记
【python】】Python 的 queue 模块使用笔记
25 0
|
1月前
|
Python
Python笔记9 类
本文是作者的Python复习笔记第九篇,深入探讨了Python中的类和面向对象编程。文中详细解释了如何创建类、实例化对象、定义和使用类方法,以及类的继承、重写方法和嵌套类的使用。此外,还讨论了类模块的导入和导出,包括处理类之间的依赖关系。通过示例代码,文章展示了类在Python编程中的应用和重要性。
24 0
|
1月前
|
存储 Python
Python笔记8 函数
本文是作者的Python复习笔记第八篇,全面介绍了Python中的函数定义与使用,包括函数的参数传递(位置参数、关键字参数、默认参数、列表参数、任意数量参数和关键字参数)、函数的返回值以及如何创建和调用函数库(模块),并提供了丰富的示例代码。
24 0
|
1月前
|
Python
Python笔记7 输入与输出
本文是作者的Python复习笔记第七篇,主要介绍了Python中的输入与输出操作。文中详细解释了如何使用input()函数进行用户输入,包括添加多行字符串提示和字符串转列表输入的方法,以及如何使用print()函数进行格式化输出,提供了多种格式化字符串的示例。
28 0
|
1月前
|
存储 Python
Python笔记6 字典
本文是作者的Python复习笔记第六篇,专注于Python中的字典(dictionary)数据结构。文中详细解释了字典的创建和基本操作,包括访问、修改、添加和删除键值对的方法。此外,还介绍了如何遍历字典的键值对、键或值,并探讨了字典的高级用法,如字典列表、在字典中存储列表以及字典的嵌套使用。文中通过示例代码演示了字典在实际编程中的应用,帮助读者更好地理解和掌握字典这一重要的数据结构。
37 0
|
1月前
|
Python
Python笔记5 条件判断
本文是作者的Python复习笔记第五篇,主要介绍了Python中的条件判断语句。文中详细解释了if、if-else以及if-elif-else结构的用法,包括如何使用等于(==)和不等于(!=)操作符进行条件判断,如何通过and和or进行多条件判断,以及如何使用in和not in关键字检查列表中是否存在特定值。此外,文中还强调了在某些情况下省略else部分可以避免执行不合适的数据导致的命令执行,使代码更加清晰。
23 0
|
1月前
|
Python
Python笔记4 循环
本文是作者的Python复习笔记第四篇,专注于Python中的循环概念。文中详细解释了for循环和while循环的使用方法,包括如何通过循环遍历列表、使用range()函数和list()函数创建列表、列表解析法、while循环的基本使用、使用break和continue语句控制循环流程,以及如何为循环设置状态标志。此外,还提供了多个示例代码来演示循环在实际编程中的应用。
24 0
|
1月前
|
存储 索引 Python
Python笔记3 列表
本文是作者的Python复习笔记第三篇,专注于Python中的列表(List)操作。文中详细解释了列表的创建、元素访问、修改、添加和删除操作,并介绍了列表的排序、反转、长度获取、切片以及复制的方法。此外,还涉及了列表切片的技巧、列表常用函数(如获取最大值、最小值和总和),并对元组(Tuple)和集合(Set)进行了简要说明,包括它们的创建和基本操作。
14 0