python计算夹角余弦距离
时间: 2023-10-25 22:14:05 浏览: 51
以下是Python实现夹角余弦距离的代码:
```python
import math
# 定义两个向量
vector1 = [1, 2, 3]
vector2 = [4, 5, 6]
# 计算向量长度
def vector_length(vector):
return math.sqrt(sum([x**2 for x in vector]))
# 计算向量点积
def dot_product(vector1, vector2):
return sum([vector1[i]*vector2[i] for i in range(len(vector1))])
# 计算夹角余弦距离
def cos_distance(vector1, vector2):
dot = dot_product(vector1, vector2)
len1 = vector_length(vector1)
len2 = vector_length(vector2)
return dot / (len1 * len2)
# 输出结果
print(cos_distance(vector1, vector2))
```
输出结果为:
```
0.9746318461970762
```
即向量1和向量2的夹角余弦距离为0.9746。
相关问题
python计算余弦夹角距离
以下是Python代码,用于计算两个向量之间的余弦夹角距离:
```
import numpy as np
def cosine_distance(v1, v2):
dot_product = np.dot(v1, v2)
norm_v1 = np.linalg.norm(v1)
norm_v2 = np.linalg.norm(v2)
return dot_product / (norm_v1 * norm_v2)
```
其中,v1和v2是两个向量,可以是列表、数组或其他可迭代的对象。np.dot(v1, v2)计算两个向量的点积,np.linalg.norm(v)计算向量v的范数(长度)。最后返回的是余弦夹角距离,值域为[-1, 1]。值越接近1,则两个向量越相似;值越接近-1,则两个向量越不相似。
手动实现k-means聚类使用夹角余弦
以下是使用夹角余弦手动实现k-means聚类的Python代码:
```python
import numpy as np
class KMeans:
def __init__(self, k, cos_sim=False, max_iter=100):
self.k = k
self.max_iter = max_iter
self.cos_sim = cos_sim
def fit(self, X):
self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]
for i in range(self.max_iter):
distances = self._get_distances(X)
labels = np.argmin(distances, axis=1)
new_centroids = np.array([X[labels == j].mean(axis=0) for j in range(self.k)])
if np.allclose(new_centroids, self.centroids):
break
self.centroids = new_centroids
self.labels_ = labels
self.inertia_ = np.sum(np.min(distances, axis=1))
def _get_distances(self, X):
if self.cos_sim:
X_norm = np.linalg.norm(X, axis=1)
centroids_norm = np.linalg.norm(self.centroids, axis=1)
dot_product = X @ self.centroids.T
distances = 1 - dot_product / (X_norm.reshape(-1, 1) * centroids_norm)
else:
distances = np.sqrt(((X - self.centroids[:, np.newaxis]) ** 2).sum(axis=2))
return distances
```
其中,`k`为聚类个数,`cos_sim`表示是否使用夹角余弦距离,`max_iter`表示最大迭代次数。`fit`方法进行聚类,`X`为数据集,返回`labels_`为每个样本的聚类标签,`inertia_`为聚类内的平方和距离。
`_get_distances`方法计算样本到聚类中心的距离,如果使用夹角余弦距离,则先进行归一化处理,然后计算点积,最后用1减去余弦相似度即可。否则使用欧式距离计算距离。
阅读全文