java余弦距离_使用TensorFlow实现余弦距离/欧氏距离(Euclideandistance)以及Attention矩阵的计算...

本文介绍了如何在TensorFlow中计算余弦距离、欧氏距离以及构造Attention矩阵。通过示例展示了计算两个句子中对应单词之间距离的方法,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

最近在使用tensorflow完成句子相似度建模等任务时常常会用到各种距离的计算,而且有很多论文提出了Attention机制,所以这里就介绍一下如何使用tensorflow实现上述各种功能。

这里首先假定我们的输入是两个四维的Tensor,然后我们需要计算的是其中某个维度的距离。比如说我们的输入是batch个句子,句长是sent_len, 每个词被表示成embed_size的词向量。所以我们的输入就是一个[batch_size, sent_len, embed_size, 1]的Tensor,需要计算的就是两个句子的Attention矩阵。Aij表示句子1中第i个单词和句子2中第j个单词的距离(余弦距离,欧氏距离,L1距离等),也就是计算两个长度为embed_size的向量之间的距离。

为了方便表示和调试,我们这里使用shape为[2,3,4,1]的Tensor来表示上述句子。

1,Euclidean distance

欧氏距离很简单,以向量为例(x1, x2, x3,….,xn),(y1, y2, y3,….,yn),那么其欧氏距离的计算公式如下图所示:

fefb002c01c1d418a8bd4e7318644b3a.png

在tensorflow中如何实现呢,代码如下:

import tensorflow as tf

x3 = tf.constant([[[[1], [2], [3], [4]],

[[5], [6], [7], [8]],<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现k-means算法,其中包括欧氏距离、曼哈顿距离和夹角余弦距离实现: ```python import numpy as np import math # 欧氏距离 def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2)**2)) # 曼哈顿距离 def manhattan_distance(x1, x2): return np.sum(np.abs(x1 - x2)) # 夹角余弦距离 def cosine_distance(x1, x2): dot_product = np.dot(x1, x2) norm_x1 = np.linalg.norm(x1) norm_x2 = np.linalg.norm(x2) return 1 - dot_product / (norm_x1 * norm_x2) class KMeans: def __init__(self, k=3, max_iters=100, distance="euclidean"): self.k = k self.max_iters = max_iters self.distance = distance def initialize_centroids(self, X): n_samples, n_features = X.shape centroids = np.zeros((self.k, n_features)) for i in range(self.k): centroid = X[np.random.choice(range(n_samples))] centroids[i] = centroid return centroids def closest_centroid(self, sample, centroids): distances = np.zeros(self.k) for i, centroid in enumerate(centroids): if self.distance == "euclidean": distances[i] = euclidean_distance(sample, centroid) elif self.distance == "manhattan": distances[i] = manhattan_distance(sample, centroid) else: distances[i] = cosine_distance(sample, centroid) closest_index = np.argmin(distances) return closest_index def create_clusters(self, X, centroids): clusters = [[] for _ in range(self.k)] for sample_i, sample in enumerate(X): centroid_i = self.closest_centroid(sample, centroids) clusters[centroid_i].append(sample_i) return clusters def calculate_centroids(self, X, clusters): n_features = X.shape[1] centroids = np.zeros((self.k, n_features)) for i, cluster in enumerate(clusters): centroid = np.mean(X[cluster], axis=0) centroids[i] = centroid return centroids def get_cluster_labels(self, clusters, X): y_pred = np.zeros(X.shape[0]) for cluster_i, cluster in enumerate(clusters): for sample_i in cluster: y_pred[sample_i] = cluster_i return y_pred def predict(self, X): centroids = self.initialize_centroids(X) for _ in range(self.max_iters): clusters = self.create_clusters(X, centroids) prev_centroids = centroids centroids = self.calculate_centroids(X, clusters) if np.all(centroids == prev_centroids): break return self.get_cluster_labels(clusters, X) ``` 使用示例: ```python from sklearn.datasets import make_blobs import matplotlib.pyplot as plt X, y = make_blobs(centers=3, n_samples=500, random_state=1) kmeans = KMeans(k=3, max_iters=100, distance="euclidean") y_pred = kmeans.predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.title("K-Means Clustering") plt.show() ``` 其中,distance参数可以设置为"euclidean"、"manhattan"或者"cosine",表示使用欧氏距离、曼哈顿距离或夹角余弦距离
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值