#coding: utf-8
'''
用stlearn库中KMeans算法对iris数据集进行聚类操作
数据预处理:normalize
'''
from collections import Counter
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import preprocessing
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from sklearn import metrics
#########################################################################################
# 第一步 参数设置
#数据文件路径
filePath='iris_all.csv'
#簇的个数
k=3
#初始点选取方式
initType='random'
#最大迭代次数
max_iter=300
#最小平方误差
min_sse=0.0001
#########################################################################################
# 第二步 数据预处理
irisDF=pd.read_csv(filePath)
#print irisDF['id']
#真实数据标签
label=list(irisDF['id'])
#print label
irisDDF=irisDF.drop(['species','id'],axis=1)
#print irisDDF
#数据预处理-正则化
#irisDDFL=preprocessing.normalize(irisDDF)
#数据预处理-标准化
#irisDDFL=preprocessing.scale(irisDDF)
#print irisDDFL
#########################################################################################
# 第三步 聚类
#kmeans聚类
n_clusters=3
irisKmeans=KMeans(n_clusters=k,init=initType,max_iter=max_iter,tol=min_sse)
predicted=irisKmeans.fit_predict(irisDDF)
#########################################################################################
# 第四步 聚类评估
#转化结果和标记成列表
label_true=irisDF['id'].tolist()
label_pred=predicted.tolist()
counter=Counter(label_pred)
print 'labels_stastics:',counter
print irisKmeans.labels_
# 计算可调整兰德指数
print '调整兰德指数:', metrics.adjusted_rand_score(label_pred, label_true)
# 计算调整的互信息评分
print '归一化互信息评分:', metrics.normalized_mutual_info_score(irisKmeans.labels_, label_true)
# 计算所有样本的轮廓系数
#print '所有样本的轮廓系数:\n',metrics.silhouette_samples(irisDDF,irisKmeans.labels_,metric='euclidean')
#计算所有样本的轮廓系数的平均值
print '所有样本的轮廓系数的平均值:', metrics.silhouette_score(irisDDF,irisKmeans.labels_,metric='euclidean')
#########################################################################################
# 第五步 图形输出 降维
# 降维
pca = PCA(n_components=2)
newData = pca.fit_transform(irisDDF)
# 设定每个点的颜色和形状
lableD = []
for i in range(0, 150):
if i < 50:
lableD.append('o')
elif i >= 50 and i < 100:
lableD.append('p')
else:
lableD.append('s')
for i in range(0, 150):
if label_pred[i] == 0:
lableD[i] = lableD[i] + ('r')
elif label_pred[i] == 1:
lableD[i] = lableD[i] + ('y')
else:
lableD[i] = lableD[i] + ('k')
# print lableD
for i in range(0, 150):
plt.plot(newData[i][0], newData[i][1], lableD[i])
plt.show()