智能感知实验三:聚类方法在测试数据处理中的应用

实验内容

利用 Iris 数据集设计至少三种聚类模型对数据集进行聚类分析,聚类数为 3。
要求:
1、利用常用性能度量方法评价聚类效果,性能度量指标不少于 4 个。
2、评价不同聚类方法对模型聚类结果的影响。

from sklearn.cluster import * 
import pandas as pd 
import numpy as np 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import * 
 
data=pd.read_csv(open('iris.csv',encoding='utf-8')) 
data['classes'] = data['classes'].apply(lambda x:0 if x=="Iris-setosa" else x) 
data['classes'] = data['classes'].apply(lambda x:1 if x=="Iris-versicolor" else x) 
data['classes'] = data['classes'].apply(lambda x:2 if x=="Iris-virginica" else x) 
 
y=data['classes'].values 
col=data.iloc[:,0:4] 
X=col.values 
X = 1.0*(X - X.mean())/X.std() 
### K-means 
kmeans = KMeans(n_clusters=3, random_state=0).fit(X) 
y_pre = kmeans.labels_ 
print(y_pre) 
print(y) 
print(kmeans.cluster_centers_) 
#外部指标:jaccard 系数,FM 指数,rand 指数 
print('Jaccard 系数:',jaccard_score(y, y_pre,average='weighted') ) 
print('FM 指数:',fowlkes_mallows_score(y, y_pre) ) 
print('Rand 指数:',rand_score(y, y_pre) ) 
#内部指标:DB 指数,轮廓系数,CH 指数 
print('DB 指数:',davies_bouldin_score(X, y_pre) ) 
print('轮廓系数:',silhouette_score(X, y_pre) ) 
print('CH 指数',calinski_harabasz_score(X, y_pre) ) 
output_data = pd.concat([data, pd.Series(kmeans.labels_, index=data.index)], axis=1) # 详
细输出每个样本对应的类别 
output_data.columns = list(data.columns) + ['Type'] 
from sklearn.manifold import TSNE 
tsne = TSNE() 
tsne.fit_transform(data) # 进行数据降维 
# tsne.embedding_可以获得降维后的数据 
# print('tsne.embedding_: \n', tsne.embedding_) 
tsn = pd.DataFrame(tsne.embedding_, index=data.index) # 转换数据格式 
# print('tsne: \n', tsne) 
 
import matplotlib.pyplot as plt 
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 
 
# 不同类别用不同颜色和样式绘图 
color_style = ['r.', 'go', 'b*'] 
for i in range(3): 
 d = tsn[output_data[u'Type'] == i] 
 # dataframe 格式的数据经过切片之后可以通过 d[i]来得到第 i 列数据 
 plt.plot(d[0], d[1], color_style[i], label='Type' + str(i+1)) 
plt.legend() 
plt.show() 
### 层次聚类 
clustering = AgglomerativeClustering(n_clusters=3).fit(X) 
y_pre=clustering.labels_ 
print(y_pre) 
print(y) 
#外部指标:jaccard 系数,FM 指数,rand 指数 
print('Jaccard 系数:',jaccard_score(y, y_pre,average='weighted') ) 
print('FM 指数:',fowlkes_mallows_score(y, y_pre) ) 
print('Rand 指数:',rand_score(y, y_pre) ) 
#内部指标:DB 指数,轮廓系数,CH 指数 
print('DB 指数:',davies_bouldin_score(X, y_pre) ) 
print('轮廓系数:',silhouette_score(X, y_pre) ) 
print('CH 指数',calinski_harabasz_score(X, y_pre) ) 
output_data = pd.concat([data, pd.Series(clustering.labels_, index=data.index)], axis=1) # 
详细输出每个样本对应的类别 
output_data.columns = list(data.columns) + ['Type'] 
from sklearn.manifold import TSNE 
tsne = TSNE() 
tsne.fit_transform(data) # 进行数据降维 
# tsne.embedding_可以获得降维后的数据 
# print('tsne.embedding_: \n', tsne.embedding_) 
tsn = pd.DataFrame(tsne.embedding_, index=data.index) # 转换数据格式 
# print('tsne: \n', tsne) 
 
import matplotlib.pyplot as plt 
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 
 
# 不同类别用不同颜色和样式绘图 
color_style = ['r.', 'go', 'b*'] 
for i in range(3): 
 d = tsn[output_data[u'Type'] == i] 
 # dataframe 格式的数据经过切片之后可以通过 d[i]来得到第 i 列数据 
 plt.plot(d[0], d[1], color_style[i], label='Type' + str(i+1)) 
plt.legend() 
plt.show() 
### DBSCAN 
clustering = DBSCAN(eps=0.2, min_samples=5).fit(X) 
y_pre=clustering.labels_ 
#外部指标:jaccard 系数,FM 指数,rand 指数 
print('Jaccard 系数:',jaccard_score(y, y_pre,average='weighted') ) 
print('FM 指数:',fowlkes_mallows_score(y, y_pre) ) 
print('Rand 指数:',rand_score(y, y_pre) ) 
#内部指标:DB 指数,轮廓系数,CH 指数 
print('DB 指数:',davies_bouldin_score(X, y_pre) ) 
print('轮廓系数:',silhouette_score(X, y_pre) ) 
print('CH 指数',calinski_harabasz_score(X, y_pre) ) 
output_data = pd.concat([data, pd.Series(clustering.labels_, index=data.index)], axis=1) # 
详细输出每个样本对应的类别 
output_data.columns = list(data.columns) + ['Type'] 
from sklearn.manifold import TSNE 
tsne = TSNE() 
tsne.fit_transform(data) # 进行数据降维 
# tsne.embedding_可以获得降维后的数据 
# print('tsne.embedding_: \n', tsne.embedding_) 
tsn = pd.DataFrame(tsne.embedding_, index=data.index) # 转换数据格式 
# print('tsne: \n', tsne) 
 
import matplotlib.pyplot as plt 
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 
 
# 不同类别用不同颜色和样式绘图 
color_style = ['r.', 'go', 'b*'] 
for i in range(3): 
 d = tsn[output_data[u'Type'] == i] 
 # dataframe 格式的数据经过切片之后可以通过 d[i]来得到第 i 列数据 
 plt.plot(d[0], d[1], color_style[i], label='Type' + str(i+1)) 
plt.legend() 
plt.show()
上一篇:第4期:自训 2022/1/12


下一篇:HP LaserJet Pro M126a MFP打印机安装体验