![0ec91c86480c2f479a577289cc4a0c2b.png](https://i-blog.csdnimg.cn/blog_migrate/398e1d18f8c729893ad61e5801c53651.jpeg)
作者:Peter
红色石头的个人网站:
红色石头的个人博客-机器学习、深度学习之路www.redstonewill.com![3c9f0ede39972b52fec421671e606172.png](https://i-blog.csdnimg.cn/blog_migrate/185b176149878c4a9a98c8e4a0cffda8.jpeg)
系列文章:
吴恩达《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)。在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,快速这个数据的中找到其内在数据结构。
![9a42f83ff0aaa7be9fd7aaa8c826a27d.png](https://i-blog.csdnimg.cn/blog_migrate/5cf70cea39879b0505d83ea86c296324.jpeg)
无监督学习应用
- 市场分割
- 社交网络分析
- 组织计算机集群
- 了解星系的形成
![9dff5555ebf5b2d23d8dec4885971ba0.png](https://i-blog.csdnimg.cn/blog_migrate/a218d7a64f43d2d46d1a85c55edc225b.jpeg)
聚类
聚类clustering
聚类试图将数据集中的样本划分成若干个通常是不相交的子集,称之为“簇cluster”。聚类可以作为一个单独过程,用于寻找数据内部的分布结构,也能够作为其他学习任务的前驱过程。聚类算法涉及到的两个问题:性能度量和距离计算
性能度量
聚类性能度量也称之为“有效性指标”。希望“物以类聚”。聚类的结果是“簇内相似度高”和“簇间相似度低”。
常用的外部指标是:
- Jaccard 系数
- FM 系数
- Rand 系数
上述3个系数的值都在[0,1]之间,越小越好
常用的内部指标是:
- DB指数
- Dunn指数
DBI的值越小越好,Dunn的值越大越好。
距离计算
xi,xj 的Lp的距离定义为:
![f5115a9c2de4aa42605d9be0b7bce48f.png](https://i-blog.csdnimg.cn/blog_migrate/bd1076ffc0e2b4904eb5fbe5d3b5fe72.jpeg)
规定:p≥1,常用的距离计算公式有
- 当p=2时,即为欧式距离,比较常用,即:
![a10047ce2602d0a0e9b6faf79059bbe9.png](https://i-blog.csdnimg.cn/blog_migrate/00e65ceafb10bdec0c2d12cdfb5e1dd5.jpeg)
- 当p=1时,即曼哈顿距离,即:
![92526799adc32413080958a02b32420f.png](https://i-blog.csdnimg.cn/blog_migrate/85a0296d8c518920a240471ea15b9ed1.jpeg)
- 当p趋于无穷,为切比雪夫距离,它是各个坐标距离的最大值:
![3c994006fb415ddeb793c7f4e37af6b6.png](https://i-blog.csdnimg.cn/blog_migrate/653accfa02c17384e1ad35ce47c4f8ed.jpeg)
余弦相似度
余弦相似度的公式为:
![2ddd778b4a9f59862219c8c4c69daf58.png](https://i-blog.csdnimg.cn/blog_migrate/46ec1b98ab60b702480b26bd56efe179.jpeg)
Pearson皮尔逊相关系数
皮尔逊相关系数的公式如下:
![625da499741af5e7a8ad8573bdda10fc.png](https://i-blog.csdnimg.cn/blog_migrate/54c8f24000838ff0eb8f08a917286a04.jpeg)
K-均值算法
算法思想
K-均值,也叫做k-means算法,最常见的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。假设将数据分成n个组,方法为:
- 随机选择K个点,称之为“聚类中心”
- 对于数据集中的每个数据,按照距离K个中心点的距离,将其和距离最近的中心点关联起来,与同个中心点关联的所有点聚成一类。
- 计算上面步骤中形成的类的平均值,将该组所关联的中心点移动到平均值的位置
- 重复上面两个步骤,直到中心点不再变化。
图解K-means
- 给定需要划分的数据,随机确定两个聚类中心点
- 计算其他数据和这两个中心点的距离,划入距离小的类中,假设两个类是C1,C2
- 确定上述步骤中两个类是C1,C2的均值,这个均值就是新的聚类中心
- 重复:计算数据和这两个中心点的距离,划入距离小的类中,形成新的类;再确定新的聚类中心
- 直至中心点不再变化,结束
![b7eba02ee834261ebb6646257709020b.png](https://i-blog.csdnimg.cn/blog_migrate/abd903bb18fa12676a83c8972c9d6cb9.jpeg)
![a62e4d3b73e49ef88b5622352c8d798d.png](https://i-blog.csdnimg.cn/blog_migrate/b6dfc09afacaf496d83f38665cd22180.jpeg)
![ca54e571dba95ddb366b7eb9c003ae5c.png](https://i-blog.csdnimg.cn/blog_migrate/1f5946ad9236ce4e74e88a93b80f7316.jpeg)
![1914ca7d415eea55e14624686caa31b1.png](https://i-blog.csdnimg.cn/blog_migrate/9080fa91f8985691c610a324114af8cd.jpeg)
![b895219e766c4f5553d23df54055d564.png](https://i-blog.csdnimg.cn/blog_migrate/6d693fad4e47bc2aa5001f974e4357f8.jpeg)
全过程
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
}
西瓜书中的伪代码
![13fc3ea809cd12a0922b34bcbf957d03.png](https://i-blog.csdnimg.cn/blog_migrate/1c04be881fa83498549f73329746cb92.jpeg)
优化目标Optimization Objective
K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(畸变函数Distortion function) :
![f573d89a5ddd544df81380d36a6e12ec.png](https://i-blog.csdnimg.cn/blog_migrate/c8dd7ac9d6f1802301000377423b051a.jpeg)
其中μ代表与xi最近的聚类中心点
优化目标就是找出使得代价函数最小的c和μ,即:
![b1f083b37597f17cc2176db3462d6dff.png](https://i-blog.csdnimg.cn/blog_migrate/3b1fd7570c2e60775898bef9d9226516.jpeg)
随机初始化
在运行K-均值算法的之前,首先要随机初始化所有的聚类中心点:
- 选择K<m,即聚类中心的个数小于训练样本的实例数量
- 随机训练K个训练实例,然后令K个聚类中心分别和这K个训练实例相等
关于K-means的局部最小值问题:
![f5cd20ba6126daf0e51e67a77e7acd52.png](https://i-blog.csdnimg.cn/blog_migrate/c7723399ea3448acfdb2a95b2c8577e1.jpeg)
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")
![0d3be7f13eb25bddd5272c917aed7013.png](https://i-blog.csdnimg.cn/blog_migrate/bf93521a61e62c0f76c09367e896b048.jpeg)
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")
![580cfd2d846a946f0508e853cf819884.png](https://i-blog.csdnimg.cn/blog_migrate/e9f8f4bc2b99946d07625f2196b1b622.jpeg)
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")
![8ef8e6cf5e5a3d4adfc959455bed16d3.png](https://i-blog.csdnimg.cn/blog_migrate/86aaf662c67ba001e447243bad3e5c3a.jpeg)
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()
![077560f310ecf22f8be39c09d5f8e388.png](https://i-blog.csdnimg.cn/blog_migrate/4d0cc442d32babb792281393fdb4b9ab.jpeg)
基于 python实现K-means算法
这是在网上找到的一个基于Python找到的`K-means实验算法,学习使用
![ea4166eafcd10961a809d00327d65d11.png](https://i-blog.csdnimg.cn/blog_migrate/f1dc7d98261eb35cf6c8d2db23a56a8c.jpeg)
本文首发于公众号:AI有道(ID: redstonewill),欢迎关注!
![b991b75b994f9d57d81a8c201a762744.png](https://i-blog.csdnimg.cn/blog_migrate/61d442838fca3f357a26414b443b3f3a.jpeg)