释放马氏距离的力量:用 Python 探索多元数据分析

news2024/11/28 10:35:08

一、说明

        马哈拉诺比斯距离(Mahalanobis Distance)是一种测量两个概率分布之间距离的方法。它是基于样本协方差矩阵的函数,用于评估两个向量之间的相似程度。Mahalanobis Distance考虑了数据集中各个特征之间的协方差,因此比欧氏距离更适合用于涉及多个特征的数据集。Mahalanobis Distance可以应用于各种机器学习算法中,如聚类分析、分类算法和异常检测。

维沙尔·夏尔马

 

二、基本概念介绍

        马氏距离是一种统计工具,用于测量点和分布之间的距离。它是一种强大的技术,可考虑数据集中变量之间的相关性,使其成为各种应用(如异常值检测、聚类和分类)中的宝贵工具。

        例如,让我们考虑一个场景,其中一家公司想要识别信用卡交易中的潜在欺诈行为。该公司收集有关各种变量的数据,例如交易金额,位置,时间和其他信用卡交易详细信息。然后,它使用马氏距离来测量每笔交易与所有交易分布之间的距离。通过这样做,它可以识别与其他交易明显不同的交易,并可能表明欺诈活动。

        马氏距离测量点和分布之间的距离,考虑数据中变量之间的相关性。它是点 x 与具有平均向量 μ 和协方差矩阵 Σ 的分布之间的距离。马氏距离的公式如下:

D² = (x-μ)TΣ⁻¹(x-μ)

        其中 D² 是平方马氏距离,x 是相关点,μ 是分布的平均向量,Σ 是分布的协方差矩阵,T 表示矩阵的转置。

        为了更好地理解这个公式,让我们举一个例子。假设我们有一个包含两个变量 X 和 Y 的数据集,并且我们想要测量一个点 (2, 3) 与数据集中所有点的分布之间的距离。我们计算数据集的平均向量和协方差矩阵如下:

    μ = [mean(X), mean(Y)] = [3, 4]

    Σ = [[var(X), cov(X,Y)], [cov(X,Y), var(Y)]] = [[2, -1], [-1, 2]]  

        现在,我们可以使用马氏距离公式来计算点 (2, 3) 和分布之间的距离:

D² = ([2, 3]-[3, 4])T[[2, -1], [-1, 2]]⁻¹([2, 3]-[3, 4])

= [-1, -1]T[[2, -1], [-1, 2]]⁻¹[-1, -1]

= [2, -2]T[[2/3, 1/3], [1/3, 2/3]][2, -2]

= [2/3, -2/3]T[2, -2]

= 4/3。

        因此,点 (2, 3) 与分布之间的马氏距离平方为 4/3。通过计算马氏距离,我们可以确定点与分布的距离,考虑 X 和 Y 变量之间的相关性。

import numpy as np
from scipy.spatial.distance import mahalanobis
from sklearn.datasets import make_blobs

# Create a dataset with 2 clusters
X, y = make_blobs(n_samples=100, centers=2, random_state=42)

# Calculate the mean vector and covariance matrix of the dataset
mu = np.mean(X, axis=0)
sigma = np.cov(X.T)

# Calculate the Mahalanobis Distance between two points
x1 = [2, 2]
x2 = [-2, -2]
dist_x1 = mahalanobis(x1, mu, np.linalg.inv(sigma))
dist_x2 = mahalanobis(x2, mu, np.linalg.inv(sigma))

# Print the distances
print("Distance between point x1 and the distribution:", dist_x1)
print("Distance between point x2 and the distribution:", dist_x2)

#OUTPUT

Distance between point x1 and the distribution: 2.099478227196236
Distance between point x2 and the distribution: 8.065203145117373

