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

Using unsupervised learning to mergefeatures (PCA)

PCA的基本思想是减少问题的维度。 这对于消除维度诅咒或合并数据可能是有用的,这样您可以看到数据中的趋势,而没有相关数据的噪声。

在这个例子中,我们将使用PCA去合并2002-2012年间来自24个股票的股票价格为1.这个单一价值(随着时间的推移)表示基于这24个股票的数据的股票市场指数。将这24个股票价格合并为1大量减少了要处理的数据量,并减少了我们的数据的维度,这是一个很大的优势,如果我们后来应用其他机器学习算法,如回归预测。为了看到我们的特征从24减少到1,我们将比较同一时间段的我们的结果与道琼斯指数(DJI)。

下一步是加载数据。 为此,我们为您提供2个文件:数据文件1和数据文件2。

object PCA extends SimpleSwingApplication{
  def top = newMainFrame {
    title ="PCA Example"
    //Get theexample data
    val basePath ="/users/.../Example Data/"
    valexampleDataPath = basePath + "PCA_Example_1.csv"
    val trainData =getStockDataFromCSV(new File(exampleDataPath))
    }
  defgetStockDataFromCSV(file: File): (Array[Date],Array[Array[Double]]) = {
    val source =scala.io.Source.fromFile(file)
    //Get all therecords (minus the header)
    val data =source
        .getLines()
        .drop(1)
        .map(x=> getStockDataFromString(x))
        .toArray
    source.close()
    //group allrecords by date, and sort the groups on date ascending
    valgroupedByDate = data.groupBy(x => x._1).toArray.sortBy(x => x._1)
    //extract thevalues from the 3-tuple and turn them into
    // an array oftuples: Array[(Date, Array[Double)]
    valdateArrayTuples = groupedByDate
        .map(x=> (x._1, x
                       ._2
                       .sortBy(x => x._2)
                       .map(y => y._3)
                   )
            )
    //turn thetuples into two separate arrays for easier use later on
    val dateArray =dateArrayTuples.map(x => x._1).toArray
    val doubleArray= dateArrayTuples.map(x => x._2).toArray
   (dateArray,doubleArray)
  }
  defgetStockDataFromString(dataString: String): (Date,String,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 stock:String = dataArray(1)
    val close:Double = dataArray(2).toDouble
    //And returnthe result in a format that can later 
    //easily beused to feed to Smile
   (date,stock,close)
  }
}
With this training data, and the fact that we already know that we want tomerge the 24 features into 1 single feature, we can do the PCA and retrieve thevalues for the datapoints as follows.
//Add to `def top`
val pca = new PCA(trainData._2)
pca.setProjection(1)
val points = pca.project(trainData._2)
val plotData = points
    .zipWithIndex
    .map(x =>Array(x._2.toDouble, -x._1(0) ))
val canvas: PlotCanvas = LinePlot.plot("MergedFeatures Index",
                                        plotData, 
                                        Line.Style.DASH,
                                        Color.RED);
peer.setContentPane(canvas)
size = new Dimension(400, 400)

该代码不仅是PCA,而且也绘制了结果,特征值在y轴上,单独的天数在x轴上。

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

HDUOJ------(1272)小希的迷宫

小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav...

38390
来自专栏Crossin的编程教室

【每周一坑】乒乓数

刚从假期回来,又要迎接周末,各位看官想必都很辛苦,所以本周每周一坑为大家准备一道简单的甜点题目,本题取材于伯克利大学 CS61 课程 homework02。 求...

31360
来自专栏WOLFRAM

九宫格数独游戏

24680
来自专栏chenjx85的技术专栏

leetcode-441-Arranging Coins

15340
来自专栏HansBug's Lab

1627: [Usaco2007 Dec]穿越泥地

1627: [Usaco2007 Dec]穿越泥地 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 504  So...

27270
来自专栏WOLFRAM

用 Wolfram 语言来做2017年高考数学试题之天津理科卷

18940
来自专栏数据结构与算法

P1613 跑路

题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资,...

29390
来自专栏大数据挖掘DT机器学习

【手把手教你做项目】自然语言处理:单词抽取/统计

作者 白宁超 成都信息工程大学硕士。 近期关注数据分析统计学、机器学习。 原文:http://www.cnblogs.com/baiboy/p/zryy1.ht...

33350
来自专栏JadePeng的技术博客

从编辑距离、BK树到文本纠错

搜索引擎里有一个很重要的话题,就是文本纠错,主要有两种做法,一是从词典纠错,一是分析用户搜索日志,今天我们探讨使用基于词典的方式纠错,核心思想就是基于编辑距离,...

66360
来自专栏大数据挖掘DT机器学习

【手把手教你做项目】自然语言处理:单词抽取/统计

作者 白宁超 成都信息工程大学硕士。 近期关注数据分析统计学、机器学习。 原文:http://www.cnblogs.com/baiboy/p/zryy1.h...

350130

扫码关注云+社区

领取腾讯云代金券