• from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples, silhouette_score from matplotlib import pyplot as plt from matplotlib import cm import numpy as np from sklearn....
1.导入相应包
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from sklearn.datasets import make_blobs

2.生成数据集
X, y = make_blobs(n_features=2, centers=4, n_samples=500, random_state=1)

3.绘图（比较复杂，看注释）
#绘制在n_clusters不同情况下的轮廓图与效果图
for n_clusters in [2, 3, 4, 5, 6, 7]:
n_clusters = n_clusters
#创建画布
fig, (ax1, ax2) = plt.subplots(1, 2)
#设置画布大小
fig.set_size_inches(18, 7)
#设置横轴和纵轴作图范围，注意和xticks区别
ax1.set_xlim([-0.1, 1])
#这里是样本数加间隔数（这里设置为10）
ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
#建立模型并训练
clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
#得到标签
cluster_labels = clusterer.labels_
#获得平均轮廓系数
silhouette_avg = silhouette_score(X, cluster_labels)
#输出
print("For n_clusters =", n_clusters,
"The average silhouette_score is", silhouette_avg)
#获得每个样本的轮廓系数
sample_silhouette_values = silhouette_samples(X, cluster_labels)
#为了不贴着x轴画图，设置距离10cm
y_lower = 10
#画出每个簇的轮廓图
for i in range(n_clusters):
#第i个簇的值
ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
#排序
ith_cluster_silhouette_values.sort()
#设置y曲线长度
size_cluster_i = ith_cluster_silhouette_values.shape[0]
y_upper = y_lower + size_cluster_i
#设置colormap
color = cm.nipy_spectral(float(i) / n_clusters)
#绘制轮廓这里fill_betweenx是通过x坐标长度绘制，fill_betweeny则是按y坐标来绘制
ax1.fill_betweenx(np.arange(y_lower, y_upper), ith_cluster_silhouette_values, facecolor=color, alpha=0.7)
#写上文字前两参数时坐标，后面是文字
ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
#设置下一个的y_lower
y_lower = y_upper + 10
ax1.set_title("The silhouette plot for the various clusters.")
ax1.set_xlabel("The silhouette coefficient values")
ax1.set_ylabel('Cluster label')
#绘制虚直线
ax1.axvline(x=silhouette_avg, color='red', linestyle="--")
ax1.set_yticks([])
ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
ax2.scatter(X[:, 0], X[:, 1], marker='o', s=8, c=colors)
centers = clusterer.cluster_centers_
ax2.scatter(centers[:, 0], centers[:, 1], marker='x', c='red', alpha=1, s=200)
ax2.set_title("The visualization of the clustered data.")
ax2.set_xlabel("Feature space for the 1st feature")
ax2.set_ylabel("Feature space for the 2nd feature")
#设置大标题
plt.suptitle(("Silhouette analysis for KMeans clustering on sample data with n_clusters = %d" % n_clusters),
fontsize=14, fontweight='bold')
plt.show()

绘制图像如下：


