热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何理解vue数据双向绑定原理

本文主要介绍关于vue.js,javascript,前端的知识点,对【不要再搞混Vue的响应式原理和双向数据绑定了】和【如何理解vue数据双向绑定原理】有兴趣的朋友可以看下由【仙凌阁】投稿的技术文章,

前言

  在数据处理中,尤其在作函数拟合时,异常点的出现不仅会很大程度的改变函数拟合的效果,而且有时还会使得函数的梯度出现奇异梯度,这就导致算法的终止,从而影响研究变量之间的函数关系。为了有效的避免这些异常点造成的损失,我们需要采取一定的方法对其进行处理,而处理的第一步便是找到异常点在数据中的位置。

  什么是异常值?如何检测异常值?


目录

 1. 单变量异常值检测

 2. 使用LOF(local outlier factor,局部异常因子)进行异常检测

 3. 通过聚类的方法检验异常值

 4. 检验时间序列数据里面的异常值

 5. 讨论


主要程序包

install.packages(c("DMwR","dprep"))library(DMwR)library(dprep)

1. 单变量异常值检测

  使用函数boxplot.stats()实现单变量检测,该函数根据返回的统计数据生成箱线图。在上述函数的返回结果中,有一个参数out,它是由异常值组成的列表。更明确的说就是里面列出了箱线图中箱须线外面的数据点。其中参数coef可以控制箱须线从箱线盒上延伸出来的长度,关于该函数的更多细节可以通过输入‘?boxplot.ststs’查看。

  画箱线图:

set.seed(3147)
x <- rnorm(100) #产生100个服从正态分布的数据
summary(x)
boxplot.stats(x)$out #输出异常值
boxplot(x) #绘制箱线图

                                

  如上的单变量异常检测可以用来发现多元数据中的异常值&#xff0c;通过简单搭配的方式。在下例中&#xff0c;我们首先产生一个数据框df&#xff0c;它有两列x和y。之后&#xff0c;异常值分别从x和y检测出来。然后&#xff0c;我们获取两列都是异常值的数据作为异常数据。

x <- rnorm(100)y <- rnorm(100)# 生成一个包含列名分别为x与y的数据框dfdf <- data.frame(x, y)rm(x,y)head(df)# 连接数据框dfattach(df)(a <- which(x %in% boxplot.stats(x)$out)) # 输出x中的异常值(b <- which(y %in% boxplot.stats(y)$out)) # 输出y中的异常值# 断开与数据框的连接detach(df)# (1) 输出x,y相同的异常值(outlier.list1 <- intersect(a,b)) plot(df)points(df[outlier.list1,], col&#61;"red", pch&#61;"&#43;", cex&#61;2.5) # 标注异常点# (2) x或y中的异常值(outlier.list2 <- union(a, b))plot(df)points(df[outlier.list2,], col&#61;"blue", pch&#61;"x", cex&#61;2)

                               

  当有三个以上的变量时&#xff0c;最终的异常值需要考虑单变量异常检测结果的多数表决。当选择最佳方式在真实应用中进行搭配时&#xff0c;需要涉及领域知识。

 


2. 使用LOF&#xff08;local outlier factor&#xff0c;局部异常因子&#xff09;进行异常检测

  LOF&#xff08;局部异常因子&#xff09;是一种基于密度识别异常值的算法。算法实现是&#xff1a;将一个点的局部密度与分布在它周围的点的密度相比较&#xff0c;如果前者明显的比后者小&#xff0c;那么这个点相对于周围的点来说就处于一个相对比较稀疏的区域&#xff0c;这就表明该点事一个异常值。&#xff08;使用LOF&#xff0c;一个点的局部密度会与它的邻居进行比较。如果前者明显低于后者&#xff08;有一个大于1 的LOF值&#xff09;&#xff0c;该点位于一个稀疏区域&#xff0c;对于它的邻居而言&#xff0c;这就表明&#xff0c;该点是一个异常值。&#xff09;LOF算法的缺点是它只对数值型数据有效。

  lofactor()函数使用LOF算法计算局部异常因子&#xff0c;并且它在DMwR和dprep包中是可用的。下面将介绍一个使用LOF进行异常检测的例子&#xff0c;k是用于计算局部异常因子的邻居数量。下图呈现了一个异常值得分的密度图。

