机器学习基础练习题(4)聚类分析

作业题目

已知有20个样本,每个样本有2个特征,数据分布如下表所示,使用K均值法或K中心点法实现样本分离。要求:需要有结果展示,需要对方法和模型进行评价。
样本序号 1 2 3 4 5 6 7 8 9 10
特征1 0 1 0 1 2 1 2 3 6 7
特征2 0 0 1 1 1 2 2 2 6 6

样本序号 11 12 13 14 15 16 17 18 19 20
特征1 8 6 7 8 9 7 8 9 8 9
特征2 6 7 7 7 8 8 8 9 9 5

K均值原理

K-Means算法是一种无监督分类算法,假设有无标签数据集:
X = [ x ( 1 ) , x ( 2 ) , x ( 3 ) . . . x ( m ) ] T X=[x^{(1)},x^{(2)},x^{(3)}...x^{(m)}]^T X=[x(1),x(2),x(3)...x(m)]T
该算法的任务是将数据集聚类成k个簇, c = c 1 , c 2 , c 3 , … … , c k c=c_1,c_2,c_3,……,c_k c=c1,c2,c3,,ck.最小化损失函数为:
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − μ i ∣ ∣ 2 E=\sum_{i=1}^k\sum_{x\in{C_i}}||x-\mu_i||^2 E=i=1kxCixμi2
其中 μ i μ_i μi为簇 c i c_i ci的中心点:
μ i = 1 C i ∑ x ∈ C i x \mu_i=\frac{1}{C_i}\sum_{x\in{C_i}}x μi=Ci1xCix
要找到以上问题的最优解需要遍历所有可能的簇划分,K-Means算法使用贪心策略求得一个近似解,具体步骤如下:
1)随机选取k个点作为各个簇的中心点;
2)计算所有样本点与各个簇中心之间的距离,然后把样本点划入最近的簇中;
3)根据簇中已有的样本点,重新计算簇中心;
4)重复2、3。
在python机器学习库中有kmeans算法的函数,我们可以利用该函数完成相关聚类分析操作。

python编程

聚类分析

首先,调用KMeans.fit函数,对feature进行K均值分类,n_clusters为分类类数。
clf = KMeans(n_clusters=4).fit(feature)
之后利用Kmeans.fit_predict函数对feature按之前的中心点进行分类。
label = KMeans(n_clusters=4).fit_predict(feature)

模型评价

1)轮廓系数
from sklearn.metrics import silhouette_score
从sklearn.metrics中调用silhouette_score函数,可以利用轮廓系数评价分类体系,可以将轮廓系数与分类个数化为曲线,曲线斜率变化最大的地方,分类效果越好。
2)Calinski-Harabasz指数评价
from sklearn.metrics import calinski_harabasz_score
从sklearn.metrics中调用calinski_harabasz_score函数,该函数可以直接对聚类模型进行打分。

分类结果

首先,运行分类模型评价程序,决定数据类别个数。在轮廓系数评价体系下,画出曲线为:
在这里插入图片描述
可以发现在类别数较少的情况下曲线斜率更大,分类效果更好。在Calinski-Harabasz指数评价下:
在这里插入图片描述
由此可知,将数据分为两类时分类效果最好。
在未分类前,数据的散点示意图如图所示:
在这里插入图片描述
分为两类后,有:
在这里插入图片描述
画出聚类中心点位置:
在这里插入图片描述

python代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.metrics import calinski_harabasz_score

feature_1 = [0,1,0,1,2,1,2,3,6,7,8,6,7,8,9,7,8,9,8,9]
feature_2 = [0,0,1,1,1,2,2,2,6,6,6,7,7,7,8,8,8,9,9,5]

#plt.plot(feature_1,feature_2,'r*')
#plt.show()

feature = np.vstack((feature_1,feature_2))

print(feature)
feature = np.transpose(feature)

clf = KMeans(n_clusters=2).fit(feature)

print (clf.cluster_centers_)
print (clf.labels_)
print (clf.inertia_)

df = clf.cluster_centers_
label = KMeans(n_clusters=2).fit_predict(feature)
plt.scatter(feature[:,0],feature[:,1],c=label)
#plt.plot(df[0][0],df[0][1],'rD',df[1][0],df[1][1],'bD')
plt.show()

'''silhouettescore=[]
for i in range(2,10):
    kmeans=KMeans(n_clusters=i,random_state=123).fit(feature)
    score=silhouette_score(feature,kmeans.labels_)
    silhouettescore.append(score)
#plt.figure(figsize=(10,6))
plt.plot(range(2,10),silhouettescore,linewidth=1.5,linestyle='-')
plt.show()'''

'''for i in range(2,7):
    kmeans=KMeans(n_clusters=i,random_state=123).fit(feature)
    score=calinski_harabasz_score(feature,kmeans.labels_)
    print("聚类%d簇的calinski_harabaz分数为:%f" %(i,score))'''

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值