Categories
读书有感

统计学习精要(The Elements of Statistical Learning)课堂笔记(二十五):降维和PCA

 降维

降维完全属于unsupervised learning了,即给定数据集,我们希望降到q维的。从这个角度来讲,降维和聚类还是有相通之处的,都是对于特征的提取。只是一个从行的角度出发,一个对列操作的感觉。

PCA(主成分分析,Principle Component Analysis)

个人觉得这也是起名字起的比较好的模型之一...乍一听起来很有用的感觉 -_-||

1. 求,使得,且最大。

PCA

直觉上来讲,就是想寻找一个主方向。

这样,求解问题为:

。所以我们只需要求一阶导数即可。

设A为对称矩阵,则存在正交阵使得,其中为A的特征值矩阵,故(列向量为特征向量)。不失一般性,我们可以排序使得(从大到小排序)。

最大特征值:

同时为x的相关矩阵,,从而

2. 找到(q维的子空间)

投影到该q维空间,这样,且最小。

A矩阵的范数:
tr表示矩阵的迹(对角线元素和)。

则上述问题等价于,求使得最小。

最小。

即使得最大(注意没有负号)。

称为数据的相似矩阵

均为对称阵,且两个阵有相同的特征值。记为A的秩,AA'的特征向量,A'A的特征向量,则。做奇异值分解,则.

由此,求得的和前述结果等价。

回到PCA。如果降维后需要重构,则,解即可。

3. 对偶PCA。如果即数据非常高的时候,可以转置后再做。

4. KPCA (kernel)PCA也可以先用核函数,即实现非线性的降维。需要注意,降维的过程需要保持可逆。

---------------

PS. PCA不适合解决overfitting的问题。如果需要解决,加regularization项。

Categories
读书有感

统计学习精要(The Elements of Statistical Learning)课堂笔记(二十四):聚类

聚类讲的比较简单...怎么感觉老师不怎么待见unsupervised learning捏?...

---------------笔记开始---------------------

1. 一般概念

1)分类与聚类(分类标识)

评测纯度。我们有测试集,这样定义纯度为.

2) 输入

  • 特征向量的表示:
  • 相似矩阵的表示:,其中相似度的计算可以是的内积。显然,向量表示很容易可以计算相似度表示。
  • 距离矩阵的表示(不相似度):,其中距离可以用二阶范数定义,比如

3) 输出: ,对应K个聚类。这里还分为:

  • 非层次的
  • 层次的(类似于树结构)

2. K-means方法(非层次聚类)

(注意不要和KNN搞混了,都是K开头的...)

1) K-means方法(特征表示)

输入:,K——聚类的个数。

算法:

初始化,随机选定类中心.

  • (i)根据分配到距离最近的类。
  • (ii)修改,使得。重复上面两步。

2) K-medoids方法(相似度表示)

输入:s,k

初始化。然后根据分配,再按照确定新的中心。

3) 模糊的K-means方法

输入:,K

初始化。

  • (i) ,计算,然后根据这个距离的比重来“软”分配(需要归一化分配权重)。
  • (ii) ,利用中的进行加权平均。

重复上述两步。

4) 谱聚类(向量表示)

输入:,K

然后对原始数据做转换,形成新的数据集,然后再做K-means聚类。

其中转换的步骤如下:

  • (i) 计算相似矩阵S
  • (ii) 计算L=D-S,其中
  • (iii)计算L最小的K个特征值对应的特征向量
  • (iv)让U=,则是U的第i行,这样就从p维降到了K维。
  • (v)对Z进行K-means聚类。

3. 层次聚类

1) 自底向上的方法(聚合)

初始:每个都为一类

而后对于最相似的两类,合并到一类。对于类的最相似,可以定义为距离最近的类。而对于距离,则可以定义为三者之一:

  • (i) ,称之为单连。
  • (ii) ,称之为全连。
  • (iii) .

2) 自顶向下的方法(分裂)

初始:所有的x作为一类。选用一种非层次的方法进行聚类,递归使用。

例子:二分法。

初始:。而后选择离G最远的一个点g。

修改。重复步骤,选择离H近的离G远的逐渐加入H。

直到分不动了,彻底分为两类。

---------------------

下节课讲的是降维方法。

Categories
事儿关经济

中文文本聚类小尝试(Text Clustering in R)