> library(DMwR)> # 移除“Species”这个鸢尾花类别列数据> iris2 <- iris[,1:4]> # k是计算局部异常因子所需要判断异常点周围的点的个数> outlier.scores <- lofactor(iris2, k&#61;5)> # 绘制异常值得分的密度分布图> plot(density(outlier.scores))> # 挑出得分排前五的数据作为异常值> outliers <- order(outlier.scores, decreasing &#61; T)[1:5]> # 输出异常值> print(outliers)[1] 42 107 23 110 63

                       

  接下来对鸢尾花数据进行主成分分析&#xff0c;并利用产生的前两个主成分绘制成双标图来显示异常值。

> n <- nrow(iris2)> labels <- 1:n> # 除了异常值以外所有的数据用"."标注> labels[-outliers] <- "."> biplot(prcomp(iris2), cex&#61;.8, xlabs&#61;labels)

               

  上面的代码中&#xff0c;prcomp()实现对数据集iris2的主成分分析&#xff0c;biplot()取主成分分析结果的前两列数据也就是前两个主成分绘制双标图。上图中&#xff0c;x轴和y轴分别代表第一、二主成分&#xff0c;箭头指向了原始变量名&#xff0c;其中5个异常值分别用对应的行号标注。

  我们也可以通过pairs()函数绘制散点图矩阵来显示异常值&#xff0c;其中异常值用红色的&#39;&#43;&#39;标注&#xff1a;

> # 使用rep()生成n个"."> pch <- rep(".", n)> pch[outliers] <- "&#43;"> col <- rep("black", n)> col[outliers] <- "red"> pairs(iris2, pch&#61;pch, col&#61;col)

                

  Rlof包&#xff0c;对LOF算法的并行实现。它的用法与lofactor()相似&#xff0c;但是lof()有两个附加的特性&#xff0c;即支持k的多元值和距离度量的几种选择。如下是lof()的一个例子。在计算异常值得分后&#xff0c;异常值可以通过选择前几个检测出来。注意&#xff0c;目前包Rlof的版本在MacOS X和Linux环境下工作&#xff0c;但并不在windows环境下工作&#xff0c;因为它要依赖multicore包用于并行计算。

