第五章数据建模
(一)聚类分析
1,主要方法
2,距离分析
度量样本之间的相似性,采用距离算法:
文档相似性度量
3, k - means分类
# - * -编码:utf - 8 - * -
#使用k - means算法聚类消费行为特征数据
熊猫作为pd导入
#参数初始化
inputfile=? ./数据/consumption_data。xls”#销量及其他属性数据
outputfile=' . ./tmp/data_type。xls”#保存结果的文件名
k=3 #聚类的类别
=500 #迭代聚类最大循环次数
data=https://www.yisu.com/zixun/pd.read_excel (inputfile index_col=癐d”) #读取数据
data_zs=1.0 *(数据- data.mean ())/data.std() #数据标准化从sklearn
。集群进口KMeans
模型=KMeans (n_clusters=k, n_jobs=1, max_iter=迭代)#分为k类,并发数4
model.fit (data_zs) #开始聚类
#简单打印结果
r1=pd.Series (model.labels_) .value_counts() #统计各个类别的数目
r2=pd.DataFrame (model.cluster_centers_) #找出聚类中心
r=pd。concat (r2, r1,轴=1)#横向连接(0是纵向),得到聚类中心对应的类别下的数目
r。列=列表(data.columns) + (u '类别数目”】#重命名表头
打印(r)
#详细输出原始数据及其类别
r=pd。concat([数据,pd.Series(模型。labels_,指数=data.index)],
=1) #轴详细输出每个样本对应的类别
r。列=列表(data.columns) + (u的聚类类别”】#重命名表头
r.to_excel (outputfile) #保存结果
def density_plot(数据):#自定义作图函数
进口matplotlib。pyplot作为plt
plt.rcParams['字体。无衬线']=[' SimHei '] #用来正常显示中文标签
plt.rcParams['轴。unicode_minus ']=False #用来正常显示负号
p=数据。情节(类型=発de”,线宽=2,次要情节=True, sharex=False)
[p[我].set_ylabel (u的密度”),因为我在范围(k)
plt.legend ()
返回plt
pic_output=' . ./tmp/pd_’#概率密度图文件名前缀
我的范围(k):
density_plot(数据(r (u的聚类类别')==我]).savefig (u ' % s % s。png ' % (pic_output 我)
#利用TSNE绘图
# - * -编码:utf - 8 - * -
#接k_means。py sklearn
。廖进口TSNE
TSNE=TSNE ()
tsne.fit_transform (data_zs) #进行数据降维
TSNE=pd.DataFrame (TSNE。embedding_,指数=data_zs.index) #转换数据格式
进口matplotlib。pyplot作为plt
plt.rcParams['字体。无衬线']=[' SimHei '] #用来正常显示中文标签
plt.rcParams['轴。unicode_minus ']=False #用来正常显示负号
#不同类别用不同颜色和样式绘图
d=tsne [r (u的聚类类别')==0]
plt。情节(d [0], [1],“r”。)
d=tsne [r (u的聚类类别')==1]
plt。情节(d[0],[1],“去”)
d=tsne [r (u的聚类类别')==2]
plt。情节(d [0], [1], b *)
plt.show ()
聚类分析算法评价P111
(1)纯度评价法
(2)国际扶轮评价法
(3) F值评价法
4, Meanshift
与kmeans算法不同,意味着转变 算法可自动决定类别的数目。与kmeans算法一样的是,两者都是用集合内数据点的均值进行中心点的移动。
算法核心:算法的关键操作是通过感兴趣区域内的数据密度变化计算中心点的漂移向量,从而移动中心点进行下一次迭代,直到到达密度最大处(中心点不变)。从每个数据点出发都可以进行该操作,在这个过程,统计出现在感兴趣区域内的数据的次数。该参数将在最后作为分类的依据。
的意思是转变算法中,带宽(带宽)是重要参数。
案例人工智能与python (mean_shift.py)
进口numpy np
进口matplotlib。pyplot plt
从sklearn。集群进口MeanShift estimate_bandwidth
出现从itertools进口周期
#加载数据从输入文件
X=np.loadtxt (“. .//data_clustering代码。txt”,分隔符=',')
#估计带宽X
bandwidth_X=estimate_bandwidth (X,分位数=0.1,n_samples=len (X))
#集群数据与MeanShift
meanshift_model=MeanShift(带宽=bandwidth_X bin_seeding=True)
meanshift_model.fit (X)
#提取中心集群
cluster_centers=meanshift_model。cluster_centers_
打印(‘\ nCenters集群:\ n’, cluster_centers)
#估计集群的数量
=meanshift_model标签。labels_
num_clusters=len (np.unique(标签))
打印(" \ nNumber集群的输入数据=" https://www.yisu.com/zixun/num_clusters)
#情节点和集群中心
plt.figure ()
标记=皁 *十五”
我,在zip标记(范围(num_clusters),标记):
#情节点属于当前集群