其他分享
首页 > 其他分享> > sklearn机器学习(五)

sklearn机器学习(五)

作者:互联网

Task05
本次学习参照Datawhale开源学习:https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn
内容安排如下,主要是一些代码实现和部分原理介绍。
在这里插入图片描述

5. k均值聚类

无监督学习训练样本的标签信息是未知的,目标是通过对无标签训练样本的学习来揭示数据的内在性质及规律,此类学习应用最广的是聚类。聚类试图将数据集中的样本划分为若干个通常不相交的子集,每个子集称为一个“簇”。

5.1. 性能度量

聚类的目的是把数据集中相似的样本聚成一个簇,将不相似的样本分为不同的簇。因此聚类时需要保证同一簇中的样本相似度要尽可能高,而簇与簇之间的样本相似度要尽可能的低。聚类性能度量大致有两类:

在这里插入图片描述
内部指标

外部指标

5.2. 距离计算

对函数 d i s t ( ⋅ , ⋅ ) dist(\cdot,\cdot) dist(⋅,⋅),若它是一个“距离度量”,则需满足基本性质:
非 负 性 : d i s t ( x i , x j ) ⩾ 0 非负性:dist(x_i,x_j)\geqslant0 非负性:dist(xi​,xj​)⩾0 同 一 性 : d i s t ( x i , x j ) = 0 当 且 仅 当 x i = x j 同一性:dist(x_i,x_j)=0当且仅当x_i=x_j 同一性:dist(xi​,xj​)=0当且仅当xi​=xj​ 对 称 性 : d i s t ( x i , x j ) = d i s t ( x j , x i ) 对称性:dist(x_i,x_j)=dist(x_j,x_i) 对称性:dist(xi​,xj​)=dist(xj​,xi​) 直 递 性 : d i s t ( x i , x j ) ⩽ d i s t ( x i , x k ) + d i s t ( x k , x j ) 直递性:dist(x_i,x_j)\leqslant{dist(x_i,x_k)}+dist(x_k,x_j) 直递性:dist(xi​,xj​)⩽dist(xi​,xk​)+dist(xk​,xj​)给定样本 x i = ( x i 1 ; x i 2 ; . . . ; x i n ) x_i=(x_{i1};x_{i2};...;x_{in}) xi​=(xi1​;xi2​;...;xin​)与 x j = ( x j 1 ; x j 2 ; . . . ; x j n ) x_j=(x_{j1};x_{j2};...;x_{jn}) xj​=(xj1​;xj2​;...;xjn​),最常用的是“闵可夫斯基距离”: d i s t m k ( x i , x j ) = ( ∑ u = 1 n ∣ x i u − x j u ∣ p ) 1 p dist_{mk}(x_i,x_j)=(\sum_{u=1}^{n}|x_{iu}-x_{ju}|^p)^\frac{1}{p} distmk​(xi​,xj​)=(u=1∑n​∣xiu​−xju​∣p)p1​当 p = 1 p=1 p=1时就是曼哈顿距离,当 p = 2 p=2 p=2时就是欧氏距离,当 p p p趋近于无穷大时就是切比雪夫距离。
请添加图片描述

(绿色路径为两点间欧氏距离,红色黄色路径为两点间曼哈顿距离)

在这里插入图片描述

(当p为其它值时)

5.3. k均值聚类

给定样本集 D = { x 1 , x 2 , . . . , x m } D=\left\{\begin{matrix}x_1,x_2,...,x_m \end{matrix}\right\} D={x1​,x2​,...,xm​​},“k均值”算法针对聚类所得簇划分 C = { C 1 , C 2 , . . . , C k } C=\left\{\begin{matrix}C_1,C_2,...,C_k \end{matrix}\right\} C={C1​,C2​,...,Ck​​}最小化平方误差: E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 2 E=\sum_{i=1}^{k}\sum_{x\in{C_i}}^{}||x-\mu_i||_2^2 E=i=1∑k​x∈Ci​∑​∣∣x−μi​∣∣22​其中均值向量: μ i = 1 C i ∑ x ∈ C i x \mu_i=\frac{1}{C_i}\sum_{x\in{C_i}}x μi​=Ci​1​x∈Ci​∑​xE值越小则簇内样本相似度越高。如何找到最优解:
在这里插入图片描述
动态图演示过程:
请添加图片描述

5.4. sklearn k均值聚类

'''生成数据'''
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=1000, # 1000个样本
                 n_features=2, # 每个样本2个特征(2维数据)
                 centers=5, # 5个簇中心
                 random_state=42)
fig, ax=plt.subplots(1)
for i in range(5):
    ax.scatter(X[y==i, 0], X[y==i,1],marker='o',s=8,)
plt.show()

在这里插入图片描述

'''聚类'''
from sklearn.cluster import KMeans
cluster = KMeans(n_clusters=5,random_state=0).fit(X)
y_pred = cluster.fit_predict(X)

centroid=cluster.cluster_centers_ # 聚类质心
inertia=cluster.inertia_
'''画出聚类质心'''
fig, ax=plt.subplots(1)
for i in range(n_clusters):
    ax.scatter(X[y_pred==i, 0], X[y_pred==i, 1],
               marker='o',
               s=8)
ax.scatter(centroid[:,0],centroid[:,1],marker='x',s=100,c='black')

在这里插入图片描述

5.5. 参数说明

class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='auto')

n_clusters:int,default=8。质心(centroids)数。
init:三个可选值:“k-means++”, “random”,或者一个ndarray向量。默认值为 ‘k-means++’。

  1. “k-means++” 用k-means++方法选定初始质心从而能加速迭代过程的收敛。
  2. "random"随机从训练数据中选取初始质心。
  3. 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

n_init:int,default=10。用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
max_iter:int,default=300。最大迭代次数。
tol:float,default= 1e-4。容许误差,确定收敛条件。
verbose:int,default=0。结果的信息复杂度
random_state:int,default=None。numpy的随机数生成器。
copy_x:bool,default=True。当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。
algorithm:三个值可选:“auto”, “full”, “elkan”, default=”auto”。

标签:xj,...,xi,dist,frac,学习,聚类,机器,sklearn
来源: https://blog.csdn.net/weixin_45397053/article/details/122133711