【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现

【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现

一、DBSCAN算法(具有噪声的基于密度的聚类方法)

1.算法原理

基于数据分布密度不同对数据进行聚类,把高于设定阈值的密度区域划分同一数据簇。主要特点是不需预先设定形成的簇类的数量并且能在噪声数据集中实现任意形状的聚类

2.算法实现流程图
在这里插入图片描述

3.参数说明

  • Eps:领域半径
  • min_samples:密度阈值,即簇内点的个数

4.具体代码实现

import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt

#读入数据
csv_file = pd.read_csv("now1.csv")
data = []
for i in range(1, len(csv_file)):
    line = csv_file[i:i + 1]
    x = line['x'][i]
    y = line['y'][i]
    data.append([x, y])

#转换成数组
data = np.array(data)
X = data

#实现DBSCAN,设置半径为20,样本个数为200
db = DBSCAN(eps=20, min_samples=200).fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

# 画图
unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    if k == -1:
        col = [0, 0, 0, 1]

    class_member_mask = labels == k

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(
        xy[:, 0],
        xy[:, 1],
        "o",
        tuple(col),
        "k",
        0.01
    )

    y = X[class_member_mask & ~core_samples_mask]
    plt.plot(
        xy[:, 0],
        xy[:, 1],
        "o",
        tuple(col),
        "k",
        0.01,
    )
plt.title("Estimated number of clusters: %d" % n_clusters_)
plt.savefig("DBSCAN.png")
plt.show()

调参位置为:db = DBSCAN(eps=20, min_samples=200).fit(X)

5.算法结果示意图
在这里插入图片描述

二、K-means算法

1.算法原理

K-means算法是一种无监督学习,一般用欧式距离作为衡量数据对象间相似度的指标,相似度与数据对象间的距离成反比,相似度越大,距离越小。算法需要预先指定初始聚类数目k以及k个初始聚类中心,根据数据对象与聚类中心之间的相似度,不断更新聚类中心的位置,不断降低类簇的误差平方和SSE,当SSE不再变化或目标函数收敛时,聚类结束,得到最终结果

2.算法实现流程图
在这里插入图片描述

3.参数说明

  • K:聚类个数

4.具体代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

#读入数据
csv_file = pd.read_csv("now1.csv")
data = []
for i in range(1, len(csv_file)):
    line = csv_file[i:i + 1]
    x = line['x'][i]
    y = line['y'][i]
    data.append([x, y])

#转换成数组
data = np.array(data)
X = data
for index, k in enumerate((2, 3, 4, 5)):
    plt.subplot(2, 2, index + 1)
    y_pred = KMeans(n_clusters=k, random_state=None).fit_predict(X)  # 预测值
    plt.scatter(X[:, 0], X[:, 1], c=y_pred, s=10, edgecolor='k', linewidths=0.001)
    plt.text(.99, .01, ('k=%d' % (k)),  # 文本注释,标注关键信息
             transform=plt.gca().transAxes, size=10, horizontalalignment='right')
plt.savefig("Kmeans.png")
plt.show()

调参位置:for index, k in enumerate((2, 3, 4, 5)):

5.算法结果示意图
在这里插入图片描述

三、Mean Shift算法(均值漂移算法)

1.算法原理

基于质心的算法,通过更新质心的候选位置,这些侯选位置通常是所选定区域内点的均值。然后,这些候选位置在后处理阶段被过滤以消除近似重复,从而形成最终质心集合。

2.算法实现流程图

3.参数说明

  • bandwidth:带宽,可理解为半径

4.具体代码实现

import numpy as np
import pandas as pd
from sklearn.cluster import MeanShift
import matplotlib.pyplot as plt
from itertools import cycle

#读入数据
csv_file = pd.read_csv("now1.csv")
data = []
for i in range(0, len(csv_file)):
    line = csv_file[i:i + 1]
    x = line['x'][i]
    y = line['y'][i]
    data.append([x, y])

data = np.array(data)
X = data

#bandwidth可以理解为半径
ms = MeanShift(bandwidth=200, bin_seeding=True)
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)

print("number of estimated clusters : %d" % n_clusters_)

#画图
plt.figure(1)
plt.clf()
colors = cycle("bgrcmykbgrcmykbgrcmykbgrcmyk")
for k, col in zip(range(n_clusters_), colors):
    my_members = labels == k
    cluster_center = cluster_centers[k]
    plt.plot(X[my_members, 0], X[my_members, 1], col + ".")
    plt.plot(
        cluster_center[0],
        cluster_center[1],
        "o",
        markerfacecolor=col,
        markeredgecolor="k",
        markersize=0.01,
    )
plt.title("Estimated number of clusters: %d" % n_clusters_)
plt.savefig("Mean Shift.png")
plt.show()

调参位置:ms = MeanShift(bandwidth=200, bin_seeding=True)
5.算法结果示意图
在这里插入图片描述

now1.csv文件下载MathorCup D题

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值