# k-means 算法的支持函数:球面距离计算(补全代码) """ Parameters: vecA - 点A向量 vecB - 点B向量 Returns: 球面距离 """ #d = R * arccos(sin(纬度1) * sin(纬度2) + cos(经度1) * cos(经度2) * cos(经度2 - 经度1)) #R=6371(地球半径) def distSLC(vecA, vecB):
时间: 2024-03-11 12:50:31 浏览: 12
```python
import numpy as np
def distSLC(vecA, vecB):
a = np.sin(vecA[1] * np.pi / 180) * np.sin(vecB[1] * np.pi / 180)
b = np.cos(vecA[1] * np.pi / 180) * np.cos(vecB[1] * np.pi / 180) * np.cos((vecB[0] - vecA[0]) * np.pi / 180)
return np.arccos(a + b) * 6371.0
```
解释一下:
- `vecA` 和 `vecB` 分别是点 A 和点 B 的经纬度坐标,其中 `vecA[0]` 和 `vecB[0]` 分别是经度,`vecA[1]` 和 `vecB[1]` 分别是纬度。
- 首先将经纬度从角度转换为弧度,使用 `np.pi / 180` 进行转换。
- 然后分别计算点 A 和点 B 的纬度的正弦值,存储在变量 `a` 中。
- 接着计算点 A 和点 B 的经度差的余弦值,存储在变量 `b` 中。
- 最后将 `a` 和 `b` 相加,计算它们的反余弦值,乘以地球半径 `6371.0`,即可得到球面距离。
相关问题
# k-means 算法的支持函数:欧式距离计算(补全代码) """ Parameters: vecA - 点A向量 vecB - 点B向量 Returns: 欧氏距离 """ def distEclud(vecA, vecB):
```python
import numpy as np
def distEclud(vecA, vecB):
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
```
解释一下:
- `np.power(vecA - vecB, 2)` 计算 vecA 与 vecB 中对应元素的差值的平方;
- `np.sum(np.power(vecA - vecB, 2))` 计算上述平方差值的和;
- `np.sqrt(np.sum(np.power(vecA - vecB, 2)))` 计算上述和的平方根,即为欧式距离。
RuntimeWarning: invalid value encountered in divide vecA_norm = vecA / np.linalg.norm(vecA)是什么意思
这是一个运行时警告,意味着在进行除法运算时出现了无效值。具体来说,vecA_norm = vecA / np.linalg.norm(vecA)是将向量vecA除以其范数(即向量的长度),以便将其归一化。但是,如果vecA的长度为0,则会出现除以0的情况,导致无效值的出现。