Python实现的计算马氏距离算法示例

本文提供了一个使用Python实现的马氏距离计算示例。通过定义一个函数,该函数接受两个输入参数并返回它们之间的马氏距离。示例中还包含了如何计算协方差矩阵及其逆矩阵的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python实现的计算马氏距离算法示例

本文实例讲述了Python实现的计算马氏距离算法。分享给大家供大家参考,具体如下:

我给写成函数调用了

python实现马氏距离源代码:    
# encoding: utf-8
from __future__ import division
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import numpy as np
def mashi_distance(x,y):
  print x
  print y
  #马氏距离要求样本数要大于维数,否则无法求协方差矩阵
  #此处进行转置,表示10个样本,每个样本2维
  X=np.vstack([x,y])
  print X
  XT=X.T
  print XT
  #方法一:根据公式求解
  S=np.cov(X)  #两个维度之间协方差矩阵
  SI = np.linalg.inv(S) #协方差矩阵的逆矩阵
  #马氏距离计算两个样本之间的距离,此处共有4个样本,两两组合,共有6个距离。
  n=XT.shape[0]
  d1=[]
  for i in range(0,n):
    for j in range(i 1,n):
      delta=XT[i]-XT[j]
      d=np.sqrt(np.dot(np.dot(delta,SI),delta.T))
      print d
      d1.append(d)
if __name__ == '__main__':
  # 第一列
  x = [3, 5, 2, 8]
  # 第二列
  y = [4, 6, 2, 4]
  mashi_distance(x,y)

运行结果:

 

转载于:https://www.cnblogs.com/amengduo/p/9586360.html

### 实现基于马氏距离的 KMeans 聚类算法 为了实现基于马氏距离的 KMeans 聚类算法,通常需要自定义距离度量函数并将其集成到标准的 KMeans 算法框架中。下面是一个完整的 Python 示例代码,展示了如何通过 Scikit-Learn 和 NumPy 库来完成这一目标。 ```python import numpy as np from scipy.spatial.distance import mahalanobis from sklearn.cluster import KMeans from sklearn.datasets import make_blobs from sklearn.preprocessing import StandardScaler class MahalanobisKMeans(KMeans): def __init__(self, n_clusters=8, init='k-means++', max_iter=300, tol=1e-4, random_state=None): super().__init__(n_clusters=n_clusters, init=init, max_iter=max_iter, tol=tol, random_state=random_state) def fit(self, X): self.X = X.copy() scaler = StandardScaler().fit(X) self.X_scaled = scaler.transform(X) # 计算协方差矩阵及其逆矩阵 cov_matrix = np.cov(self.X.T) inv_cov_matrix = np.linalg.inv(cov_matrix) self.vi = inv_cov_matrix # 初始化质心 centroids_indices = self._init_centroids(self.X_scaled) self.centers_ = self.X[centroids_indices] for _ in range(self.max_iter): old_centers = self.centers_.copy() distances = [] for i in range(len(self.X)): d = [mahalanobis(self.X[i], center, self.vi) for center in self.centers_] distances.append(d) labels = np.argmin(distances, axis=1) new_centers = [] for j in range(self.n_clusters): mask = (labels == j) cluster_points = self.X[mask] if len(cluster_points) != 0: mean_point = cluster_points.mean(axis=0) else: mean_point = old_centers[j].copy() # 如果簇为空,则保持旧质心不变 new_centers.append(mean_point) self.centers_ = np.array(new_centers) shift = ((old_centers - self.centers_) ** 2).sum() if shift <= self.tol: break self.labels_ = labels def predict(self, X_new): distances = [] for point in X_new: distance_to_centers = [ mahalanobis(point, center, self.vi) for center in self.centers_ ] distances.append(distance_to_centers) return np.argmin(np.array(distances), axis=1) # 测试数据生成 X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) # 使用自定义MahalanobisKMeans模型进行拟合预测 model = MahalanobisKMeans(n_clusters=4, random_state=0) model.fit(X) y_pred = model.predict(X) print(y_pred[:10]) # 打印前十个样本所属类别编号 ``` 此代码片段创建了一个继承于 `sklearn.cluster.KMeans` 的新类 `MahalanobisKMeans`,该类重写了父类中的部分方法以便支持马氏距离作为衡量指标[^1]。注意,在实际应用中应当根据具体需求调整参数设置以及处理异常情况下的逻辑分支。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值