加速/提高亲和矩阵创建的性能

问题描述

这是关于加速我的代码... 我也对更多的“pythonic”编码感兴趣。 希望你能帮我解决这个问题?!

我想我一步一步告诉你:

数据描述:每个样本最多可以有 n 个子集。它们都可以用 m 个特征来描述(例如:特征 1 和特征 2 是标量,特征 3 是类别列表(名义))。

示例数据:

feature1 = [[553.7,0.0,],[545.7,0.0],[225.6,33.4,875.7]]
feature2 = [[35.7,[12.7,[26.7,15.4,9.9]]
feature3 = [[[30102],[0],[0]],[[30102,30111],[[30102],[30111,30129],[30104]]]
df = pd.DataFrame({'feature1': feature1,'feature2': feature2,'feature3': feature3,})

目标:寻找相似样本(将一个样本的所有子集与下一个样本的所有子集进行比较:标量特征的差异很小(阈值 20%)和出现在名义特征中的相同类别 -> 相似子集。如果子集相似 ->样本相似度是特征1的子集比例(见下面的函数))->亲和矩阵作为最终结果

应该完成工作的亲和函数(确实可以,但看起来很糟糕而且很慢):

def affinity(X,Y):
    cluster_affinity = []

    for k in range(max(np.count_nonzero(np.array(X[0])>0),np.count_nonzero(np.array(X[0])>0))): #check all subset where feature1 is not 0 (reduces number of loops)
        index_of_similar_values_from_Y = []
        for l in range(len(X)):
            if type(X[l][k]) != list:
                #keep the index (number of the subset) that is similar to coresponding subset (X[l][k]):
                similar_value_from_Y = [val for val in Y[l] if abs(val - X[l][k]) < X[l][k]*0.2]
                if len(similar_value_from_Y) > 0:
                    index_of_similar_values_from_Y.append(Y[l].index(similar_value_from_Y[0]))
                else: 
                    index_of_similar_values_from_Y.append(999)
                    break
            else:
                #keep the index (number of the subset) that is similar to coresponding subset (X[l][k]) if nominal data:
                similar_value_from_Y = [val for val in Y[l] if val == X[l][k]]
                if len(similar_value_from_Y) == 1:
                    index_of_similar_values_from_Y.append(Y[l].index(similar_value_from_Y[0]))
                else: 
                    index_of_similar_values_from_Y.append(999)
                    break
                
        if (len(np.unique(index_of_similar_values_from_Y)) == 1) and (np.unique(index_of_similar_values_from_Y) != 999):
            #wighten the subset similarity by the proportion of feature from the whole sample:
            cluster_affinity.append( (min(X[0][k],Y[0][index_of_similar_values_from_Y[0]])/sum(X[0])) * (min(X[0][k],Y[0][index_of_similar_values_from_Y[0]])/sum(Y[0])) )
        else:
            cluster_affinity.append(0)
    return sum(cluster_affinity)

最后创建了亲和矩阵:

affinity_matrix = pd.DataFrame(squareform(pdist(pandas,lambda u,v: affinity(u,v))),index=pandas.index,columns=pandas.index)
                                                
np.fill_diagonal(affinity_matrix.values,1) 

由于 50000 个有效样本最多包含 9 个子集(我很高兴拥有这些),因此使用原始数据运行代码需要 48 小时。我尝试了多处理,但无法创建任何工作代码

在哪里以及如何实现异步?还有其他想法可以加快这一切吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)