library(Rlof)outlier.scores <- lof(iris2, k&#61;5)# 尝试使用不同的k值# try with different number of neighbors (k&#61;5,6,7,8,9 and 10)outlier.scores <- lof(iris2, k&#61;c(5:10))

3. 通过聚类的方法检验异常值

  另外一种异常检测的方法是聚类。通过把数据聚成类&#xff0c;将那些不属于任务一类的数据作为异常值。比如&#xff0c;使用基于密度的聚类DBSCAN&#xff0c;如果对象在稠密区域紧密相连&#xff0c;它们将被分组到一类。因此&#xff0c;那些不会被分到任何一类的对象就是异常值。

  我们也可以使用k-means算法来检测异常。使用k-means算法&#xff0c;数据被分成k组&#xff0c;通过把它们分配到最近的聚类中心。然后&#xff0c;我们能够计算每个对象到聚类中心的距离&#xff08;或相似性&#xff09;&#xff0c;并且选择最大的距离作为异常值。

#####################################iris2 <- iris[,1:4]kmeans.result <- kmeans(iris2, centers&#61;3)#class(kmeans.result)# 输出簇中心kmeans.result$centers#length(kmeans.result$centers)# 分类结果kmeans.result$cluster#mode(kmeans.result$cluster)# 计算数据对象与簇中心的距离centers <- kmeans.result$centers[kmeans.result$cluster, ]#class(centers)distances <- sqrt(rowSums((iris2 - centers)^2))# 挑选出前5个最大距离outliers <- order(distances, decreasing &#61; T)[1:5]# 输出异常值print(outliers)print(iris2[outliers,])# 画出聚类结果plot(iris2[,c("Sepal.Length", "Sepal.Width")], pch&#61;"o", col&#61;kmeans.result$cluster, cex&#61;0.3)# 绘制类&#xff08;簇&#xff09;中心&#xff0c;用"*"标记points(kmeans.result$centers[,c("Sepal.Length", "Sepal.Width")], col&#61;1:3, pch&#61;8, cex&#61;1.5)# 画出异常值&#xff0c;用"&#43;"标记points(iris2[outliers,c("Sepal.Length", "Sepal.Width")], pch&#61;"&#43;", col&#61;4, cex&#61;1.5)##########################################################################> iris2 <- iris[,1:4]> kmeans.result <- kmeans(iris2, centers&#61;3)> #class(kmeans.result)> # 输出簇中心> kmeans.result$centersSepal.Length Sepal.Width Petal.Length Petal.Width1 6.314583 2.895833 4.973958 1.70312502 5.175758 3.624242 1.472727 0.27272733 4.738095 2.904762 1.790476 0.3523810> #length(kmeans.result$centers)> # 分类结果> kmeans.result$cluster[1] 2 3 3 3 2 2 2 2 3 3 2 2 3 3 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 3 3 2[33] 2 2 3 2 2 2 3 2 2 3 3 2 2 3 2 3 2 2 1 1 1 1 1 1 1 3 1 1 3 1 1 1[65] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1[97] 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1[129] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1> #mode(kmeans.result$cluster)> # 计算数据对象与簇中心的距离> centers <- kmeans.result$centers[kmeans.result$cluster, ]> #class(centers)> distances <- sqrt(rowSums((iris2 - centers)^2))> # 挑选出前5个最大距离> outliers <- order(distances, decreasing &#61; T)[1:5]> # 输出异常值> print(outliers)[1] 119 118 132 123 106> print(iris2[outliers,])Sepal.Length Sepal.Width Petal.Length Petal.Width119 7.7 2.6 6.9 2.3118 7.7 3.8 6.7 2.2132 7.9 3.8 6.4 2.0123 7.7 2.8 6.7 2.0106 7.6 3.0 6.6 2.1> # 画出聚类结果> plot(iris2[,c("Sepal.Length", "Sepal.Width")], pch&#61;"o", col&#61;kmeans.result$cluster, cex&#61;0.3)> # 绘制类&#xff08;簇&#xff09;中心&#xff0c;用"*"标记> points(kmeans.result$centers[,c("Sepal.Length", "Sepal.Width")], col&#61;1:3, pch&#61;8, cex&#61;1.5)> # 画出异常值&#xff0c;用"&#43;"标记> points(iris2[outliers,c("Sepal.Length", "Sepal.Width")], pch&#61;"&#43;", col&#61;4, cex&#61;1.5)#####################################

                   

  在上图中&#xff0c;聚类中心被标记为星号&#xff0c;异常值标记为&#39;&#43;&#39;


4. 检验时间序列数据里面的异常值

  本部分讲述一个对时间序列数据进行异常检测的例子。在本例中&#xff0c;时间序列数据首次使用stl()进行稳健回归分解&#xff0c;然后识别异常值。

######################################### 使用稳健回归拟合f <- stl(AirPassengers, "periodic", robust&#61;TRUE)(outliers <- which(f$weights <1e-8))# 绘图布局op <- par(mar&#61;c(0, 4, 0, 3), oma&#61;c(5, 0, 4, 0), mfcol&#61;c(4, 1))plot(f, set.pars&#61;NULL)sts <- f$time.series# 画出异常值&#xff0c;用红色"x"标记points(time(sts)[outliers], 0.8*sts[,"remainder"][outliers], pch&#61;"x", col&#61;"red")par(op)########################################> # 使用稳健回归拟合> f <- stl(AirPassengers, "periodic", robust&#61;TRUE)> (outliers <- which(f$weights <1e-8))[1] 79 91 92 102 103 104 114 115 116 126 127 128 138 139 140> # 绘图布局> op <- par(mar&#61;c(0, 4, 0, 3), oma&#61;c(5, 0, 4, 0), mfcol&#61;c(4, 1))> plot(f, set.pars&#61;NULL)> sts <- f$time.series> # 画出异常值&#xff0c;用红色"x"标记> points(time(sts)[outliers], 0.8*sts[,"remainder"][outliers], pch&#61;"x", col&#61;"red")> par(op)########################################

                          

  在上图中&#xff0c;异常值用红色标记为&#39;x&#39;


5. 讨论

  LOF算法擅长检测局部异常值&#xff0c;但是它只对数值数据有效。Rlof包依赖multicore包&#xff0c;在Windows环境下失效。对于分类数据的一个快速稳定的异常检测的策略是AVF(Attribute Value Frequency)算法。

  一些用于异常检测的R包包括&#xff1a;

  extremevalues包&#xff1a;单变量异常检测

  mvoutlier包&#xff1a;基于稳定方法的多元变量异常检测

  outliers包&#xff1a;对异常值进行测验

 

转载自&#xff1a;https://www.cnblogs.com/cloudtj/articles/5519964.html


推荐阅读
author-avatar
周啸夫_919
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有