展开全文
• kmeans通常在数据分析前期使用，选取适当的k，将数据分类后，而后分类研究不一样聚类下数据的特色。html本文记录学习kmeans算法相关的内容，包括算法原理，收敛性，效果评估聚，最后带上R语言的例子，做为备忘。java...
前言javascriptkmeans是最简单的聚类算法之一，可是运用十分普遍。最近在工做中也常常遇到这个算法。kmeans通常在数据分析前期使用，选取适当的k，将数据分类后，而后分类研究不一样聚类下数据的特色。html本文记录学习kmeans算法相关的内容，包括算法原理，收敛性，效果评估聚，最后带上R语言的例子，做为备忘。java算法原理算法kmeans的计算方法以下：shell1 随机选取k个中心点app2 遍历全部数据，将每一个数据划分到最近的中心点中机器学习3 计算每一个聚类的平均值，并做为新的中心点ide4 重复2-3，直到这k个中线点再也不变化(收敛了)，或执行了足够多的迭代函数时间复杂度：O(I*n*k*m)post空间复杂度：O(n*m)其中m为每一个元素字段个数，n为数据量，I为跌打个数。通常I,k,m都可认为是常量，因此时间和空间复杂度能够简化为O(n)，即线性的。算法收敛从kmeans的算法能够发现，SSE实际上是一个严格的坐标降低(Coordinate Decendet)过程。设目标函数SSE以下：SSE(,,…,) = 采用欧式距离做为变量之间的聚类函数。每次朝一个变量的方向找到最优解，也就是求偏倒数，而后等于0，可得 c_i= 其中m是c_i所在的簇的元素的个数 也就是当前聚类的均值就是当前方向的最优解(最小值)，这与kmeans的每一次迭代过程同样。因此，这样保证SSE每一次迭代时，都会减少，最终使SSE收敛。因为SSE是一个非凸函数(non-convex function)，因此SSE不能保证找到全局最优解，只能确保局部最优解。可是能够重复执行几回kmeans，选取SSE最小的一次做为最终的聚类结果。0-1规格化因为数据之间量纲的不相同，不方便比较。举个例子，好比游戏用户的在线时长和活跃天数，前者单位是秒，数值通常都是几千，然后者单位是天，数值通常在个位或十位，若是用这两个变量来表征用户的活跃状况，显然活跃天数的做用基本上能够忽略。因此，须要将数据统一放到0~1的范围，将其转化为无量纲的纯数值，便于不一样单位或量级的指标可以进行比较和加权。具体计算方法以下：其中属于A。 轮廓系数轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation)，用于评估聚类的效果。该值处于-1~1之间，值越大，表示聚类效果越好。具体计算方法以下：对于第i个元素x_i，计算x_i与其同一个簇内的全部其余元素距离的平均值，记做a_i，用于量化簇内的凝聚度。选取x_i外的一个簇b，计算x_i与b中全部点的平均距离，遍历全部其余簇，找到最近的这个平均距离,记做b_i，用于量化簇之间分离度。对于元素x_i，轮廓系数s_i = (b_i – a_i)/max(a_i,b_i)计算全部x的轮廓系数，求出平均值即为当前聚类的总体轮廓系数从上面的公式，不难发现若s_i小于0，说明x_i与其簇内元素的平均距离小于最近的其余簇，表示聚类效果很差。若是a_i趋于0，或者b_i足够大，那么s_i趋近与1，说明聚类效果比较好。K值选取在实际应用中，因为Kmean通常做为数据预处理，或者用于辅助分类贴标签。因此k通常不会设置很大。能够经过枚举，令k从2到一个固定值如10，在每一个k值上重复运行数次kmeans(避免局部最优解)，并计算当前k的平均轮廓系数，最后选取轮廓系数最大的值对应的k做为最终的集群数目。实际应用下面经过例子(R实现，完整代码见附件)讲解kmeans使用方法，会将上面提到的内容所有串起来加载实验数据iris，这个数据在机器学习领域使用比较频繁，主要是经过画的几个部分的大小，对花的品种分类，实验中须要使用fpc库估计轮廓系数，若是没有能够经过install.packages安装。对iris的4个feature作数据正规化，每一个feature均是花的某个不为的尺寸。评估k，因为通常K不会太大，太大了也不易于理解，因此遍历K为2到8。因为kmeans具备必定随机性，并非每次都收敛到全局最小，因此针对每个k值，重复执行30次，取并计算轮廓系数，最终取平均做为最终评价标准，能够看到以下的示意图，当k取2时，有最大的轮廓系数，虽然实际上有3个种类。聚类完成后，有源原始数据是4纬，没法可视化，因此经过多维定标(Multidimensional scaling)将纬度将至2为，查看聚类效果，以下能够发现原始分类中和聚类中左边那一簇的效果仍是拟合的很好的，右测原始数据就连在一块儿，kmeans没法很好的区分，须要寻求其余方法。kmeans最佳实践1. 随机选取训练数据中的k个点做为起始点2. 当k值选定后，随机计算n次，取获得最小开销函数值的k做为最终聚类结果，避免随机引发的局部最优解3. 手肘法选取k值：绘制出k--开销函数闪点图，看到有明显拐点(以下)的地方，设为k值，能够结合轮廓系数。4. k值有时候须要根据应用场景选取，而不能彻底的依据评估参数选取。参考
展开全文
• Kmeans是我接触的第一个机器学习算法，原理简单，却很实用，只要一想到聚类，基本上没有Kmeans解决不了的问题（此处略有夸张~~），本篇整理了Kmeans聚类原理，评判标准以及Sklearn实现过程 一、Kmeans聚类原理 用...
数据分析目录（文末有超级彩蛋！）：
一、Excel系列——四大常用函数及十大高级图表
二、SQL系列——性能优化/多表关联/窗口分析函数等
三、统计学系列——概率论/置信区间/相关/抽样等
四、Pandas系列——数据读取/清洗/规整/分析实战等
五、Python做图系列——箱型图/散点图/回归图/热力图等
六、业务积累系列——流水预测/精细化运营/排序算法等
七、Kmeans系列——原理/评价指标/RFM实战等
八、决策树系列——算法原理/调参/python实现/项目实战
九、贝叶斯系列——算法原理/3种模型/文本分类实战
十、神经网络系列——BP算法原理/最小二乘法/项目实战
Kmeans是我接触的第一个机器学习算法，原理简单，却很实用，只要一想到聚类，基本上没有Kmeans解决不了的问题（此处略有夸张~~），本篇整理了Kmeans聚类原理，评判标准以及Sklearn实现过程（文末有大礼赠送）
一、Kmeans聚类原理
用大白话来说，Kmeans分为三步：
1、待分类的样本向量化，投射到坐标轴上，先定分几个类（假设3类），随机找3个点做为初始聚类中心，分别计算每个点到3个中心的距离，哪个最近，这个点就属于哪个类了；
2、据第一步分好的类对其内部点求均值，重新做为聚类中心，再计算一遍所有点到这几个中心的距离，重新聚类，这时肯定会有一些点叛逃，没关系，就让他走！ 忠诚的还是会留下来的！
3、就这么一直迭代，直到再也没有点移动或者达到设定的标准了，就可以结束啦！

