问题描述
这是关于加速我的代码... 我也对更多的“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 (将#修改为@)