众所周知的,我会经常百无聊赖的玩一些比较好玩的东西。比如画画旅行地图啦,恶搞一下COS的版猪啦,抓抓新浪围脖啦。这不R大会又要开始了么,有一点点小数据也要玩玩啦。比如,呃,君不见周六上午三场演讲都是文本挖掘的,那我不研究一下文本挖掘怎么去混演讲听啊~自己动手先。

A nearby galaxy cluster about 65 million light years from Earth.
文本挖掘自然也有有个情景嘛。这不正好会议要排日程表嘛,那得把我们16个讲座分成四个半天,每天大约4场。这个应该怎么分呢?从直觉上来说,听众肯定是希望相关的话题放在相邻的时间,这样他们就可以选择自己感兴趣的时间段去听啦,不用在那里一坐两天。同时也便于之后的集中讨论嘛。于是这个目的就是:根据演讲的题目、摘要和关键字,进行聚类。这显然是一个无监督的学习嘛,我又没有一个特定的结果变量。

那么首先,自然是要对中文文本进行分词啦。这个嘛就可以偷个懒,直接用现成的R包rmmseg4j。(中间鼓捣若干编码问题,不赘述...)

然后就是聚类。这里继续偷懒,调用现成的文本处理包tm,可以直接生成文本词对应的矩阵。比如,一个编号为1的句子是 “我 在 中国”,编号为2的句子是“我 爱 中国” 那么生成的矩阵就是:

句子 我 在 中国 爱

1 1 1 1 0

2 1 0 1 1

就是说,把每个词都作为一个变量,然后统计它在每个句子出现的次数作为变量值。这样一来,如果总共有10个句子,有不重复的100个词,那么就会给出一个10×100的矩阵了。

有了这个矩阵之后,我们就相当于知道了每个个体的观测特征,那么就可以聚类了。比较简单的,可以直接算余弦相似度(比如google识别相似新闻的做法);也可以调用kmeans聚类。这里我们的摘要直接不会有特别多的相似,所以余弦相似度的区分度可能会不好。那么就先试试kmeans吧。

到这里,代码如下:

#读数据
library(xlsx)

presentations <- read.xlsx("r-presentations.xlsx", sheetName="Sheet1") #读excel数据

summary(presentations)

presentations$Title <- as.character(presentations$Title) #转文本

Encoding(presentations$Title) <- "UTF-8" #转换编码

presentations$Title

presentations$Abstract <- as.character(presentations$Abstract)

Encoding(presentations$Abstract) <- "UTF-8"

presentations$Abstract

presentations$KeyWords <- as.character(presentations$KeyWords)

Encoding(presentations$KeyWords) <- "UTF-8"

#分词

library("rmmseg4j")

presentations$raw_word <-with(presentations,paste0(KeyWords,Abstract, sep=";")) #连接所有标题、摘要、关键字

presentations$raw_word <- with(presentations, str_replace_all(raw_word, "R","")) #去掉r

presentations$seg <- mmseg4j(presentations$raw_word) #分词

#kmeans聚类

library("tm")

presebtation_seg <- Corpus(DataframeSource(presentations[,c("Title","seg")])) #转换到tm专用格式

presebtation_term <- TermDocumentMatrix(presebtation_seg, control = list(stopwords = TRUE)) #生成词频矩阵

presebtation_term <- t(as.matrix(presebtation_term)) #转换为matrix并转置

summary(presebtation_term)

presebtation_kmeans <- kmeans(presebtation_term, 7) #kmeans聚为7类

为什么我会在kmeans里面聚成7类呢?理论上只是要聚4类嘛。可是直接聚四类的话,区分度没那么好,一半多的演讲都聚到一类去了,没法安排嘛~所以只能增加聚类的个数,看看到时候再把小类合并。

聚成7类的结果如下:

Title cluster_result
R语言在eBay搜索引擎反馈与测试中的应用 1
营销分析模型及其在广告界的应用 2
系统生物学和转换医学中的R语言 + R in Systems Biology and Translational Medicine 3
R/Bioconductor在生物多维组学数据整合中的应用 3
R Case Study from EBAY APD 4
网络用户浏览路径分析 4
啤酒与尿布的当代版--商品分析在电子商务中的应用 4
基于RHadoop的关联规则挖掘 5
模型预测的利器——随机森林 5
基于R的地理信息系统 (R-based GIS) 6
R语言和其他计算机语言的混合编程 6
ggplot和knitr包简介 6
R与面向对象统计分析 6
twitteR包入门和应用 6
短文本分类器与电商品类数据挖掘 7
R语言环境下的文本挖掘 7

