在Python中优化集群
我为我的问题编写了自己的聚类算法(我知道这很糟糕)。它工作得很好,但可以工作得更快 算法将值列表(1D)作为输入,其工作原理如下:在Python中优化集群,python,optimization,scipy,cluster-analysis,Python,Optimization,Scipy,Cluster Analysis,我为我的问题编写了自己的聚类算法(我知道这很糟糕)。它工作得很好,但可以工作得更快 算法将值列表(1D)作为输入,其工作原理如下: 对于每个簇,计算到最近邻居簇的距离 选择与邻居B距离最小的群集A 如果A和B之间的距离小于阈值,返回 结合A和B 转到1 我可能在这里重新发明了一个轮子 这是我的暴力foce代码,如何让它更快?我已经安装了Scipy和Numpy,如果有现成的东西的话 #cluster center as simple average value def cluster_center
#cluster center as simple average value
def cluster_center(cluster):
return sum(cluster) / len(cluster)
#Distance between clusters
def cluster_distance(a, b):
return abs(cluster_center(a) - cluster_center(b))
while True:
cluster_distances = []
#If nothing to cluster, ready
if len(clusters) < 2:
break
#Go thru all clusters, calculate shortest distance to neighbor
for cluster in clusters:
cluster_distances.append((cluster, sorted([(cluster_distance(cluster, c), c) for c in clusters if c != cluster])[0]))
#Find out closest pair
cluster_distances.sort(cmp=lambda a,b:cmp(a[1], b[1]))
#Check if distance is under threshold 15
if cluster_distances[0][1][0] < 15:
a = cluster_distances[0][0]
b = cluster_distances[0][1][1]
#Combine clusters (combine lists)
a.extend(b)
#Form a new cluster list
clusters = [c[0] for c in cluster_distances if c[0] != b]
else:
break
#群集中心作为简单平均值
def集群_中心(集群):
返回和(群集)/len(群集)
#簇间距离
def集群_距离(a、b):
返回abs(仪表盘中心(a)-仪表盘中心(b))
尽管如此:
群集距离=[]
#如果没有要群集的内容,请准备就绪
如果len(簇)<2:
打破
#遍历所有簇,计算到邻居的最短距离
对于集群中的集群:
cluster_distance.append((cluster,sorted([(cluster_distance(cluster,c),c)表示集群中的c,如果c!=cluster])[0]))
#找出最接近的一对
聚类距离排序(cmp=lambda,b:cmp(a[1],b[1]))
#检查距离是否低于阈值15
如果群集距离[0][1][0]<15:
a=群集距离[0][0]
b=群集距离[0][1][1]
#合并簇(合并列表)
a、 延长(b)
#形成一个新的集群列表
集群=[c[0]对于集群距离中的c,如果c[0]!=b]
其他:
打破
通常,术语“聚类分析”仅用于多变量分区。因为在1d中,您实际上可以对数据进行排序,这样可以更轻松地解决这些问题
因此,为了加快处理速度,对数据进行排序!然后重新考虑你需要做什么
至于一种更高级的方法:进行核密度估计,并寻找局部极小值作为分割点。我不知道从哪里开始,但幸运的是,其他人可能会这样做:K-means聚类需要知道聚类的数量,而使用scipy cluster,我不知道从哪里开始:)你重新发明了凝聚聚类吗?看一看:是的,数据已排序。你能解释一下什么是“内核密度估计”吗?在你最喜欢的数学/统计书中查找。或者维基百科。