评价是现代社会各领域的一项经常性的工作,是科学做出管理决策的重要依据。随着人们研究领域的不断扩大,所面临的评价对象日趋复杂,如果仅依据单一指标对事物进行评价往往不尽合理,必须全面地从整体的角度考虑问题,多指标综合评价方法应运而生。所谓多指标综合评价方法,就是把描述评价对象不同方面的多个指标的信息综合起来,并得到一个综合指标,由此对评价对象做一个整体上的评判,并进行横向或纵向比较。
而在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。当原始数据不同维度上的特征的尺度(单位)不一致时,需要标准化步骤对数据进行预处理。
目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响,然而不幸的是,在数据标准化方法的选择上,还没有通用的法则可以遵循。
数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上,常见的数据归一化的方法有:min-max标准化(Min-max normalization),log函数转换,atan函数转换,z-score标准化(zero-mena normalization,此方法最为常用),模糊量化法。本文只介绍min-max法(规范化方法),z-score法(正规化方法),比例法(名字叫啥不太清楚,归一化方法)。
最常见的标准化方法就是Z标准化;也是SPSS中最为常用的标准化方法,也叫标准差标准化,
代码示例:
using ScikitLearn,DataFrames
using CSV,CSVFiles
using StatsBase,Statistics
using RDatasets,StaticArrays,DataStructures
using Clustering, Plots
##################################标准差标准化 z-score 标准化(zero-meannormalization)
#不分类直接标准化
#标准化所有的列,直接改变原值,不会增加额外的存储空间,这种方式处理效率最高
h_mean = map(mean,eachcol(iris[!,1:end-1]))
h_sdt = map(std,eachcol(iris[!,1:end-1]))
h,c = size(iris[!,1:end-1])
for col in 1:c
mean_v=h_mean[col]
std_v = h_sdt[col]
println(mean_v)
for hex in 1:h
@inbounds iris[hex,col] = (iris[hex,col]-mean_v)/std_v
end
end
features = collect(Matrix(iris[:, 1:4])')
result = kmeans(features, 3)
scatter(iris.PetalLength, iris.PetalWidth, marker_z=result.assignments,
color=:lightrainbow, legend=false)
#标准化指定的列,但是会增加额外的存储空间
function standardization_v(v::AbstractArray)
iris_array = v
mean_v = mean(v)
std_v = std(v)
col = [i-mean_v for i in iris_array[1:end] ]/std_v
return col
end
r = map(standardization_v, eachcol(iris[!,1:end-1], false)) #
iris_standardization_v = insertcols!(DataFrame(r),5,:x5=>convert(Array{String},iris[1:end,5]))
features = collect(Matrix(iris_standardization_v[:, 1:4])')
result = kmeans(features, 3)
scatter(iris_standardization_v.x3, iris_standardization_v.x4, marker_z=result.assignments,
color=:lightrainbow, legend=false)
using ScikitLearn,DataFrames
using CSV,CSVFiles
using StatsBase,Statistics
using RDatasets,StaticArrays,DataStructures
using Clustering, Plots
#Iris 鸢尾花数据集是一个经典数据集,这里面有三个品种的数据,所以需要分类标准化
iris = dataset("datasets", "iris"); # load the data
######### 归一化方法
h_sum = map(sum,eachcol(iris[!,1:end-1]))
h,c = size(iris[!,1:end-1])
for col in 1:c
sum_v=h_sum[col]
for hex in 1:h
@inbounds iris[hex,col] = iris[hex,col]/sum_v
end
end
features = collect(Matrix(iris[:, 1:4])')
result = kmeans(features, 3)
scatter(iris.SepalLength, iris.SepalWidth, marker_z=result.assignments,
color=:lightrainbow, legend=false)
用反正切函数也可以实现数据的归一化,使用这个方法需要注意的是如果想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上。
using ScikitLearn,DataFrames
using CSV,CSVFiles
using StatsBase,Statistics
using RDatasets,StaticArrays,DataStructures
using Clustering, Plots
#Iris 鸢尾花数据集是一个经典数据集,这里面有三个品种的数据,所以需要分类标准化
iris = dataset("datasets", "iris"); # load the data
##################################atan函数转换 反正切函
#atan标准化指定的列,但是会增加额外的存储空间
function standardization_atan(v::AbstractArray)
iris_array = v
col = [atan(i) for i in iris_array[1:end] ]
return col
end
r = map(standardization_atan, eachcol(iris[!,1:end-1], false)) #
#atan标准化所有的列,直接改变原值,不会增加额外的存储空间,这种方式处理效率最高
for col in eachcol(iris[!,1:end-1], false)
for i in eachindex(col)
@inbounds col[i] = tand(col[i])
end
end
features = collect(Matrix(iris[:, 1:4])')
result = kmeans(features, 3)
scatter(iris.PetalLength, iris.PetalWidth, marker_z=result.assignments,
color=:lightrainbow, legend=false)
也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:
##################################标准差标准化 min-max标准化(Min-maxnormalization)
#标准化指定的列,但是会增加额外的存储空间
function standardization_v(v::AbstractArray)
iris_array = v
min_v = min(v)
max_v = max(v)
col = [i-min_v for i in iris_array[1:end] ]/max_v
return col
end
r = map(standardization_v, eachcol(iris[!,1:end-1], false)) #
iris_standardization_v = insertcols!(DataFrame(r),5,:x5=>convert(Array{String},iris[1:end,5]))
features = collect(Matrix(iris_standardization_v[:, 1:4])')
result = kmeans(features, 3)
scatter(iris_standardization_v.x3, iris_standardization_v.x4, marker_z=result.assignments,
color=:lightrainbow, legend=false)