此为实验作业。
实验内容见教材(《Python数据分析与挖掘实战》张良均等著(第一版,白色封面的那版))Page 178的实验一及实验二。
实验一代码,可以直接运行
#-*- coding: utf-8 -*-
#标准差标准化
import pandas as pd
datafile = 'zscoredata.xls' #需要进行标准化的数据文件;
zscoredfile = 'zscoreddata.xls' #标准差化后的数据存储路径文件;
#标准化处理
data = pd.read_excel(datafile)
data = (data - data.mean(axis = 0))/(data.std(axis = 0)) #简洁的语句实现了标准化变换,类似地可以实现任何想要的变换。
data.columns=['Z'+i for i in data.columns] #表头重命名。
data.to_excel(zscoredfile, index = False) #数据写入
结果截图如下:
实验二代码:
#-*- coding: utf-8 -*-
#K-Means聚类算法
import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法
inputfile = 'zscoreddata.xls' #待聚类的数据文件
k = 5 #需要进行的聚类类别数
#读取数据并进行聚类分析
data = pd.read_excel(inputfile) #读取数据
#调用k-means算法,进行聚类分析
kmodel = KMeans(n_clusters = k)
kmodel.fit(data) #训练模型
kmodel.cluster_centers_ #查看聚类中心
kmodel.labels_ #查看各样本对应的类别
#-*- coding: utf-8 -*-
#画出特征雷达图,代码接KMeans_cluster.py
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
labels = data.columns #标签
labels = labels.append(pd.Index([data.columns[0]])) #添加多 第一个标签
k = 5 #数据个数
plot_data = kmodel.cluster_centers_
color = ['b', 'g', 'r', 'c', 'y'] #指定颜色
angles = np.linspace(0, 2*np.pi, k, endpoint=False)
plot_data = np.concatenate((plot_data, plot_data[:,[0]]), axis=1) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
fig = plt.figure()
ax = fig.add_subplot(111, polar=True) #polar参数!!
for i in range(len(plot_data)):
ax.plot(angles, plot_data[i], 'o-', color = color[i], label = u'客户群'+str(i), linewidth=2)# 画线
ax.set_rgrids(np.arange(0.01, 3.5, 0.5), np.arange(-1, 2.5, 0.5), fontproperties="SimHei")
ax.set_thetagrids(angles * 180/np.pi, labels)
plt.legend(loc = 4)
plt.title('客户聚类中心向量')
plt.show()
这里要注意,要加多一句:
labels = labels.append(pd.Index([data.columns[0]])) #添加多 第一个标签
否则会出现这个错误:
ValueError: The number of FixedLocator locations(6), usually from a call to set_ticks, does not match the number of ticklabels(5).
原理参考合工大----python实验作业3----matplotlib踩坑记录----set_thetagrids()_图南zzz的博客-CSDN博客
通过:
print(type(data.columns))
print(type(data.columns[0]))可以知道它们的类型
其中data.columns为'pandas.core.indexes.base.Index'类型,
data.columns[0]为str类型。
直接插入会出错,所以要利用pd.Index([data.columns[0]]将str转换为index类型,其中的中括号[]为点睛之笔,不加则会报错。
o(╥﹏╥)o
实验结果截图如下:
因为插入数据关乎到各种类型转换(Index)什么的,转换起来还是比较复杂的,我感觉这也是python的痛处。希望对各位有所帮助。