零基础入门Python数据分析与机器学习--椭圆模型拟合及案例

9.5.2 椭圆模型拟合及案例

多元数据集存在偏离正常范围的“离群点”。一般在预处理数据环节,需检测出离群点,再进行处理。

离群点产生的原因可能是由数据中存在某些点来自于与总体分布不同的其它分布。具体而言,假设多元数据集大多数样本服从分布F,少量样本服从分布G;则将少量样本定义为离群点。

一般采用马氏距离来检验某个样本是否为离群点。在计算距离过程中需要提供均值估计量和协方差估计量,这两个参数容易被离群值影响而发生偏离,导致马氏距离计算不准确,最终影响离散点的判断。

实现离群点检测的一种常见方式是假设常规数据来自已知分布(例如,数据服从高斯分布)。 从这个假设来看,我们通常试图定义数据的“形状”,并且可以将偏远观测(outlying observation)定义为足够远离拟合形状的观测。

scikit-learn 提供了covariance.EllipticEnvelope对象,它能拟合出数据的稳健协方差估计,从而为中心数据点拟合出一个椭圆,忽略不和该中心模式相关的点。

例如,假设数据服从高斯分布,它将稳健地(即不受异常值的影响)估计位置和协方差。从而估计得到的马氏距离用于得出偏远性度量。

由于直接计算均值和协方差两个估计量易受离群值影响而发生偏移,马氏距离计算不准确,进而对离群值的判断出现失误。为了获取更加稳健的估计量,最小协方差行列式(MCD)被提出,提高了离群点探测的准确度。利用最小协方差行列式计算可以获取更稳健的均值和协方差估计量,再根据马氏距离计算,可以更精准地探测离群点。他的基本原理是找到样本量为s的子集,使得在所有大小为s的子集中,该子集的协方差矩阵的行列式是最小的。

下面的案例说明对位置和协方差使用标准估计或稳健估计来评估观测值的偏远性的差异,代码如下:

#导入相关库

import numpy as np

import matplotlib.pyplot as plt

from sklearn.covariance import EmpiricalCovariance, MinCovDet

#正常显示中文

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

n_samples = 150

n_outliers = 50

n_features = 2

#生成数据

gen_cov = np.eye(n_features)

gen_cov[0, 0] = 2.

X = np.dot(np.random.randn(n_samples, n_features), gen_cov)

#添加一些离群值

outliers_cov = np.eye(n_features)

outliers_cov[np.arange(1, n_features), np.arange(1, n_features)] = 7.

X[-n_outliers:] = np.dot(np.random.randn(n_outliers, n_features), outliers_cov)

#稳健估计拟合数据

robust_cov = MinCovDet().fit(X)

#估计量与真实参数比较

emp_cov = EmpiricalCovariance().fit(X)

#显示结果

fig = plt.figure(figsize= (11, 8))

plt.subplots_adjust(hspace=-.15, wspace=.6, top=.95, bottom=.05)

#显示数据集

subfig1 = plt.subplot(3, 1, 1)

inlier_plot = subfig1.scatter(X[:, 0], X[:, 1],color='black', label='正常值')

outlier_plot = subfig1.scatter(X[:, 0][-n_outliers:], X[:, 1][-n_outliers:],color='red', label='离群点')

subfig1.set_xlim(subfig1.get_xlim()[0], 11.)

subfig1.set_title("数据集的马氏距离", fontsize=16)

#显示距离函数的轮廓

xx, yy = np.meshgrid(np.linspace(plt.xlim()[0], plt.xlim()[1], 100),

                     np.linspace(plt.ylim()[0], plt.ylim()[1], 100))

zz = np.c_[xx.ravel(), yy.ravel()]

#极大似然估计

mahal_emp_cov = emp_cov.mahalanobis(zz)

mahal_emp_cov = mahal_emp_cov.reshape(xx.shape)

