使用python进行聚类分析.docx
《使用python进行聚类分析.docx》由会员分享,可在线阅读,更多相关《使用python进行聚类分析.docx(9页珍藏版)》请在冰豆网上搜索。
![使用python进行聚类分析.docx](https://file1.bdocx.com/fileroot1/2022-12/28/097c3d06-cb77-4221-a00a-18f0d16b270c/097c3d06-cb77-4221-a00a-18f0d16b270c1.gif)
使用python进行聚类分析
使用python进行聚类分析
一、研究意义经济管理类研究中,在分析某些变量的时候我们通常需要找出具有相似特征的数据,先将他们进行分类,例如在分析我们在看每个城市的经济增长率的时候,我们可能需要将手里的城市先分为大、中、小城市,然后再进行分析,避免不同类数据之间波动过大影响分析,这种分析在管理学上叫做聚类分析。
聚类分析的基本思想就是认为研究的样本或变量之间存在不同程度的相似性(亲疏关系),它根据一批样本的多个观测指标,做出一些能够度量样本或变量之间的相似程度的统计量,将这些统计量作为分类的依据,将一些相似程度较大的样本(或指标)聚合为一类,直到把所有的样本(或指标)都聚合完毕,形成一个由小到大的分类系统,这里的类被定义为若干个观测值组成的群组,并且群组内的观测值的相似度要比不同的群之间相似度高。
聚类分析在经济管理的社会网络,竞争网络以及合作网络等网络分析中使用频率很高。
Python中可以是用K-Means分析来帮助我们达到这一目的。
Kmeans又称为非监督学习,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。
首先从n个数据对象任意选择k个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止,一般都采用均方差作为标准测度函数。
K-Means算法的基础是最小误差平方和准则,其代价函数是:
?
?
J(c,μ)=∑‖?
(?
?
?
)-?
?
?
?
(?
?
)‖2
?
?
=1
式中,?
?
?
?
(?
?
)表示第i个聚类的均值。
各类簇内的样本越相似,其与该类均值间的误差平方越小,对所有类所得到的误差平方求和,即可验证分为k类时,各聚类是否是最优的。
上式的代价函数无法用解析的方法最小化,只能有迭代的方法。
二、数据描述
在简单聚类分析中,生成一个100*2的随机矩阵。
data=np.random.rand(100,2)#生成一个100*2的随机矩阵print(data)
在复杂聚类分析中,因为scikit-learn中带有一些标准数据集,因此直接从系统自带的digits数据集中导入数据来进行聚类分析。
fromsklearnimportdatasets#Importdatasetsfromsklearndigits=datasets.load_digits()#加载digits数据集print(digits)#显示digits数据
{'data':
array([[0.,0.,
5.,..
.,0.
0.,0.],
[0.,
0.,0.,..
.,10.,
0.,
0.],
[0.,
0.,0.,..
.,16.,
9.,
0.],
[0.,
0.,1.,..
.,6.,
0.,
0.],
[0.,
0.,2.,..
.,12.,
0.,
0.],
[0.,
0.,10.,
...,12.
1
.,0.]]),'target':
array([0,1,2,...,8,9,8]),
'target_names':
array([0,1,2,3,4,5,6,7,8,9]),'images':
array([[[0.,0.,5.,...,
1.,0.,0.],
[0.,
[0.,
0.,13.,.
3.,15.,.
.,15.,5.,
.,11.,8.,
0.],
0.],
[0.,
4.,11.,.
.,12.,7.,
0.],
[0.,
2.,14.,.
.,12.,0.,
0.],
[0.,
0.,
6.,.
..,0.,
0.,
0.]],
[[0.,
0.,
0.,.
.,5.,
0.,
0.],
[0.,
0.,
0.,.
..,9.,
0.,
0.],
[0.,
0.,
3.,.
..,6.,
0.,
0.],
[0.,
0.,
1.,.
..,6.,0.,0.],
[0.,
0.,
1.,.
..,6.,0.,0.],
[0.,
0.,
0.,.
..,10.,0.,0.]],
[[0.,
0.,
0.,.
.,12.,0.,0.],
[0.,
0.,
3.,.
..,14.,0.,0.],
[0.,
0.,
8.,.
..,16.,0.,0.],
[0.,
9.,16.,.
.,0.,0.,0.],
[0.,
3.,13.,.
.,11.,5.,0.],
[0.,
0.,
0.,.
..,16.,9.,0.]],
[[0.,
0.,
1.,.
.,1.,0.,0.],
[0.,
0.,13.,.
.,2.,1.,0.],
[0.,
0.,16.,.
.,16.,5.,0.],
[0.,
0.,16.,.
.,15.,0.,0.],
[0.,
0.,15.,.
.,16.,0.,0.],
[0.,
0.,
2.,.
..,6.,0.,0.]],
[[0.,
0.,
2.,.
.,0.,0.,0.],
[0.,
0.,14.,.
.,15.,1.,0.],
[0.,
4.,16.,.
.,16.,7.,0.],
[0.,
0.,
0.,.
..,16.,2.,0.],
[0.,
0.,
4.,.
..,16.,2.,0.],
[0.,
0.,
5.,.
..,12.,0.,0.]],
[[0.,
0.,10.,..
.,1.,0.,0.],
[0.,
2.,16.,.
.,1.,0.,0.],
[0.,
0.,15.,.
.,15.,0.,0.],
[0.,
4.,16.,.
..,16.,6.,
0.],
[0.,
8.,16.,.
..,16.,8.,
0.],
[0.,
1.,8.,.
..,12.,1.,
0.]]])
三、模型描述
模型数据处理过程解析:
从系统自带的digits数据集中导入数据并规定簇的数目k;运行结果产生k个簇,若是满足平方误差准则函数收敛则停止聚类。
(1)任意选择k个数据对象作为初始聚类中心。
(2)计算各个数据到所选出来的各个中心的距离,将数据对象指派到最近的簇中,然后计算每个簇的均值。
(3)根据簇中对象的平均值,将每个对象赋给最类似的簇。
(4)更新簇的平均值,即计算每个对象簇中对象的平均值。
(5)计算聚类准则函数E。
(6)直到准则函数E值不再进行变化。
整个数据处理和聚类分析流程如下图1所示。
四、算法实现
1.首先我们来看一下K-means算法的格式:
sklearn.cluster.KMeans(n_clusters,init,n_init,max_iter,tol,precompute_distances,verbose,random_state,copy_x,n_jobs,algorithm)n_clusters:
簇的个数,即聚成几类
init:
初始簇中心的获取方法(一般有K-means++,random,和PCA)n_init:
获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果
max_iter:
最大迭代次数(因为kmeans算法的实现需要迭代)
tol:
容忍度,即kmeans运行准则收敛的条件
precompute_distances:
是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True会把整个距离矩阵都放到内存中,auto会默认在数据样本大于featurs*samples的数量大于12e6的时候False,False时核心实现的方法是利用Cpython来实现的verbose:
冗长模式,反正一般不去改默认值random_state:
随机生成簇中心的状态条件copy_x:
对是否修改数据的一个标记,如果True,即复制了就不会修改数据。
bool在scikit-learn很多接口中都会有这个参数的,就是是否对输入数据继续copy操作,以便不修改用户的输入数据n_jobs:
并行设置
algorithm:
kmeans的实现算法,有:
‘auto',‘full,'其,中‘‘elfkual表ln示'用EM方式实现
2.首先我们先随机生成一个二维数组,进行一个简单的聚类分析。
fromsklearn.clusterimportKMeans
fromsklearn.externalsimportjoblib
fromsklearnimportcluster
importnumpyasnpimportmatplotlib.pyplotaspltdata=np.random.rand(100,2)#生成100*2的随机矩阵estimator=KMeans(n_clusters=3)#将形成的数据的聚类分为3类res=estimator.fit_predict(data)#fit_predict表示拟合+预测,也可以分开写lable_pred=estimator.labels_#预测类别标签结果centroids=estimator.cluster_centers_#各个类别的聚类中心值inertia=estimator.inertia_#聚类中心均值向量的总和
print(lable_pred)print(centroids)print(inertia)
foriinrange(len(data)):
#绘图,根据已经生成的label_pred,将相同类别的数据以同样的颜色画出来
ifint(lable_pred[i])==0:
plt.scatter(data[i][0],data[i][1],color='red')
ifint(lable_pred[i])==1:
plt.scatter(data[i][0],data[i][1],color='black')
ifint(lable_pred[i])==2:
plt.scatter(data[i][0],data[i][1],color='blue')
plt.show()
3.接下来我们进行更复杂一些的聚类分析。
fromtimeimporttimeimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportmetricsfromsklearn.clusterimportKMeansfromsklearn.datasetsimportload_digitsfromsklearn.decompositionimportPCAfromsklearn.preprocessingimportscale#导入模块np.random.seed(42)digits=load_digits()#导入数据集data=scale(digits.data)#scale函数是用来将数据标准化,它沿任意轴标准化数据集,使其以平均值为中心n_samples,n_features=data.shapen_digits=len(np.unique(digits.target))#统计没有重复的数字数目,输出为10labels=digits.target#数字真实标签samplesize=300
print("n_digits:
%d,\tn_samples%d,\tn_features%d"%(n_digits,n_samples,
n_features))
print(79*'_')
print('%9s'%'init''timeinertiahomocomplv-measARIAMIsilhouette')
K-means聚类的结果会随着制定类别数和初始点的选择有所不同。
我们这里总是聚成十类,因为手写数字一共有十种。
至于初始点的选取我们定义三种,k-means++,random,和PCA降到十个维度后的中心点。
#算法评估函数,包括处理时间、最终代价函数值、以及不同的聚类评价指标
defbench_k_means(estimator,name,data):
t0=time()
estimator.fit(data)#estimator.fit函数是将数据进行聚类
print('%9s%.2fs%i%.3f%.3f%.3f%.3f%.3f%.3f'%(name,(time()-t0),
estimator.inertia_,
metrics.homogeneity_score(labels,estimator.labels_),pleteness_score(labels,estimator.labels_),metrics.v_measure_score(labels,estimator.labels_),#同质性homogeneity:
每个群集只包含单个类的成员。
#完整性completeness:
给定类的所有成员都分配给同一个群集#Homogeneity和completeness表示簇的均一性和完整性。
V值是他们的调和平均,值越大,说明分类效果越好。
metrics.adjusted_rand_score(labels,estimator.labels_),
metrics.adjusted_mutual_info_score(labels,estimator.labels_),metrics.silhouette_score(data,estimator.labels_,
metric='euclidean',
sample_size=sample_size)))bench_k_means(KMeans(init='k-means++',n_clusters=n_digits,n_init=10),name="k-means++",data=data)#Kmeans++,随机初始化10次bench_k_means(KMeans(init='random',n_clusters=n_digits,n_init=10),name="random",data=data)
pca=PCA(n_components=n_digits).fit(data)#对数据进行降维处理bench_k_means(KMeans(init=ponents_,n_clusters=n_digits,n_init=1),name="PCA-based",data=data#)在PCA这种情况下,中心的种子是确定的,因此我们只用n_init=1运行算法一次
print(79*'_')
高维数据要经过PCA降维归一化后才可以进行分类,要不然欧几里得距离往往会变得膨胀,出现维度诅咒。
我们可以将原始数据用PCA降到两维,这样所有的数据就可以在二维空间中画出来。
然后我们再用降维后的只有两个特征的数据进行K-means分析,聚成十类,然后再画在Voronoidiagram图的背景上。
在PCA处理后的数据上进行可视化,在以上内容中是将数据从64降维10,再进行K-means聚类;接下来为方便可视化,将数据降到2维,进行聚类,可视化。
reduced_data=PCA(n_components=2).fit_transform(data)#fit_transform得到是用降维度处理后的数据
kmeans=KMeans(init='k-means++',n_clusters=n_digits,n_init=10)kmeans.fit(reduced_data)#对删减后的数据进行聚类
h=.02#定义网格步长
#定义边界坐标,定义网格坐标
x_min,x_max=reduced_data[:
0].min()+1,reduced_data[:
0].max()-1y_min,y_max=reduced_data[:
1].min()+1,reduced_data[:
1].max()-1xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))Z=kmeans.predict(np.c_[xx.ravel(),yy.ravel()])#用训练模型获得
网格预测每一点的类值
Z=Z.reshape(xx.shape)
plt.figure
(1)
plt.clf()
plt.imshow(Z,interpolation='nearest',extent=(xx.min(),xx.max(),yy.min(),yy.max()),
cmap=plt.cm.Paired,aspect='auto',origin='lower')
plt.plot(reduceddata[:
0],reduceddata[:
1],'k.',markersize=2)
centroids=kmeans.cluster_centers_
plt.scatter(centroids[:
0],centroids[:
1],marker='x',s=169,linewidths=3,color='w',zorder=10)
plt.title('K-meansclusteringonthedigitsdataset(PCA-reduceddata)\n''Centroidsaremarkedwithwhitecross')
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
plt.xticks(())
plt.yticks(())plt.show()
五、运行结果及意义说明
运行结果:
1.进行简单聚类分析的结果如下图2所示:
图2简单聚类分析结果图这样,我们就将这些随机生成的数据根据其数据特征,将相似的数据分为了三个类别,并将他们在图中表示出来。
2.进行更为复杂聚类分析的结果如下图3所示:
上述程序运行完就会出现这样的结果:
图3复杂聚类分析结果图
性能上:
Kmeans++>randomKmeans>PcaKmea,ns但差别不大。
时间上:
PcaKmeans处理时间远快于另两种算法。
并且降维度越低,处理速度越快,但代价函数会逐渐上升,因此寻找一个合适的处理的维度是关键。
3.降维后的可视化结果如下图4所示:
获得的视图如下:
图4降维可视化结果图
六、总结
K-means算法的优缺点。
K-means算法的优点是:
首先,算法能根据较少的已知聚类样本的类别对树进行剪枝确定部分样本的分类;其次,为克服少量样本聚类的不准确性,该算法本身具有优化迭代功能,在已经求得的聚类上再次进行迭代修正剪枝确定部分样本的聚类,优化了初始监督学习样本分类不合理的地方;第三,由于只是针对部分小样本,这样可以降低总的聚类时间复杂度。
K-means算法的缺点是:
首先,在K-means算法中K是事先给定的,这个K值的选定是非常难以估计的。
很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适;其次,在K-means算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。
这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果;最后,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。
K-meams算法的能够保证收敛,但不能保证收敛于全局最优点,当初始中心点选取不好时,只能达到局部最优点,整个聚类的效果也会比较差。
可以采用以下方法:
1)K-means中心点选择彼此距离尽可能远的那些点作为中心点;
2)先采用层次进行初步聚类输出K个簇,以簇的中心点的作为K-means的中心点的输入;
3)多次随机选择中心点训练K-means,选择效果最好的聚类结果。