回想一下我们学过的二维笛卡尔坐标系，如果2个点的横纵坐标差距很小，从空间上看两个点就会挨得特别近，这个其实就是聚类的核心思想，衡量2个点之间差距的就叫做欧氏距离：( (x1-x2)^ 2+(y1-y2) ^ 2 ) ^1/2，扩大到多维，就是各维度坐标相减后求平方和再开方
这里有一个疑问，为什么聚类和分类都是以欧氏距离或者其它距离，而在推荐系统中余弦相似度却用的比较多？
经过深思熟虑之后，我认为主要还是业务需求不同造成的：
聚类是想将用户按特定标准分成几类，然后针对不同的类型采用不同的运营方式，这叫做精细化运营，因此每个指标都很接近的，那必须是一类人了，比如每个月购买金额在10万以上，登录天数在20天以上，这很明显就是很有钱的忠诚用户，这个群体就是必须要小心翼翼地呵护的。而推荐系统其实不是为了找到各方面都很接近的人，而是找到同样喜欢一些东西的人，那喜欢怎么衡量，余弦相似度就是绝佳的评判标准，它只看夹角，不看距离，不管一个月花10万，还是一个月花1千，只要两人买的最多的都是同一件商品，那么就代表两人对这个商品的喜欢程度就是一样的。
二、Kmeans评判标准
Kmeans聚类前要考虑几个问题：
1、数据是否有聚类的趋势
如果是纯随机，那么不管怎么调参，聚类的效果均是不好的，聚类趋势怎么判定，用霍普金斯统计量，取任意N个点与最近向量的距离和，再取N个点与最近向量的距离和，前者除了两者的和，如果纯随机则在0.5附近，有聚类趋势的话会趋近于1或0
2、如何确定分几类？
一般有2种方法，1是经验法，分类数=样本数/2再开根号，当然这也没啥理论依据；另一种更科学的方法叫肘方法，先分1类，2类，3类，N类，分别计算不同分类下所有点到各自聚类中心的距离，可以想到肯定是分1类距离最大，分到N类距离为0（每个点都是一个类），当从1类变成2类，距离会迅速减小，2类变成3类，3类变成4类，直到分到某个数时，发现其减少的量会变得很缓，达到一个拐点，那这个拐点就是最佳的分类数，如果画图就像一个手肘，于是美其名曰：轴方法
3、如何评判分类质量？
不像其它监督学习可以用测试集直接进行质量评判，聚类没有样本输出，但可以根据簇内稠密度和簇外分散度来衡量，一般有2种，而这2种Sklearn中都有。
一个是轮廓系数，向量与簇内部各点距离求均值，衡量簇内部的紧凑程度，再与簇外部所有点的距离求均值，衡量簇外部的分散程度，后者减掉前者，再除了两者的最大值，结果在[-1,1]之间，如果趋近于1，那是分得相当好了，如果是负数，那啥也别说了，直接重来吧~~在Sklearn中是用silhouette_score()计算所有点的平均轮廓系数，而silhouette_samples()返回每个点的轮廓系数
另一个是Calinski-Harabaz（CH），用的是簇间的协方差矩阵与簇内的协方差矩阵相除，如果前者越大，后者越小，那么分值越大，分类越好，在sklearn中et是是用metrics.calinski_harabaz_score.
三、Sklearn实现
1、主要参数介绍

n_clusters: K值，这个值一般需要结合第3点的评判标准，找到最佳的K
2）max_iter： 最大的迭代次数，一般如果是凸数据集的话可以不管这个值，如果数据集不是凸的，可能很难收敛，此时可以指定最大的迭代次数让算法可以及时退出循环。
3）n_init：用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法，因此需要多跑几次以选择一个较好的聚类效果，默认是10，一般不需要改。如果你的k值较大，则可以适当增大这个值。
4）init： 初始值选择的方式，一般默认’k-means++’。