以下是如何使用马氏距离的一些示例:

  1. 异常值检测:马氏距离可以检测数据集中的异常值。异常值是与数据集其余部分明显不同的数据点。通过计算每个数据点与数据集平均值之间的马氏距离,我们可以识别远离平均值的数据点。这些数据点可被视为异常值,可能需要删除或进一步调查。
  2. 聚类:马氏距离也可用于聚类数据点。聚类是将相似的数据点分组在一起的过程。通过计算每个数据点之间的马氏距离和每个聚类的平均值,我们可以确定数据点属于哪个聚类。此方法可用于对具有不同方差或协方差的数据点进行聚类分析。
  3. 图像分类: 马氏距离可用于图像分类任务。此应用程序使用马氏距离来测量测试图像和一组训练图像之间的相似性。通过计算测试图像和每个训练图像之间的马氏距离,我们可以确定哪个训练图像与测试图像最相似。此方法对于人脸识别和对象检测等任务很有用。
  4. 欺诈检测:马氏距离可用于金融交易中的欺诈检测。通过计算一笔交易和一组历史交易之间的马氏距离,我们可以确定该交易是不寻常的还是可疑的。此方法可用于检测可能被忽视的欺诈易

以下是如何使用马氏距离的一些示例:

三、示例

下面是如何使用马哈拉诺比斯距离为现实生活中的数据集创建美丽图的示例:

        在本例中,让我们使用著名的鸢尾花数据集,其中包含 150 朵鸢尾花的测量值。我们将使用萼片长度、宽度和花瓣长度作为我们的特征。

首先,我们将计算数据集中每个数据点的马氏距离。我们可以在 Python 中使用以下代码来做到这一点:

import numpy as np
from scipy.spatial.distance import mahalanobis

# load the iris dataset
from sklearn.datasets import load_iris
iris = load_iris()

# calculate the mean and covariance matrix of the dataset
mean = np.mean(iris.data, axis=0)
cov = np.cov(iris.data.T)

# calculate the Mahalanobis distance for each data point
mahalanobis_dist = [mahalanobis(x, mean, np.linalg.inv(cov)) for x in iris.data]

接下来,我们可以使用前两个特征(萼片长度和萼片宽度)创建虹膜数据集的散点图,并根据其马氏距离为每个数据点着色。我们可以使用颜色图将马氏距离映射到色标。这是该图的代码:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# create a color map for the Mahalanobis distances
cmap = ListedColormap(['r', 'g', 'b'])
norm = plt.Normalize(min(mahalanobis_dist), max(mahalanobis_dist))

# create a scatter plot of the iris dataset
plt.scatter(iris.data[:, 0], iris.data[:, 1], c=mahalanobis_dist, cmap=cmap, norm=norm)

# add a color bar
plt.colorbar()
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('Mahalanobis Distance for Iris Dataset')
plt.show()

        生成的图显示了鸢尾花数据集,每个数据点根据其马氏距离着色。远离平均值的数据点(即异常值)以红色显示,而接近平均值的数据点以绿色和蓝色着色。

        下面是另一个使用sci-kit-learn库附带的著名Wine数据集的示例:

import numpy as np
from scipy.spatial.distance import mahalanobis
import pandas as pd
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# load the wine dataset
wine = load_wine()
wine_df = pd.DataFrame(wine.data, columns=wine.feature_names)

# calculate the mean and covariance matrix of the dataset
mean = np.mean(wine_df, axis=0)
cov = np.cov(wine_df.T)

# calculate the Mahalanobis distance for each data point
mahalanobis_dist = [mahalanobis(x, mean, np.linalg.inv(cov)) for x in wine_df.values]

# create a scatter plot of the wine dataset using two highly correlated features
plt.scatter(wine_df['flavanoids'], wine_df['color_intensity'], c=mahalanobis_dist, cmap='coolwarm')

# add a color bar
plt.colorbar()
plt.xlabel('flavanoids')
plt.ylabel('color_intensity')
plt.title('Mahalanobis Distance for Wine Dataset')
plt.show()

        两个高度相关的特征(类黄酮和color_intensity)的散点图,每个数据点根据其马氏距离着色。