比较理想的是,聚类之后识别出来了两个文本挖掘的演讲...还有一堆R包的演讲。但是还是没法安排演讲嘛。看到这里,大家有没有发现,这样做最大的问题就是,聚类的时候把一些没有实际意义的虚词也聚类进来了,比如“的”;还有一些几乎所有演讲都会涉及的词,比如“R”和“分析”。这些词在其中是没有意义的,也会影响我们算dissimilarity的结果——这到底是按内容聚类啊,还是按作者的行文风格聚类啊?此外,虽然我们规定演讲摘要大都在100-200字,但还是有长有短,到目前我还没有对文本的出现频率用语句长度来加权...这也是不科学的嘛。那些原来在Google搜搜里面排名作弊的,不就是同样的内容复制10几次,来提高关键词出现频数(而不是频率)嘛。

为了解决这些问题,首先就是要去掉没有意义的虚词。这个不算太麻烦,把一些常用的虚词和转折词连接词之类去掉就可以了。其次,要去掉每个演讲都有的词。这里虽然可以一个个去看,不过简单一点,我们先统计一下词频嘛:

#高频词统计

presentations$seg2 <- unique((strsplit(presentations$seg,split=" "))) #断词

all_key_words <- iconv(unlist(presentations$seg2), from="UTF-8", to="GBK") #转换到GBK编码

all_key_words_fre <- as.data.frame(table(all_key_words)) #统计词频

names(all_key_words_fre)

all_key_words_fre <- arrange(all_key_words_fre,desc(Freq)) #按词频排序

all_key_words_fre[1:20,]$all_key_words #100个高频词

然后看一下TOP 20高频词:

1 的 105

2 数据 27

3 分析 24

4 和 21

5 图 18

6 在 17

7 挖掘 15

8 用户 15

9 应用 14

10 分类 13

11 了 13

12 语言 13

13 介绍 11

14 是 11

15 文本 11

16 试验 10

17 平台 9

18 ebay 9

19 案例 8

20 模型 8

所以看来,“挖掘”,“用户”,“文本”,“试验”,“平台”,“ebay”,“案例”,“模型”等等还是比较有区分度的词。按照这个思路,选择有限的几十个词重新分类,效果可能会有所改善。

此外,鉴于样本量不大(16个),所以可以人工的去看每个简介,手动标注tag作为聚类的变量。事实上,最后我还是这么做了一下,来在上述原始聚类结果上进行了一下重新的分组处理,形成了4大类。但是这个东西也不完全是可以直接用的,总要考虑时间之类的其他因素。最终的结果更多是人工思考的排序,估计李舰哥在确定顺序的时候更多的是按照经验和以往R会议的风俗。算法虽然好玩,但毕竟捕捉的还是人的思维模式,暂时没办法完美的取代吧。不过其实也差的不远呢。

最终人工结果:

冯兴东:R语言和其他计算机语言的混合编程

刘思喆:R语言环境下的文本挖掘

张翔:短文本分类器与电商品类数据挖掘

沈羽、周春英:R语言在eBay搜索引擎反馈与测试中的应用

周扬:基于R的地理信息系统

肖凯:twitteR包入门和应用

陈钢:系统生物学和转换医学中的R语言

杭兴宜:R / Bioconductor在生物多维组学数据整合中的应用

陈逸波:基于RHadoop的关联规则挖掘

李忠:R Case Study from EBAY APD

洪健飞:啤酒与尿布的当代版——商品分析在电子商务中的应用

廖明:营销分析模型及其在广告界的应用

肖嘉敏:网络用户浏览路径分析

刘成昊:模型预测的利器——随机森林

王雨晨:R与面向对象统计分析

魏太云:R基础作图与可重复研究

纯属好玩而已~不过R会议也举行了整整五届了,每次15个演讲的话也有15*9=135个演讲了。在这个样本量下,如果我们要出个论文集什么的,倒是可以直接用聚类的办法划分chapter了...嘻嘻。

Categories
读书有感

≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(一)

前两天微博上转出来的,复旦计算机学院的吴立德吴老师在开?统计学习精要(The Elements of Statistical Learning)?这门课,还在张江...大牛的课怎能错过,果断请假去蹭课...为了减轻心理压力,还拉了一帮同事一起去听,eBay浩浩荡荡的十几人杀过去好不壮观!总感觉我们的人有超过复旦本身学生的阵势,五六十人的教室坐的满满当当,壮观啊。

