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

为了能够看到我们的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 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

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

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

31270
来自专栏大数据杂谈

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

33050
来自专栏PPV课数据科学社区

【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)

SAS生成新变量 SAS支持基本的加减乘除,值得一提的是它的**代表指数,而不是^。 * Modify homegarden data set with ass...

49640
来自专栏码匠的流水账

聊聊storm的WindowedBolt

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

9520
来自专栏ml

HDUOJ------Lovekey

Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J...

30090
来自专栏HansBug's Lab

3402: [Usaco2009 Open]Hide and Seek 捉迷藏

3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MB ...

34870
来自专栏张善友的专栏

C#全角和半角转换

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

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

Hadoop源码篇--Reduce篇

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

29710
来自专栏JetpropelledSnake

Django学习笔记之Django ORM Aggregation聚合详解

在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序。Djngo...

10820
来自专栏SeanCheney的专栏

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

27510

扫码关注云+社区

领取腾讯云代金券