python机器学习系列:均值平移(Mean Shift)算法的实现及应用

这里是对应的课程地址:https://pythonprogramming.net/hierarchical-clustering-mean-shift-machine-learning-tutorial/?completed=/k-means-from-scratch-2-machine-learning-tutorial/

关于这个算法更像是无监督学习,它相较于K-Means算法不用指定K的个数,可以自动的通过求解一个向量,使得圆心一直往数据集密度最大的方向移动。说的再简单一点,就是每次迭代的时候,都是找到圆里面点的平均位置作为新的圆心位置。

可参考:机器学习(十)Mean Shift 聚类算法
爬山算法

在原作者的原代码上进行一些符合当今实际情况的修改。

均值平移(Mean Shift)的实现

首先通过代码来理解看看他是个什么情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import numpy as np
from sklearn.cluster import MeanShift
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.style.use('ggplot')
centers = [[1,1,1], [5,5,5], [3,10,10]]
#样本以及聚类型
X, label = make_blobs(n_samples=100, centers=centers, cluster_std=1.5) #样本数量,中心点,方差设置
ms = MeanShift()
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
n_clusters = len(np.unique(labels))
print(labels,cluster_centers)
colors = ['r','g','k']
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
#画出所有的样本点
for i in range(len(X)):
ax.scatter(X[i][0], X[i][1], X[i][2], c=colors[labels[i]], marker='o')
#画出中心点
ax.scatter(cluster_centers[:,0], cluster_centers[:,1], cluster_centers[:,2],marker='x', color='k', s=150, linewidths=5, zorder=1) #zorder参数的数值越小表示越早画上去,在图表在叠加状态下时有一定的调整作用,比如不让画出来的交叉图分不清等问题
# ax.scatter(cluster_centers[0], cluster_centers[1], cluster_centers[2],marker='x', color='k', s=150, linewidths=5, zorder=10)还是跟上面的有区别的,自行检查。
print(cluster_centers[:,0])
plt.show()

结果展示:

对我来说,作者的关于均值平移(Mean Shift)算法的教程文章实在是看不下去了…

关于原作者的均值平移(Mean Shift)算法的实现

原作者的代码不怎么合意,并且不能怎么真正的展现出来实现的意义,我不怎么认同,所以只贴上链接在此。

关于均值平移(Mean Shift)算法的项目应用

在原作者中是关于上次中的titanic数据集。

数据地址:https://pythonprogramming.net/static/downloads/machine-learning-data/titanic.xls

对我来说,这个算法应用到这个数据集上是有一点牵强的,没必要的…因为选择这样的数据集来进行试验品实在有点晦涩难懂不合适。

铺助理解链接

就这样吧,其实我也很期待写下神经网络的记录教程~

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 14:01

许可协议: 转载请保留原文链接及作者。