目录
现在使用MLlib的API实现下载房屋数据集,准备数据,拟合线性回归模型,使用模型预测示例目标值的过程。
分析和准备数据
从在线存储库下载房屋数据集(housing.data)(GitHub),并使用以下代码加载数据:
val housingLines = sc.textFile("first-edition/ch07/housing.data", 6)
val housingVals = housingLines.map(x => Vectors.dense(x.split(",").map(_.trim().toDouble)))
为housingLines RDD使用了6个分区,但是可以根据集群环境选择其他值。现在已将数据解析并作为Vector对象使用。
分析数据分布
要了解数据,可以先对它进行汇总,可以从相应的RowMatrix对象获取该值:
val housingMat = new RowMatrix(housingVals)
val housingStats = housingMat.computeColumnSummaryStatistics()
housingStats.min
或者可以使用Statistics对象达到目的:
import org.apache.spark.mllib.stat.Statistics
val housingStats=Statistics.colStats(housingVals)
然后可以使用获取的MultivariateStatisticalSummary对象来检查矩阵每列中的平均值(mean)、最大值(max)和最小值(min),使用normL1和normL2方法获取每个列的L1范数和L2范数,使用variance方法获得每列的方差。
方差:是数据离散程度的度量,等于所有值与它们的平均值的平方差的均值。
标准差:是方差的二次方根。
协方差:是衡量两个变量相关的程度。
分析列余弦相似性
val housingColSims = housingMat.columnSimilarities()
//UTILITY METHOD FOR PRETTY-PRINTING MATRICES
def printMat(mat:BM[Double]) = {
print(" ")
for(j <- 0 to mat.cols-1)
print("%-10d".format(j));
println
for(i <- 0 to mat.rows-1) {
print("%-6d".format(i));
for(j <- 0 to mat.cols-1)
print(" %+9.3f".format(mat(i, j)));
println
}
}
printMat(toBreezeD(housingColSims))
/* SHOULD GIVE:
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 +0,000 +0,004 +0,527 +0,052 +0,459 +0,363 +0,482 +0,169 +0,675 +0,563 +0,416 +0,288 +0,544 +0,224
1 +0,000 +0,000 +0,122 +0,078 +0,334 +0,467 +0,211 +0,673 +0,135 +0,297 +0,394 +0,464 +0,200 +0,528
2 +0,000 +0,000 +0,000 +0,256 +0,915 +0,824 +0,916 +0,565 +0,840 +0,931 +0,869 +0,779 +0,897 +0,693
3 +0,000 +0,000 +0,000 +0,000 +0,275 +0,271 +0,275 +0,184 +0,190 +0,230 +0,248 +0,266 +0,204 +0,307
4 +0,000 +0,000 +0,000 +0,000 +0,000 +0,966 +0,962 +0,780 +0,808 +0,957 +0,977 +0,929 +0,912 +0,873
5 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,909 +0,880 +0,719 +0,906 +0,982 +0,966 +0,832 +0,949
6 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,672 +0,801 +0,929 +0,930 +0,871 +0,918 +0,803
7 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,485 +0,710 +0,856 +0,882 +0,644 +0,856
8 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,917 +0,771 +0,642 +0,806 +0,588
9 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,939 +0,854 +0,907 +0,789
10 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,957 +0,887 +0,897
11 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,000 +0,799 +0,928
12 +0,000 +0,000 +0,000 +0,000 +0