“Unlocking the Power of Mahalanobis Distance: Exploring Multivariate Data Analysis with Python” | by Vishal Sharma | Medium
机器学习
数据科学
统计学
数据可视化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/866695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

skynet 网络模块解析

文章目录 前言环境准备sneak peek线程数据结构会话对象:持有基础套接字,封装了套接字的基础操作。会话管理器:持有并管理会话池,给外部模块提供网络接口。 网络模块管理会话管理器的生命周期管理工作模式 总结技术点原子数据管道描…

漫话拥塞控制:BBR 是个单流模型

概要(便于检索主题):单流,多流收敛,probe buffer 挤压带宽,maxbw-filter wnd。 我曾经经常说 BBR 是个单流模型,而不是多流收敛模型,也做过不少评论,最近在复听 IETF 的大会,在 IET…

SQL | 检索数据

1-检索数据 1.1-检索单个列 SELECT prod_name FROM Products; 上述SELECT语句从Products表中检索一个名为prod_name的列。 所要查找的列在select后面,from关键字指出从那个表查询数据。 输出如下: prod_name8 inch teddy bear12 inch teddy bear18…

linux鲁班猫代码初尝试[编译镜像][修改根文件系统重编译][修改设备树改屏幕为MIPI]

编译镜像 官方百度云盘资料:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/baidu_cloud/baidu_cloud.html 解压虚拟机压缩包:"鲁班猫\8-SDK源码压缩包\开发环境虚拟机镜像\ubuntu20.04.7z"后既可以用VMware打开,打开后可以看到已经有…

【前端】JQ生成二维码

提供两种方法&#xff0c;两种都是借助JQ插件生成。 所需文件&#xff1a;https://download.csdn.net/download/qq_25285531/88204985https://download.csdn.net/download/qq_25285531/88204985 方法一&#xff1a; <script type"text/javascript" src"/s…

【JavaEE基础学习打卡02】是时候了解JavaEE了

目录 前言一、为什么要学习JavaEE二、JavaEE规范介绍1.什么是规范&#xff1f;2.什么是JavaEE规范&#xff1f;3.JavaEE版本 三、JavaEE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 &#x1f4dc; 本系列教程适用于JavaWeb初学者、爱好者&#xff0c;小白白。我们的天…

【刷题笔记8.11】LeetCode题目:二叉树中序遍历、前序遍历、后序遍历

LeetCode题目&#xff1a;二叉树中序遍历、前序遍历、后序遍历 题目1&#xff1a;二叉树中序遍历 &#xff08;一&#xff09;题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 &#xff08;二&#xff09;分析 二叉树中序遍历&#xff0c;遍历…

6-Ngnix配置反向代理

