【机器学习】聚类算法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题