python随机分组的思路_python – 对对象进行分组以实现所有组的类似平均属性

您可以尝试使用k-means clustering:

import scipy.cluster.vq as vq

import collections

import numpy as np

def auto_cluster(data,threshold=0.1,k=1):

# There are more sophisticated ways of determining k

# See http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set

data=np.asarray(data)

distortion=1e20

while distortion>threshold:

codebook,distortion=vq.kmeans(data,k)

k+=1

code,dist=vq.vq(data,codebook)

groups=collections.defaultdict(list)

for index,datum in zip(code,data):

groups[index].append(datum)

return groups

np.random.seed(784789)

N=20

weights=100*np.random.random(N)

groups=auto_cluster(weights,threshold=1.5,k=N//5)

for index,data in enumerate(sorted(groups.values(),key=lambda d: np.mean(d))):

print('{i}: {d}'.format(i=index,d=data))

上面的代码生成N个权重的随机序列.

它使用scipy.cluster.vq.kmeans将序列划分为k个数组,这些数字靠得很近.如果失真高于阈值,则重新计算kmeans,k增加.这种情况一直重复,直到失真低于给定的阈值.

它产生如下集群:

0: [4.9062151907551366]

1: [13.545565038022112,12.283828883935065]

2: [17.395300245930066]

3: [28.982058040201832,30.032607500871023,31.484125759701588]

4: [35.449637591061979]

5: [43.239840915978043,48.079844689518424,40.216494950261506]

6: [52.123246083619755,53.895726546070463]

7: [80.556052179748079,80.925071671718413,75.211470587171803]

8: [86.443868931310249,82.474064251040375,84.088655128258964]

9: [93.525705849369416]

注意,k均值聚类算法使用随机猜测来初始选择k个组的中心.这意味着重复运行相同的代码可以产生不同的结果,特别是如果权重不将它们分成明显不同的组.

您还必须旋转阈值参数以生成所需数量的组.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值