这本书正好前阵子一直在看,所以才会屁颠屁颠的跑过去听。确实是一本深入浅出讲data mining models的好书。作者网站上提供免费的电子版下载,爽!http://www-stat.stanford.edu/~tibs/ElemStatLearn/

从这周开始,如无意外我会每周更新课堂笔记。另一方面,也会加上自己的一些理解和实际工作中的感悟。此外,对于data mining感兴趣的,也可以去coursera听课~貌似这学期开的machine learning评价不错。我只在coursera上从众选了一门 「Model Thinking」,相对来说比较简单,但是相当的优雅!若有时间会再写写这门课的上课感受。笔记我会尽量用全部中文,但只是尽量...

------------课堂笔记开始--------

第一次上课,主要是导论,介绍这个领域的关注兴趣以及后续课程安排。对应本书的第一章。

1. 统计学习是?从数据中学习知识。简单地说,我们有一个想预测的结果(outcome),记为Y,可能是离散的也可能是连续的。同时,还有一些观察到的特征(feature),记为X,X既可能是一维的也可能是多维的。对于每一个观测个体,我们都会得到一个行向量,对应它的p个特征的观测值,以及一个观测到的结果值。如果总共有N个个体,那么我们对于每个个体都会得到这些值,则有为观测结果的列向量以及X (n*p)矩阵。这样的数据称之为训练数据集(training set)。这里更多是约定一些notation。

2. 统计学习分类?一般说来,我们有个观测到的结果Y,然后找到一个适合的模型根据X预测Y,这样的称之为有监督的学习(supervised learning)。而有些时候,Y是无法观测到的,那么只是通过X来学习,称之为无监督的学习(unsupervised learning)。这本书主要侧重有监督的学习。

3. 回归和分类器。这个主要和Y有关。如果Y为离散,比如红黄蓝不同颜色,则称之为分类器(学习模型);反之,若Y为连续,比如身高,则称之为回归(学习模型)。这里更多只是称谓上的区别。

4. 统计学习的任务?预测。通过什么来预测?学习模型(learning models)。按照什么来学习?需要一定的准则,比如最小均方误差MSE,适用于分类器的0-1准则等。基于这些准则、优化过的实现方法称之为算法。

5. 统计学习举例?

分类器:依据邮件发信人、内容、标题等判断是否为垃圾邮件;

回归:前列腺特异抗原(PSA)水平与癌症等因素的关系;

图形识别:手写字母的识别;

聚类:根据DNA序列判断样本的相似性,如亲子鉴定。

6. 课程安排顺序?

第二章,是对于有监督的学习模型的概览。

第三章和第四章将讨论线性回归模型和线性分类器。

第五章将讨论广义线性模型(GLM)。

第六章涉及kernel方法和局部回归。

第七章是模型评价与选择。

第八章是测侧重算法,比如最大似然估计,bootstrap等。本学期预计讲到这里。所以后面的我就暂时不列出了。

目测第二节开始将变得越来越难,前阵子自学第二章痛苦不已啊...一个LASSO就折磨了我好久。当时的读书笔记见:降维模型若干感悟

--------10.15补充---------

上周写的时候只是凭着记忆,笔记没在身边。今天重新翻了翻当时记下的课堂笔记,再补充一些吧。

第九章是可加模型,即

第十章是boosting模型

第十一章讨论神经网络

第十二章讨论支持向量机 (Support Vector Machine)

第十三章设计原型方法(Prototype)

第十四章从有监督的学习转到无监督的学习(即有X有Y->有X无Y)

第十五章讨论随机森林模型(Random Forest)

第十六章是集群学习

第十七章结构图模型

第十八章高维问题(我最近一直念叨的curse of dimensionality...今年搞笑诺贝尔奖也多少与此有关,见 http://www.guokr.com/article/344117/,还有一篇相关的paper

ps. 吴老师对于随机森林等等模型的评论也挺有意思的,大致是,大家都没搞清随机森林为什么效果这么好...而且这一类模型都是computatoinal intensive的,即有一个非常简单的idea然后借助大量的计算来实现。此外,这类方法更多有“猜”的感觉,无法知道来龙去脉,在现实中显得不那么intuitive...(不像econometrics那般致力于causality呢)。