<机器学习笔记-06 ><scikit-learn 06>K-Means 聚类
来源:互联网 发布:亚马逊云计算平台 编辑:程序博客网 时间:2024/05/17 01:52
<机器学习笔记-06>(scikit-learn 06)K-means聚类
关键词:聚类,K-means,scikit-learn,python
摘要:本文主要介绍聚类、K-means的概念和结果评估,以及使用python进行聚类分析的方法;
要点总结
了解无监督学习以及聚类概念;
K-means的实现过程,肘部法则确定超参数
K
,利用平均畸变程度和轮廓系数评估聚类效果;
基本概念
聚类(clustering)
属于无监督学习,可以找出不带标签数据的相似性的算法;
概念:将更具相似性的样本归为一类(cluster),同组中的样本比其他租的样本更相似;
应用:市场调查中对用户分组、社交网络识别社区、推荐系统、寻找相似模式的基因组;
K-means聚类算法
实现过程:
- 指定聚类的数量
K - 初始化,指定第
k 个类的重心位置uk ;(实际中,为避免局部最优解,需要从不同位置开始初始化,取最小成本函数对应的重心位置作为初始化位置) - 遍历每一个元素
xi ,计算该元素到各个类重心uk 的距离,将该元素划分到距其最近的类; - 计算重新生成类的重心;
- 重复3-4,直至各个类的重心位置不再变化(成本函数值的差达到了限定值,或者前后两次迭代的重心位置变化达到了限定值);
- 指定聚类的数量
超参数K:表示类的数量,需要人为指定,K-means不能决定要分几个类;
肘部法则(elbow method): 可用于估计聚类数量;把不同K值的成本函数值画出来,找出K值增大过程中,畸变程度下降幅度最大的位置所对应的K值(即为肘部);
参数:类的重心位置和其内部观测值的位置;
成本函数:各个类畸变程度(distortions)之和;每个类的畸变程度等于该类重心与其内部成员位置距离的平方和;最优解以成本函数最小化为目标,其中
uk 是第k 个类的重心位置;J=∑k=1K∑i∈Ck|xi−uk|2 效果评估-轮廓系数(silhouette Coeffient):类的密集与分散程度的评价指标;其中
a 是每个类中样本彼此距离的均值,b 是一个类中样本与其最近的那个类的所有样本的距离的均值;s=bamax(a,b)
Python使用
numpy
类numpy.random.uniform(low,high,(dimension,number))
生成随机正态分布数组(dimension行,number列)import numpycluster1=numpy.random.uniform(0,10,(3,5)) #0用来指定最小值,10用来指定表示最大值,3用来指定每组数的维度,5用来指定组数;生成结果为3行5列的arraycluster1'''array([[ 4.70790848, 2.18489986, 2.03468687, 9.90719494, 8.76117508], [ 7.20530626, 6.71587658, 7.75926726, 4.68401906, 6.24912461], [ 9.10075334, 8.87222659, 9.72546108, 0.03047577, 8.57698237]])'''
numpy.hstack((array1,array2))
用来将array1
和array2
水平拼接起来import numpyX=numpy.hstack((cluster1,cluster1))X'''Out[27]: array([[ 4.70790848, 2.18489986, 2.03468687, 9.90719494, 8.76117508, 4.70790848, 2.18489986, 2.03468687, 9.90719494, 8.76117508], [ 7.20530626, 6.71587658, 7.75926726, 4.68401906, 6.24912461, 7.20530626, 6.71587658, 7.75926726, 4.68401906, 6.24912461], [ 9.10075334, 8.87222659, 9.72546108, 0.03047577, 8.57698237, 9.10075334, 8.87222659, 9.72546108, 0.03047577, 8.57698237]])'''
将两个一维数组转化为一个二维数组
import numpy as npx1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)X'''Out[6]: array([[1, 1], [2, 3], [3, 2], [1, 2], [5, 8], [6, 6], [5, 7], [5, 6], [6, 7], [7, 1], [8, 2], [9, 1], [7, 1], [9, 3]])'''
sklearn
计算聚类聚类模型生成
from sklearn.cluster import KMeanskmeans=KMeans(n_clusters=3)kmeans.fit(X)
利用
scipy.spatial.distance.cdist
计算平均畸变程度from scipy.spatial.distance import cdistd=cdist(X,Y,'euclidean')#假设X有M个元素,Y有N个元素,最终会生成M行N列的array,用来计算X、Y中每个相对元素之间的欧拉距离numpy.min(d,axis=1) #如果d为m行n列,axis=0时会输出每一列的最小值,axis=1会输出每一行最小值sum(np.min(cdist(X,kmeans.cluster_centers_,'euclidean'),axis=1))/X.shape[0] #求出平均畸变程度
计算轮廓系数
from sklearn import metricsmetrics.silhouette_score(X,kmeans_model.labels_,metric='euclidean'))
matplotlib
库figsize
设置图片大小import matplotlib.pyplot as pltplt.figure(figsize=(8,10))
将不同类的元素绘制成不同的颜色和标记
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b'];\markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']for i,l in enumerate(kmeans_model.labels_): plt.plot(x1[i],x2[i],color=colors[l],\ marker=markers[l],ls='None')
Python实例
聚类和平均畸变程度计算
生成用来聚类分析的两组数并显示
import numpy as npcluster1=np.random.uniform(0.5,1.5,(2,10))cluster2=np.random.uniform(3.5,4.5,(2,10))X=np.hstack((cluster1,cluster2)).Timport matplotlib.pyplot as plt plt.figure();\plt.axis([0,5,0,5]);\plt.grid(True);\plt.plot(X[:,0],X[:,1],'k.');
聚类分析,计算平均畸变程度
from sklearn.cluster import KMeansfrom scipy.spatial.distance import cdistK=range(1,10)meandistortions=[]for k in K: kmeans=KMeans(n_clusters=k) kmeans.fit(X)meandistortions.append(sum(np.min(cdist(X,kmeans.cluster_centers_,'euclidean'),axis=1))/X.shape[0])plt.plot(K,meandistortions,'bx-');\plt.xlabel('K');\plt.ylabel('distortion');
计算轮廓系数
输入数据整理
import numpy as npx1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
显示样本点
%matplotlib inlineimport matplotlib.pyplot as pltplt.figure(figsize=(10,10));\plt.subplot(3,2,1);plt.xlim([0,10]);\plt.ylim([0,10]);\plt.title('sample');\plt.scatter(x1,x2);\
计算并输出轮廓系数
from sklearn.cluster import KMeansfrom sklearn import metricscolors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b'];\markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']subplot_counter=1for t in tests: subplot_counter=subplot_counter+1 plt.subplot(3,2,subplot_counter) kmeans_model=KMeans(n_clusters=t).fit(X) for i,l in enumerate(kmeans_model.labels_): plt.plot(x1[i],x2[i],color=colors[l],\ marker=markers[l],ls='None') plt.xlim([0,10]) plt.ylim([0,10]) plt.title('K=%s, Silhouette Coefficient= %.03f'%(t,metrics.silhouette_score(X,kmeans_model.labels_,metric='euclidean')))
参考文献
“Mastering Machine Learning With scikit-learn”
1 0
- <机器学习笔记-06 ><scikit-learn 06>K-Means 聚类
- 用scikit-learn学习K-Means聚类
- 用scikit-learn学习K-Means聚类
- 【Python】scikit-learn机器学习(八)——K-means聚类
- scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法
- 机器学习-scikit learn学习笔记
- scikit-learn/k-means算法简单应用
- 【机器学习】K-means聚类
- scikit-learn 机器学习
- <机器学习笔记-01><scikit-learn 01>机器学习基础
- 机器学习笔记——K-means
- 机器学习(Stanford)笔记-(K-means)
- 斯坦福NG机器学习:K-means笔记
- 机器学习笔记(三)k-means
- 机器学习笔记-K-means算法
- 机器学习笔记——K-Means
- k-means 机器学习
- Scikit-learn 学习笔记
- 使用#include<bits/stdc++.h>包含C++的所有头文件
- 二级C语言复习6
- 深入理解Nginx 模块开发与架构解析-陶辉 读书笔记
- Android 字体
- android--UI--ViewPager的伪循环效果
- <机器学习笔记-06 ><scikit-learn 06>K-Means 聚类
- java 基础(含泪撰写java中作用域的区别)
- 【自考】数据结构导论
- HTML name、id、class 的区别
- 排序算法之三--直接选择排序
- 点击事件的五种形式
- 四种常见的 POST 提交数据方式
- java学习笔记
- python 函数参数的传递(参数带星号的说明) 元组传递 字典传递