一种解决办法:
UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U32'), dtype('<U32')) -> dtype('<U32')
问题
初步探索: 参考网上文章,dtype(’<U32’)代表字符串,不能乘法计算,要转换类型为 int/float
而具体到本文:使用 sklearn:tsne 进行学习,采用 metric=‘precomputed’,报错栈如下:
embedded = tsne.fit_transform(square_dis_mat)
# ...
xx\sklearn\manifold\_t_sne.py in _gradient_descent(objective, ...)
370 np.clip(gains, min_gain, np.inf, out=gains)
371 grad *= gains
--> 372 update = momentum * update - learning_rate * grad
373 p += update
UFuncTypeError: ufunc 'multiply' did not contain a loop with signature
matching types (dtype('<U32'), dtype('<U32')) -> dtype('<U32')
可以看到是 迭代更新 时报的错,而输入的距离矩阵 square_dis_mat 是没问题的,
所以怀疑是 tsne学习器 的参数有问题
解决
去掉sklearn的 learning_rate=‘auto’,用默认学习策略,就好了 😠
即由:
embedded = manifold.TSNE(n_components=2,
metric='precomputed', learning_rate='auto'
init="random", random_state=0, square_distances=True,
perplexity=100).fit_transform(square_dis_mat)
改成:
embedded = manifold.TSNE(n_components=2,
metric='precomputed',
init="random", random_state=0, square_distances=True,
perplexity=100).fit_transform(square_dis_mat)