实验内容
利用 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()