2、使用数据生成器生成聚类数据，采用CH分数和散点图评判聚类结果
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn import datasets

x,y = make_blobs(n_samples=1000,n_features=2,centers=4,cluster_std=[0.2,0.3,0.5,0.4],shuffle=True,random_state=9)
print(x[:5])
score = []

fig = plt.figure(figsize=(20,20))
plt.scatter(x[:,0],x[:,1],c=y)
plt.title('原始（设定分4类）')

clf = KMeans(n_clusters=3,max_iter=1000)
pred = clf.fit_predict(x)
score.append(metrics.calinski_harabaz_score(x,pred))
plt.scatter(x[:,0],x[:,1],c=pred)
plt.title('Kmeans分3类')

clf = KMeans(n_clusters=4,max_iter=1000)
pred = clf.fit_predict(x)
score.append(metrics.calinski_harabaz_score(x,pred))
plt.scatter(x[:,0],x[:,1],c=pred)
plt.title('Kmeans分4类')

clf = KMeans(n_clusters=6,max_iter=1000)
pred = clf.fit_predict(x)
score.append(metrics.calinski_harabaz_score(x,pred))
plt.scatter(x[:,0],x[:,1],c=pred)
plt.title('Kmeans分6类')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']  # 设置正常显示中文
plt.show()
print(score)


从CH分数看，分4类是最高的，这与预期设定的4类结果是一致的，从散点图上也能看出，分4类也是最好的。当特征超过2维后，我们肉眼已经无法直观判断时，CH分数可以做为很实用的替代方法

本人互联网数据分析师，目前已出Excel，SQL，Pandas，Matplotlib，Seaborn，机器学习，统计学，个性推荐，关联算法，工作总结系列。

微信搜索 " 数据小斑马" 公众号，回复“数据分析"就可以免费领取数据分析升级打怪 15本必备教材喔


展开全文
• 轮廓系数确定kmeans的K值 方法： 1，计算样本i到同簇其他样本的平均距离ai。ai 越小，说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。 簇C中所有样本的a i 均值称为簇C的簇不相似度。 2，计算样本i到...
轮廓系数确定kmeans的K值
方法：
1，计算样本i到同簇其他样本的平均距离ai。ai 越小，说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。
簇C中所有样本的a i 均值称为簇C的簇不相似度。
2，计算样本i到其他某簇Cj 的所有样本的平均距离bij，称为样本i与簇Cj 的不相似度。定义为样本i的簇间不相似度：bi =min{bi1, bi2, …, bik}
bi越大，说明样本i越不属于其他簇。
3，根据样本i的簇内不相似度a i 和簇间不相似度b i ，定义样本i的轮廓系数：

4，判断：
si接近1，则说明样本i聚类合理；
si接近-1，则说明样本i更应该分类到另外的簇；
若si 近似为0，则说明样本i在两个簇的边界上。
所有样本的s i 的均值称为聚类结果的轮廓系数，是该聚类是否合理、有效的度量。
做出学习曲线：
https://blog.csdn.net/qq_15738501/article/details/79036255
https://blog.csdn.net/u012679583/article/details/80316619


展开全文
• kmeans是最简单的聚类算法之一，但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用，选取适当的k，将数据分类后，然后分类研究不同聚类下数据的特点。 本文记录学习kmeans算法相关的...
• Section I： Brief Introduction on KMeans Cluster The K-Means algorithm belongs to the category of prototype-based clustering. Prototype-based clustering means that each cluster is represented by a ...
• 1、导库 from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples, silhouette_score import matplotlib.pyplot as plt ...# 想要知道每个聚出来的类的轮廓系数是多少，还想要一个.
• 利用 手肘法SSE 和 轮廓系数 检验。 本文运用SSE(簇内误方差)和轮廓系数两种检验方法，对三、（2）python实现完整的K-means算法进行K值检验。 完整代码如下: (1) SSE。 SSE利用计算误方差和，来实现对不同K值的选取...
• Kmeans2Pmml.py # -*- coding:utf-8 -*- import pandas from sklearn.model_selection import train_test_split import numpy as np # 导入numpy库 import matplotlib.pyplot as plt # 导入matplotlib库 from ...
• 1、基于python实现K-Means ...语法：from sklearn.cluster imports KMeans model = KMeans(n_clusters=k) model.fit(data) y_pred = model.predict(data) 属性： cluster_centers_:簇中心【数组】 centro
• kmeans是最简单的聚类算法之一，但是运用十分广泛。最近在工作中也经常遇到这个算法。kmeans一般在数据分析前期使用，选取适当的k，将数据分类后，然后分类研究不同聚类下数据的特点。 本文记录学习kmeans算法...