Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 标准化后,我得到NA、NAN和1e+;00类型值_R - Fatal编程技术网

R 标准化后,我得到NA、NAN和1e+;00类型值

R 标准化后,我得到NA、NAN和1e+;00类型值,r,R,我有一个5000行785列的数据集。数据集由0-255之间的整数组成。我想要的是规范化最小-最大[0,1]范围,不包括第一列。为此,我编写了以下代码。 总结的结果(MNIST)给了我 summary(MNIST[c("X14","X234", "X643", "X543", "X666")]) X14 X234 X643 X543 X666 Min. :0 Min. : 0.0

我有一个5000行785列的数据集。数据集由0-255之间的整数组成。我想要的是规范化最小-最大[0,1]范围,不包括第一列。为此,我编写了以下代码。 总结的结果(MNIST)给了我

summary(MNIST[c("X14","X234", "X643", "X543", "X666")])
X14         X234             X643               X543             X666       
Min.   :0   Min.   :  0.00   Min.   :  0.0000   Min.   :  0.00   Min.   :  0.00  
1st Qu.:0   1st Qu.:  0.00   1st Qu.:  0.0000   1st Qu.:  0.00   1st Qu.:  0.00  
Median :0   Median :  0.00   Median :  0.0000   Median :  0.00   Median :  0.00  
Mean   :0   Mean   : 73.45   Mean   :  0.0298   Mean   : 79.43   Mean   :  3.49  
3rd Qu.:0   3rd Qu.:169.00   3rd Qu.:  0.0000   3rd Qu.:199.00   3rd Qu.:  0.00  
Max.   :0   Max.   :255.00   Max.   :149.0000   Max.   :255.00   Max.   :255.00  

normalize <- function(x) { // even tried with function(x,na.rm = TRUE) {
return ((x - min(x)) / (max(x) - min(x)))
}  

MNIST_n <- as.data.frame(lapply(MNIST[2:785], normalize)) //MNIST is orignal dataset and MNIST_n is normalised
我怎样才能去掉NA和NAN以及像0e+00这样的值
我注意到它只在min和max有0个值时出现

您需要在对
min()
max()
的每个函数调用中输入
na.rm=TRUE


normalize问题是,不能将常量列规格化为[0,1]中的值。您可以向函数中添加以下内容:

normalize <- function(x) { 
 z=x
 if(min(x)<max(x)){ 
  z=(x - min(x)) / (max(x) - min(x))
 }
 return(z)
}  

normalize我相信这会奏效:

normalize <- function(x) { 
   minx = min(x)
   maxx = max(x)
   if(minx == maxx) {
       return(x)
   } else {
       return( (x - minx) / (maxx - minx) )
   }

}  

normalize它将在任何时候发生
min(x)=max(x)
因为“normalize”函数被零除,因此您得到的结果是NA's抱歉,我被您将NA.rm参数放在normalize函数调用中而不是放在min和max调用中分散了注意力。其他答案指向您可能的实际问题。我也会将其插入我的代码中,这样谷歌就不会复制不完整的代码。更新后,我得到这些值“0e+00”,而且在coulmn 1中,我得到的是0.5而不是00+e00。这不是问题,只是意味着0。之所以使用这种符号,是因为其中一个汇总统计数据,即平均值,太小,无法很好地用0.0002的正常符号表示在表中。0.5值是正常值,因为它确实是我在没有正确的标准化解决方案时插入的值,因为您不接受NA或NaN。您可以插入任何其他内容,或原始值,或任何对应用程序有利的内容。如果向量中的所有值都是0,您希望它们是什么,以便它们的范围从0扩展到1?没有正确的解决办法。回答得好。但是,规范化的目的是将不同的列带入相同的范围,因此,可能最好返回一个固定值,如0.5,而不是原始值。@mpjdem我不同意最后的建议。规范化常数毫无意义,报告任意答案不太可能有用,也可能会产生误导。奥托,我会对一个真正的理论基础感兴趣。它确实没有数学意义。但是,根据应用程序的不同(例如,在同一个图形上绘制所有变量以供目视检查),可能不希望有一个变量远远超出所有其他变量的范围。如果NA和NaN不可接受,则没有“正确”的解决方案来规范化数据,这将取决于应用程序,IMO.@mpjdem OK。对于绘图,如果变量很重要,我会报告哪些变量是常量。在一列中绘制0.5将浪费空间。X14上仍然是NA?它甚至没有标准化任何克隆
normalize <- function(x) { 
 z=x
 if(min(x)<max(x)){ 
  z=(x - min(x)) / (max(x) - min(x))
 }
 return(z)
}  
 normalize <- function(x) {
   return(ifelse(min(x)<max(x),(x - min(x)) / (max(x) - min(x)),x))
 }
 normalize <- function(x,const=mean(x)) {
   return(ifelse(min(x)<max(x),(x - min(x)) / (max(x) - min(x)),const))
 }
normalize <- function(x) { 
   minx = min(x)
   maxx = max(x)
   if(minx == maxx) {
       return(x)
   } else {
       return( (x - minx) / (maxx - minx) )
   }

}