机器学习实验(三)

实验三 聚类算法

一、实验目的

  1. 加深对非监督学习的理解和认识。

  2. 掌握基于距离的和基于密度的动态聚类算法的设计方法。

二、实验原理

  1. 非监督学习的理论基础。
  2. 动态聚类分析的思想和理论依据。
  3. 聚类算法的评价指标。

本次实验采用两种均值聚类算法实现聚类

K-Means:即“K均值聚类算法”,具体实现步骤如下

  1. 随机的从样本中选择 K 个点作为初始质心。

  2. 计算每个样本到各个质心的距离,将样本划分到距离最近的质心所对应的簇中。

    样本之间的距离选用欧式距离: d i j = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d_{ij} = \sqrt{{(x_1-x_2)}^2+{(y_1-y_2)}^2} dij=(x1x2)2+(y1y2)2

  3. 计算每个簇内所有样本的均值,并根据计算出的均值对质心进行更新

  4. 重复步骤 2 与 3 ,直到满足下列模型中的一个

    • 质心的位置变化小于指定的阈值(默认为 0.0001)
    • 达到最大迭代次数

DBSCAN:一种密度聚类算法

其主要工作原理是从某个核心点出发向外扩张,从而得到一个包含核心点和边界点的最大化区域。具体实现步骤如下:

  1. 根据给定的参数(半径和最少点数)确定所有的核心对象
  2. 选择一个未处理的核心对象,找到其密度可达的样本生成聚类的簇
  3. 重复步骤 2 直到所有对象均已经被处理

三、聚类步骤

  1. 选择聚类算法对鸢尾花做聚类;

  2. 读入要分类的数据;

  3. 设置初始聚类中心;

  4. 根据不同的聚类算法实现聚类。

  5. 按照同样步骤实现所学过的聚类算法。

四、代码和执行结果展示

算法中参数的选取

K-Means算法中 K 值的选取:肘部法

取 y 轴为SSE,x 轴为 k ,可以绘制出随着x的增加,SSE降低的图像。当下降幅度明显趋向于缓慢的时候,取该值为K的值。

SSE(误差平方和)的计算公式: S S E = ∑ i = 1 m w i ( y i − y i ^ ) 2 SSE = \sum\limits^m_{i = 1}w_i{(y_i-\hat{y_i})}^2 SSE=i=1mwi(yiyi^)2

DBSCAN 中 MinPts 、 Eps 和 metric 的选择

eps 过大,类别数可能会减少, 本来不应该是一类的样本也会被划为一类。eps 过小,类别数可能会增大,本来是一类的样本却被划分开。

min_samples 过大,核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。min_samples 过小的话,将产生大量的核心对象,可能会导致类别数过少。

metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离。

编码实现

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.cluster import DBSCAN
from sklearn.datasets import load_iris

iris = load_iris()
X_0 = iris.data[:]  # 表示我们只取特征空间中的后两个维度
X_1 = iris.data[:, :2]

dbscan = DBSCAN(eps=0.3, min_samples=10)  # r, number of pointer
dbscan.fit(X_1)
label_pred = dbscan.labels_
print(label_pred)

X10 = X_0[dbscan.labels_ == 0]
X11 = X_0[dbscan.labels_ == 1]
X12 = X_0[dbscan.labels_ == 2]
plt.scatter(X10[:, 0], X10[:, 1], c="darkorange", marker='o', label='label0')
plt.scatter(X11[:, 0], X11[:, 1], c="grey", marker='*', label='label1')
plt.scatter(X12[:, 0], X12[:, 1], c="blue", marker='+', label='label2')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()

estimator_1 = KMeans(n_clusters=3)  # 构造聚类器:K-means
estimator_1.fit(X_0)  
label_pred_1 = estimator_1.labels_  # 获取聚类标签

# 绘制k-means结果
x00 = X_0[label_pred_1 == 0]
x01 = X_0[label_pred_1 == 1]
x02 = X_0[label_pred_1 == 2]
plt.scatter(x00[:, 0], x00[:, 1], c="red", marker='o', label='label0')
plt.scatter(x01[:, 0], x01[:, 1], c="green", marker='*', label='label1')
plt.scatter(x02[:, 0], x02[:, 1], c="blue", marker='+', label='label2')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()

K -Means 聚类得到的结果

DBSCAN 聚类得到的结果

你可能感兴趣的:(机器学习实验,机器学习,聚类,算法)