1.前提 虚拟机能连接外网 仿真http应用需在本虚拟机启用(原因&#xff1a;只有一台虚拟机做测试) http_8080和http_8081要启用&#xff08;http测试应用&#xff09; [rootcent79-2 ~]# ls -l http_* -rwxr-xr-x 1 root root 6391676 Jul 19 13:39 http_8080 -rwxr-xr-x 1 …

【C# Programming】C#第一课(自己学习的笔记)

目录 一、C# 介绍 1.1 托管代码(Manage Code ) &#xff1a; 1.2 基础类型库 (Base Class Library)&#xff1a; 1.3 程序集(Assembly)&#xff1a; 1.4 .NET 框架&#xff1a; 1.5 公共中间语言(Common Intermediate Language)&#xff0c;简称 IL。 1.6 C#编译器将源代…

RISC-V在快速发展的处理器生态系统中找到立足点

原文&#xff1a;RISC-V Finds Its Foothold in a Rapidly Evolving Processor Ecosystem 作者&#xff1a;Agam Shah 转载自&#xff1a;https://thenewstack.io/risc-v-finds-its-foothold-in-a-rapidly-evolving-processor-ecosystem/ 以下是正文 But the open source pr…

【用unity实现100个游戏之6】制作一个战旗自走棋类游戏(附源码)

文章目录 前言导入素材开始1. 设置瓦片间隙2. 放置全图瓦片3. 美化瓦片地图4. 添加树木障碍物5. 设定不同的排序图层6. 瓦片交互6. 瓦片交互优化6. 瓦片是否允许角色7. 添加角色8. 新增游戏管理脚本9. 角色移动范围逻辑10. 角色移动范围可视化11. 角色移动12. 重置瓦片颜色12. …

Spark(38):Streaming DataFrame 和 Streaming DataSet 转换

目录 0. 相关文章链接 1. 基本操作 1.1. 弱类型 api 1.2. 强类型 1.3. 直接执行 sql 2. 基于 event-time 的窗口操作 2.1. event-time 窗口理解 2.2. event-time 窗口生成规则 3. 基于 Watermark 处理延迟数据 3.1. 什么是 Watermark 机制 3.2. update 模式下使用 w…

【计算机视觉|生成对抗】条件生成对抗网络(CGAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Conditional Generative Adversarial Nets 链接&#xff1a;[1411.1784] Conditional Generative Adversarial Nets (arxiv.org) 摘要 生成对抗网络&#xff08;Generative Adversarial…

04_Hudi 集成 Spark、保存数据至Hudi、集成Hive查询、MergeInto 语句

本文来自"黑马程序员"hudi课程 4.第四章 Hudi 集成 Spark 4.1 环境准备 4.1.1 安装MySQL 5.7.31 4.1.2 安装Hive 2.1 4.1.3 安装Zookeeper 3.4.6 4.1.4 安装Kafka 2.4.1 4.2 滴滴运营分析 4.2.1 需求说明 4.2.2 环境准备 4.2.2.1 工具类SparkUtils 4.2.2.2 日期转换…

读《Flask Web开发实战》(狼书)笔记 | 第1、2章

前言 2023-8-11 以前对网站开发萌生了想法&#xff0c;又有些急于求成&#xff0c;在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣&#xff0c;存在许多模糊或不太理解的地方&#xff0c;只会照葫芦画瓢。 而当自己想开发一个什么网站的时&…

限流在不同场景的最佳实践

目录导读 限流在不同场景的最佳实践1. 前言2. 为什么要限流3. 有哪些限流场景3.1 限流场景分类3.2 限流与熔断降级之间的关系3.3 非业务限流3.4 业务限流 4. 有哪些限流算法4.1 计数器限流算法4.2 漏桶限流算法4.3 令牌桶限流算法4.4 滑动时间窗限流算法4.5 限流算法选型 5. 限…

【数据结构与算法】稀疏数组

文章目录 一&#xff1a;为什么会使用稀疏数组1.1 先看一个实际的需求1.2 基本介绍1.2.1 稀疏数组的处理方法1.2.2 数组的举例说明1.2.3 应用实例1.2.4 整体思路分析二维数组转稀疏数组的思路稀疏数组转原始的二维数组的思路 二&#xff1a;代码实现2.1 创建一个原始的11*11二维…

​LeetCode解法汇总1572. 矩阵对角线元素的和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个正…

探秘金和OA:解析任意文件读取漏洞的潜在威胁

是喜是悲&#xff0c;但可以慰藉的是&#xff0c;你总不枉在这世界上活了一场&#xff0c;有了这样的认识&#xff0c;你就会珍重生活&#xff0c;而不会玩世不恭&#xff1b;同时也会给人自身注入一种强大的内在力量…… 漏洞复现 访问url&#xff1a; 构造payload /C6/Jh…

【网络编程(二)】NIO快速入门

NIO Java NIO 三大核心组件 Buffer&#xff08;缓冲区&#xff09;&#xff1a;每个客户端连接都会对应一个Buffer&#xff0c;读写数据通过缓冲区读写。Channel&#xff08;通道&#xff09;&#xff1a;每个channel用于连接Buffer和Selector&#xff0c;通道可以进行双向读…