使用什么系统进行异常检测?
我看到像 Mahout 这样的系统没有列出异常检测,而是列出了分类、聚类、推荐等问题......
任何建议以及教程和代码示例都会很棒,因为我以前没有这样做过。
我创建了一个facet_grid
包含多个变量的箱线图。举个例子,该图可以通过以下虚拟数据重现
require(ggplot2)
require(plyr)
library(reshape2)
set.seed(1234)
x<- rnorm(100)
y.1<-rnorm(100)
y.2<-rnorm(100)
y.3<-rnorm(100)
y.4<-rnorm(100)
df<- (as.data.frame(cbind(x,y.1,y.2,y.3,y.4)))
dfmelt<-melt(df, measure.vars = 2:5)
Run Code Online (Sandbox Code Playgroud)
并将结果图创建为
dfmelt$bin <- factor(round_any(dfmelt$x,0.5))
ggplot(dfmelt, aes(x=bin, y=value, fill=variable))+
geom_boxplot()+
facet_grid(.~bin, scales="free")+
labs(x="X (binned)")+
theme(axis.text.x=element_blank())
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
但是,我想重新定义箱线图晶须,使它们不代表 0.25 - 1.5 IQR / 0.75 + IQR 和异常值,而是 (i) 完整的第 5 个和第 95 个百分位数或 (ii) 数据的无穷大和最高。
我需要创建一个函数来计算数据框列中异常值的百分比.对于异常值,我的意思是任何数据点与均值相差超过3个标准差.
我查看了包装异常值,但这并没有让我感到厌烦,因为所有功能似乎都是针对寻找异常值而不是计算它们.
我可以使用它的功能吗?
我有一个用于快速傅立叶变换信号的数据帧。
有一列表示频率(以 Hz 为单位),另一列表示相应的幅度。
我读过几年前发表的一篇文章,您可以使用一个简单的布尔函数来排除或仅包含最终数据框中高于或低于几个标准偏差的异常值。
df = pd.DataFrame({'Data':np.random.normal(size=200)}) # example dataset of normally distributed data.
df[~(np.abs(df.Data-df.Data.mean())>(3*df.Data.std()))] # or if you prefer the other way around
Run Code Online (Sandbox Code Playgroud)
问题是当频率增加到 50 000Hz 时,我的信号会下降几个幅度(最多小 10 000 倍)。因此,我无法使用仅导出高于 3 个标准差的值的函数,因为我只会从前 50 Hz 中提取“峰值”异常值。
有没有办法可以在我的数据框中导出高于滚动平均值的 3 个滚动标准偏差的异常值?
我正在尝试对时间序列数据进行离群值处理,在该数据中,我想将> 95%的值替换为95%的值,将<5%的值替换为5%的值。我已经准备了一些代码,但是找不到所需的结果。
我正在尝试使用名为Cut的子函数创建OutlierTreatment函数。代码如下
def outliertreatment(df,high_limit,low_limit):
df_temp=df['y'].apply(cut,high_limit,low_limit, extra_kw=1)
return df_temp
def cut(column,high_limit,low_limit):
conds = [column > np.percentile(column, high_limit),
column < np.percentile(column, low_limit)]
choices = [np.percentile(column, high_limit),
np.percentile(column, low_limit)]
return np.select(conds,choices,column)
Run Code Online (Sandbox Code Playgroud)
我希望在OutlierTreatment函数中发送数据帧,其中95作为high_limit和5作为low_limit。如何达到预期的效果?
我有一大堆来自excel文件(保存为csv)的数据,其中包含试验(X)和时间(Y).我知道有一个代码可以通过使用卡方检验代码在试验中取出单个异常值.但是,我希望能够取出数据集中具有异常值的整个列,同时保持文件中的其他数据不变.我很难找到/想出一个允许这样做的代码.有什么建议吗?!
我是数据分析的新手,试图更好地理解在进行PCA分析时如何识别异常值。我创建了一个包含5列的数据矩阵,分别代表我的数学,英语,历史,物理和社会科学变量;每行代表学生在课堂上获得的最终成绩。当我绘制第一和第二主成分的分数时,数据矩阵中的第五列是一个异常值。我希望有一种方法可以在数学上检测异常值而不必绘制分数。非常感谢您提出的任何建议或想法。在此先感谢您的帮助。我已经在下面发布了我的代码。
%Column names
colNames = {'Math','English','History','Physics','Social Science'};
%data matrix
data = [75.23,74.65,77,73.04,72.11;
88.50,89.43,86.23,88.50,50.97;
66.12,65.12,67.45,66.02,66.54;
89.23,90.43,88.21,88.23,71.21;
72.35,72.43,73.56,74.32,63.51;
50.23,52.34,51.78,52.32,59.85;
58.79,58.79,58.79,58.79,91.08;
86.08,86.08,86.08,86.08,71.49;
73.67,73.67,73.67,73.67,94.38;
56.34,57.63,58.23,58.32,69.55;
67.05,69.42,66.32,65.32,88.45;
81.23,80.36,80.32,79.89,69.83;
59.68,59.58,60.32,59.02,90.42;
87.34,86.92,85.23,86.01,87.75;
63.21,62.14,62.03,62.32,68.86;
95.87,94.54,95.65,96.12,60.80;
64.34,63.45,63.45,63.45,89.52;
89.32,87.54,88.27,88.01,97.46;
59.65,58.23,60.32,59.43,66.37;
63.98,64.37,65.01,64.01,83.56;
56.34,55.35,53.98,54.25,71.93;
79.98,78.81,78.01,77.99,91.67;
84.16,85.021,83.99,84.87,88.44;
78.38,77.32,76.98,77.56,58.36;
71.28,72.98,71.99,71.56,93.09;];
%Computing PCA
covarianceMat=cov(data);
[eigenVectors,eigenValues]=eigs(covarianceMat,5);
%Sorting Eigen values
[eigenValues I] = sort(diag(eigenValues),'descend');
%Computing Variance Percentage of each Eigen value
variancePercentage = (eigenValues ./ sum(eigenValues)) .*100;
figure(2)
plot(eigenVectors(:,1),eigenVectors(:,2),'*');
xlabel('Principal Component 1');ylabel('Principal Component 2')
for Loop = 1:length(colNames)
text(eigenVectors(Loop,1),eigenVectors(Loop,2),colNames{Loop},'Color','r')
end
Run Code Online (Sandbox Code Playgroud) 我只需要找到非常大的跳跃,这样我就可以找到簇,后来也可以找到噪声.示例数据如下:
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.000000
0.000500
0.001500
0.003000
0.005500
0.008700
0.012400
0.012400
Run Code Online (Sandbox Code Playgroud)
我需要在python中执行此操作,但任何通用算法也是受欢迎的.
我已经尝试过了
我面临的问题是当我使用比较函数时numpy.allclose()
,它的近似因子是静态的,并且对于不同程度的跳跃,它会停止工作并产生误报和漏报.
一些数据可视化图表.每个底部图表是总点数.
我目前正在开发交易卡游戏 (TCG) 定价应用程序。它的工作是从不同供应商那里收集数据,并使用这些数据来确定任何给定卡的市场价格。为了举例,让我们考虑一张理论牌 X。
X 具有多种值,具体取决于销售它的供应商。这是其值的数组:
[1.00, 1.10, 1.05, 0.95, 2.00, 0.10]
这些值是指其美元 ($) 值。
根据我作为该市场客户的经验,我假设定价数据是正态分布的。定价数据往往倾向于一个价格,许多不同的供应商将他们的卡定价接近所述价格(以保持竞争力),偶尔会有异常值。
在这些假设下,我将如何消除上述数据集中的异常值?乍一看,2.00 美元和 0.10 美元似乎是异常值。但是市场上的价格是波动的。一张卡的价值飙升并反过来坦克的情况并不少见。
我研究了一些方法,例如使用与平均值的标准偏差阈值(例如,如果价格与平均值的标准偏差 >2,则将其视为异常值)或使用中值绝对偏差,但我不确定是什么算法甚至在我正在做的事情的背景下也是有道理的。
所以,我有一个数据集,知道如何使用summary命令获取五个数字摘要.现在我需要让实例高于Q3 + 1.5IQR或低于Q1 - 1.5IQR,因为这些只是数字 - 我如何从高于数字或低于数字的数据集返回实例?
outliers ×10
r ×4
python ×3
dataframe ×2
pandas ×2
statistics ×2
algorithm ×1
boxplot ×1
data-mining ×1
function ×1
ggplot2 ×1
matlab ×1
numpy ×1
pca ×1
time-series ×1