分布问题 异常检测

#加载数据
import pandas as pd
import numpy as np
data = pd.read_csv('anomaly_data.csv')
data.head()

在这里插入图片描述

#数据可视化
%matplotlib inline
from matplotlib import pyplot as plt
fig1 = plt.figure(figsize=(10,7))
plt.scatter(data.loc[:,'x1'],data.loc[:,'x2'])
plt.title("data")
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

在这里插入图片描述中心聚集的点是正常数据,旁边分散的点是异常数据

#define x1 and x2
x1 = data.loc[:,'x1']
x2 = data.loc[:,'x2']
fig2 = plt.figure(figsize=(10,5))
plt.subplot(121)
plt.hist(x1,bins=100)#100个数据分割
plt.title("x1 distribution")
plt.xlabel('x1')
plt.ylabel('counts')
plt.subplot(122)
plt.hist(x2,bins=100)#100个数据分割
plt.title("x2 distribution")
plt.xlabel('x2')
plt.ylabel('counts')
plt.show()

在这里插入图片描述中心是最多的 再看高斯分布

#计算x1 x2 均值和标准差
x1_mean = x1.mean()
x1_sigma = x1.std()
x2_mean = x2.mean()
x2_sigma = x2.std()
print(x1_mean,x1_sigma,x2_mean,x2_sigma)

在这里插入图片描述

#计算高斯分布的概率密度 p(x)
from scipy.stats import norm
x1_range = np.linspace(0,20,300)#生成从0到20的300个连续的点 
x1_normal = norm.pdf(x1_range,x1_mean,x1_sigma)
x2_range = np.linspace(0,20,300)#生成从0到20的300个连续的点 
x2_normal = norm.pdf(x2_range,x2_mean,x2_sigma)
fig3 = plt.figure(figsize=(10,5))
plt.subplot(121)
plt.title("normal p(x1)")
plt.plot(x1_range,x1_normal)
plt.subplot(122)
plt.title("normal p(x2)")
plt.plot(x2_range,x2_normal)
plt.show()

在这里插入图片描述

训练

from sklearn.covariance import EllipticEnvelope
ad_model = EllipticEnvelope()
ad_model.fit(data)#无监督式学习

#预测
y_predict = ad_model.predict(data)
print(y_predict)
#1是正常点 -1是异常点
print(pd.value_counts(y_predict))

在这里插入图片描述

#画出异常数据的点
fig4 = plt.figure(figsize=(10,10))
original_data = plt.scatter(data.loc[:,'x1'],data.loc[:,'x2'],marker="x")
anomaly_data = plt.scatter(data.loc[:,'x1'][y_predict==-1],data.loc[:,'x2'][y_predict==-1],marker="o",facecolor='none',edgecolors='red',s=150)
plt.title("anomalu detection result")
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend((original_data,anomaly_data),('original data','anomal data'))
plt.show()

在这里插入图片描述

修改阈值

ad_model = EllipticEnvelope(contamination=0.02)
ad_model.fit(data)

y_predict = ad_model.predict(data)

fig5= plt.figure(figsize=(10,10))
original_data = plt.scatter(data.loc[:,'x1'],data.loc[:,'x2'],marker="x")
anomaly_data = plt.scatter(data.loc[:,'x1'][y_predict==-1],data.loc[:,'x2'][y_predict==-1],marker="o",facecolor='none',edgecolors='red',s=150)
plt.title("anomalu detection result")
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend((original_data,anomaly_data),('original data','anomal data'))
plt.show()

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nickdlk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值