分享

Spark 高级分析:第五章第8节 特征归一化

本帖最后由 feilong 于 2018-4-20 09:05 编辑
问题导读

1.标准分数方程是什么?
2.如何将特征归一化

3.如何查看分析可视化结果?







上一篇:Spark 高级分析:第五章第7节 使用R语言可视化聚类结果
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24263&extra=


每个特性可以通过将其转换为标准分数来实现规范化。这意味着从每个值中减去特征值的均值,然后除以标准差,如方程5-1所示:
方程5-1 标准分数方程
图片1.png
这并不影响欧几里得距离。但是,对于一致性,无论如何,平均值都会被减去。

标准分数可以从每个特征的计数、总和和平方和计算出来。这是可以联合完成的,同时减少了用于一次添加整个数组的操作,以及用于从一组零中累积平方和的方法:
[mw_shl_code=scala,true]val dataAsArray = data.map(_.toArray)

val numCols = dataAsArray.first().length

val n = dataAsArray.count()

val sums = dataAsArray.reduce(

(a,b) => a.zip(b).map(t => t._1 + t._2))

val sumSquares = dataAsArray.fold(

new Array[Double](numCols)

)(

(a,b) => a.zip(b).map(t => t._1 + t._2 * t._2)

)

val stdevs = sumSquares.zip(sums).map {

case(sumSq,sum) => math.sqrt(n*sumSq - sum*sum)/n

}

val means = sums.map(_ / n)

def normalize(datum: Vector) = {

val normalizedArray = (datum.toArray, means, stdevs).zipped.map(

(value, mean, stdev) =>

if (stdev <= 0) (value - mean) else (value - mean) / stdev

)

Vectors.dense(normalizedArray)

}
[/mw_shl_code]
我们可以用规范化数据在更高的k范围内来运行相同的测试:
[mw_shl_code=scala,true]val normalizedData = data.map(normalize).cache()

(60 to 120 by 10).par.map(k =>

(k, clusteringScore(normalizedData, k))).toList.foreach(println)[/mw_shl_code]
这表明k = 100可能是个不错的选择:
[mw_shl_code=scala,true]
(60,0.0038662664156513646)

(70,0.003284024281015404)

(80,0.00308768458568131)

(90,0.0028326001931487516)

(100,0.002550914511356702)

(110,0.002516106387216959)

(120,0.0021317966227260106)[/mw_shl_code]
标准化数据点的另一个三维可视化显示了一个更丰富的结构,正如所期望的那样。一些点以规则的间隔,沿着一条直线间隔;这些可能是数据中离散维度的投影。有了100个集群,很难确定哪个点来自哪个集群。一个大的集群似乎占主导地位,许多集群对应于小的紧凑子区域(其中一些被忽略了整个三维可视化的放大细节)。结果,如图5-2所示,并不一定会促进分析,但是是一个有趣的完整性检查:
图片2.png
图5 - 2 规范化数据的随机三维投影



已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条