我是靠谱客的博主 诚心香菇,最近开发中收集的这篇文章主要介绍机器学习基础练习题(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}^ksum_{xin{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_{xin{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))'''

最后

以上就是诚心香菇为你收集整理的机器学习基础练习题(4)聚类分析作业题目的全部内容,希望文章能够帮你解决机器学习基础练习题(4)聚类分析作业题目所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部