欧几里得距离
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。
def euclid(x, y):
return np.linalg.norm(x - y)
计算方式的局限。
比如说计算两个点的距离,点A(10,10000)、点B(1,500),第二个维度对于距离d的贡献是远远超过第一个维度的。在这里我们只是向量中的各个因素分别进行了处理,并没有考虑维度之间的相互关系,以及不同维度对于距离d的贡献程度。另外一点局限是,从距离角度来看,它认为两点之间,始终是可以通过直线距离到达的(更适用于欧氏空间)。
这是非常重要的一个基础,以后的几种距离都会与欧氏距离进行对比。
标准化欧氏距离 (Standardized Euclidean distance )
标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集(X)的均值(mean)为(m),标准差(standard deviation)为(s),那么(X)的“标准化变量”表示为:
def std_euclid(x, y):
std=np.vstack([x,y])
return np.sqrt(((x-y)**2/np.var(std)).sum())
曼哈顿距离
计程车几何(Taxicab geometry)或曼哈顿距离(Manhattan distance or Manhattan length)或方格线距离是由十九世纪的赫尔曼·闵可夫斯基所创辞汇,为欧几里得几何度量空间的几何学之用语,用以标明两个点上在标准坐标系上的绝对轴距之总和。
def manhattan(x, y):
return np.sum(np.abs(x-y))
切比雪夫距离
国际象棋玩过么?国王走一步能够移动到相邻的8个方格中的任意一个。那么国王从格子((x_1,y_1))走到格子((x_2,y_2))最少需要多少步?自己走走试试。你会发现最少步数总是( ext{max}( | x_2-x_1 | , | y_2-y_1 | )) 步 。有一种类似的一种距离度量方法叫切比雪夫距离。
闵可夫斯基距离
明氏距离又叫做明可夫斯基距离,是欧氏空间中的一种测度,被看做是欧氏距离和曼哈顿距离的一种推广。
其中p是一个变参数。
- 当p=1时,就是曼哈顿距离
- 当p=2时,就是欧氏距离
- 当p→∞时,就是切比雪夫距离
根据变参数的不同,闵氏距离可以表示一类的距离。
def minkowski(x, y, p):
return np.linalg.norm(x - y, ord=p)
余弦距离
def cos_dis(x, y):
return np.dot(x, y)/(np.linalg.norm(x)*np.linalg.norm(y))