emp_cov_contour = subfig1.contour(xx, yy, np.sqrt(mahal_emp_cov),

                                  cmap=plt.cm.PuBu_r,linestyles='dashed')

#最小协方差行列式

mahal_robust_cov = robust_cov.mahalanobis(zz)

mahal_robust_cov = mahal_robust_cov.reshape(xx.shape)

robust_contour = subfig1.contour(xx, yy, np.sqrt(mahal_robust_cov),

                                 cmap=plt.cm.YlOrBr_r, linestyles='dotted')

subfig1.legend([emp_cov_contour.collections[1], robust_contour.collections[1],inlier_plot, outlier_plot],['极大似然估计距离', '最小协方差行列式距离', '正常值', '离群点'],loc="upper right", borderaxespad=0, fontsize=15)

plt.xticks(())

plt.yticks(())

#绘制每个点的分数

emp_mahal = emp_cov.mahalanobis(X - np.mean(X, 0)) ** (0.5)

subfig2 = plt.subplot(2, 2, 3)

subfig2.boxplot([emp_mahal[:-n_outliers], emp_mahal[-n_outliers:]], widths=.15)

subfig2.plot(np.full(n_samples - n_outliers, 1.26),

             emp_mahal[:-n_outliers], '+k', markeredgewidth=1)

subfig2.plot(np.full(n_outliers, 2.26),

             emp_mahal[-n_outliers:], '+k', markeredgewidth=1)

subfig2.axes.set_xticklabels(('正常值', '离群点'), size=15)

subfig2.set_ylabel(r"马氏距离的平方根", size=15)

subfig2.set_title("1.不稳健估计\n(极大似然估计)", fontsize=16)

plt.yticks(())

robust_mahal = robust_cov.mahalanobis(X - robust_cov.location_) ** (0.5)

subfig3 = plt.subplot(2, 2, 4)

subfig3.boxplot([robust_mahal[:-n_outliers], robust_mahal[-n_outliers:]],widths=.25)

subfig3.plot(np.full(n_samples - n_outliers, 1.26),

             robust_mahal[:-n_outliers], '+k', markeredgewidth=1)

subfig3.plot(np.full(n_outliers, 2.26),

             robust_mahal[-n_outliers:], '+k', markeredgewidth=1)

subfig3.axes.set_xticklabels(('正常值', '离群点'), size=15)

subfig3.set_ylabel(r"马氏距离的平方根", size=15)

subfig3.set_title("2.稳健估计\n(最小协方差行列式)", fontsize=16)

plt.yticks(())

plt.show()

运行上述代码,输出如图9-14所示。

                                                         

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python数据分析机器学习商业案例实战电子版是一本针对数据分析机器学习在商业领域中的应用进行实战训练的电子书。该书通过介绍Python在大数据分析机器学习方面的基础知识,结合实际的商业案例进行讲解和实践,帮助读者深入理解并应用Python技术进行商业数据分析机器学习工作。 书中首先介绍了Python在数据处理、数据可视化和数据分析方面的基础知识,包括Pandas、Matplotlib、NumPy等库的使用方法,帮助读者建立起对Python数据处理基础的理解和掌握。然后,通过商业案例数据分析机器学习的应用进行实战演练,例如市场营销数据分析、金融风控模型建立、客户行为预测等,通过实际案例帮助读者了解数据分析机器学习在商业中的实际应用。 该电子书还特别关注了商业案例的实战性,通过引导读者使用Python进行实际的数据处理和机器学习模型构建,使读者在实践中掌握数据分析机器学习的技能。同时,书中还介绍了一些相关的商业案例成功故事,帮助读者理解数据分析机器学习在商业领域的重要性和实际应用价值。 总之,Python数据分析机器学习商业案例实战电子版是一本帮助读者系统学习和应用Python在商业数据分析机器学习中的实用技能的电子书,通过实战演练等方式,帮助读者真正掌握并应用数据分析机器学习的技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王国平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值