K-means聚类分析(加权因子)应用小结

1.scipy.cluster.vp的kmeans中第三个参数为迭代次数,默认为20,若数据量较大,建议增加次参数,第四个参数为终止阈值,默认1e-5,可根据需要进行修改,若希望以迭代次数为准,可不修改此值,因为1e-5对于大量数据来说,已经很小很小了。

2.针对多因子多量纲的K均值聚类,kmeans之前一定要先归一化数据,多量纲归一化。

3.若要针对每个因子分配权值,可在归一化后的数据上进行权值调整。

4.kmeans的返回值是个数组,0维代表分类后的编号标签,1维代表观测值与质心之间的距离,越小越接近质心。故考察结果的好坏可以通过类内因子间的欧式距离或者测值与质心之间的距离的平均值来考察。

废话不多说,自行看示例代码吧,已经注释的很详细了,至于缺少Python包的,自行百度安装吧。


# -*- coding: utf-8 -*- 
#导入相应的包
import scipy
import scipy.cluster.hierarchy as sch
from scipy.cluster.vq import vq,kmeans,whiten
import numpy as np
import matplotlib.pylab as plt
import time


#待聚类的数据点,cancer.csv有653行数据,每行数据有11维: 
dataset = np.loadtxt('TriplexSidewall7.csv', delimiter=",",dtype=np.float)
#np数据从0开始计算,第0维维序号排除,第9维为标签排除,所以为1到8
points = dataset[:,1:8]
cancer_label = dataset[:,8]
print("points:\n",points)
print("cancer_label:\n",cancer_label)
# k-means聚类
#将原始数据做归一化处理
data=whiten(points) #https://blog.csdn.net/qq_41658437/article/details/105634446
print("data-one:\n",data)
data = data*[0.52,0.08,0.08,0.08,0.08,0.08,0.08]#归一化后数据加权
print("data-one:\n",data)
#使用kmeans函数进行聚类,输入第一维为数据,第二维为聚类个数k.
#有些时候我们可能不知道最终究竟聚成多少类,一个办法是用层次聚类的结果进行初始化.当然也可以直接输入某个数值. 
#k-means最后输出的结果其实是两维的,第一维是聚类中心,第二维是损失distortion,我们在这里只取第一维,所以最后有个[0]
#centroid = kmeans(data,max(cluster))[0]
print (time.strftime('%H:%M:%S',time.localtime(time.time())))
centroid = kmeans(data,290,100000)[0]#10W次迭代
print (time.strftime('%H:%M:%S',time.localtime(time.time())))
print ("centroid:\n",centroid)
#使用vq函数根据聚类中心对所有数据进行分类,vq的输出也是两维的,[0]表示的是所有数据的label
label=vq(data,centroid)[0] #类编号
dist=vq(data,centroid)[1] #类观测值与其最接近的质心之间的失真(距离)
num = [0,0]
for i in label:
    if(i == 0):
        num[0] = num[0] + 1
    else:
        num[1] = num[1] + 1
print ('num =',num)
np.savetxt('file.csv',label)#输出观测值分类后对应的编号
np.savetxt('filedist.csv',dist)#输出观测值其最接近的质心之间的失真(距离)
print("Final clustering by k-means:\n",label)
result = np.subtract(label,cancer_label)
print ("result:\n",result)

count = [0,0]
for i in result:
    if(i == 0):
        count[0] = count[0] + 1
    else:
        count[1] = count[1] + 1
print(count)
print (float(count[1])/(count[0]+count[1]))

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D_ZSX

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值