写给开发者的机器学习指南(十二)

为了能够看到我们的PCA组合词,我们现在应该通过调整代码将道琼斯指数添加到图中:

First we add this to the def top method

 //Verificationagainst DJI
    valverificationDataPath = basePath + "PCA_Example_2.csv"
    valverificationData = getDJIFromFile(new File(verificationDataPath))
    val DJIIndex =getDJIFromFile(new File(verificationDataPath))
   canvas.line("Dow Jones Index", DJIIndex._2,Line.Style.DOT_DASH, Color.BLUE)

接下我们将引进下面两个方法:

def getDJIRecordFromString(dataString: String):(Date,Double) = {
    //Split thecomma separated value string into an array of strings
    val dataArray:Array[String] = dataString.split(',')
    val format =new SimpleDateFormat("yyyy-MM-dd")
    //Extract thevalues from the strings
    val date =format.parse(dataArray(0))
    val close: Double= dataArray(4).toDouble
    //And returnthe result in a format that can later 
    //easily beused to feed to Smile
    (date,close)
  }
  defgetDJIFromFile(file: File): (Array[Date],Array[Double]) = {
    val source =scala.io.Source.fromFile(file)
    //Get all therecords (minus the header)
    val data =source
        .getLines()
        .drop(1)
        .map(x=> getDJIRecordFromString(x)).toArray
    source.close()
    //turn thetuples into two separate arrays for easier use later on
    val sortedData= data.sortBy(x => x._1)
    val dates =sortedData.map(x => x._1)
    val doubles =sortedData.map(x =>   x._2 )
    (dates,doubles)
  }

此代码加载DJI数据,并将其添加到已经包含我们自己的股票市场指数的图形上。但是,当我们执行这段代码时,结果如下。

正如你所看到的,DJI的范围和我们计算的特征都很远。 这就是为什么我们现在需要规范化数据。这个想法是,我们根据数据的范围来缩放数据,这样两个数据集的规模都是相同的。

Replace the getDJIFromFile method with the following:

def getDJIFromFile(file: File):(Array[Date],Array[Double]) = {
    val source =scala.io.Source.fromFile(file)
    //Get all the records (minus the header)
    val data =source
        .getLines()
        .drop(1)
        .map(x=> getDJIRecordFromString(x))
        .toArray
    source.close()
    //turn thetuples into two separate arrays for easier use later on
    val sortedData= data.sortBy(x => x._1)
    val dates =sortedData.map(x => x._1)
    val maxDouble =sortedData.maxBy(x => x._2)._2
    val minDouble =sortedData.minBy(x => x._2)._2
    val rangeValue= maxDouble - minDouble
    val doubles =sortedData.map(x =>   x._2 /rangeValue )
    (dates,doubles)
  }
and replace the plotData definition in the methoddef top with
val maxDataValue = points.maxBy(x => x(0))
val minDataValue = points.minBy(x => x(0))
val rangeValue = maxDataValue(0) - minDataValue(0)
val plotData = points
    .zipWithIndex
    .map(x =>Array(x._2.toDouble, -x._1(0) / rangeValue))

我们看到,即使DJI的数据在0.8和1.8之间,但我们的新特征的范围在-0.5和0.5之间,回归线对应得很好。 有了这个例子,并在一般部分中的PCA的解释,你现在应该能够使用PCA并将其应用到您自己的数据。

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2016-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SeanCheney的专栏

《Pandas Cookbook》第09章 合并Pandas对象

1481
来自专栏ml

Java 基础知识点(必知必会其二)

   1.如何将数字输出为每三位逗号分隔的格式,例如“1,234,467”?    1 package com.Gxjun.problem; 2 3 i...

3835
来自专栏web前端教室

javascript 红皮高程(15)

接上一次,今次来讲操作符的 按位非(NOT) 这个,按位非操作符是,~ 波浪线,而它的执行结果,就是返回数值的反码。 ========== 这个反码是什么意思?...

1835
来自专栏五分钟学算法

LeeCode题目图解

There is an English version of README here. just click it!

1552
来自专栏LhWorld哥陪你聊算法

Hadoop源码篇--Reduce篇

Reduce文件会从Mapper任务中拉取很多小文件,小文件内部有序,但是整体是没序的,Reduce会合并小文件,然后套个归并算法,变成一个整体有序的文件。

2181
来自专栏码匠的流水账

聊聊storm的WindowedBolt

storm-2.0.0/storm-client/src/jvm/org/apache/storm/topology/IWindowedBolt.java

2054
来自专栏Albert陈凯

2018-04-17 Java的Collection集合类3分钟搞掂Set集合前言

3分钟搞掂Set集合 前言 声明,本文用的是jdk1.8 现在这篇主要讲Set集合的三个子类: HashSet集合 A:底层数据结构是哈希表(是一个元素为链...

2977
来自专栏张善友的专栏

C#全角和半角转换

在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角"。在汉字输入时,系统提供"半角"...

24810
来自专栏大数据杂谈

【Excel】用公式提取Excel单元格中的汉字

2425
来自专栏码匠的流水账

聊聊storm的WindowedBolt

storm-2.0.0/storm-client/src/jvm/org/apache/storm/topology/IWindowedBolt.java

752

扫码关注云+社区