数据分析与R语言

时间:2022-07-31 15:47:06

数据结构

创建向量和矩阵

函数c(), length(), mode(), rbind(), cbind()

求平均值,和,连乘,最值,方差,标准差

函数mean(), sum(), min(), max(), var(), sd(), prod()

帮助文档

函数help()

生成向量

seq()

生成字母序列letters

新建向量

Which()函数,rev()函数,sort()函数

生成矩阵

函数matrix()

矩阵运算

函数t(),矩阵加减

矩阵运算

矩阵相乘,函数diag()

矩阵求逆,函数rnorm(),solve()

解线性方程组

函数solve(a,b)

矩阵的特征值与特征向量

函数eigen()

数据的R语言表示——数据框
矩阵形式,但列可以不同数据类型
每列是一个变量,每行是一个观测值

作图

画散点图

函数plot()

对x1进行直方图分析

绘制直方图函数hist()
hist(x$x1)

探索各科成绩的关联
列联表分析

列联函数table(),柱状图绘制函数barplot()
barplot(table(x$x1))

饼图

饼图绘制函数pie()
pie(table(x$x1))

箱尾图

箱子的上下横线为样本的25%和75%分位数
箱子中间的横线为样本的中位数
上下延伸的直线为尾线,尾线的尽头为最高值和最低值
异常值
boxplot(x$x1,x$x2,x$x3)

箱线图

boxplot(x[2:4],col = c("red","green","blue",notch=T))

水平放置的箱尾图
boxplot(x$x1,x$x2,x$x3,horizontal = T)

星相图

每个观测单位的数值表示一个图形
每个图形的每个角落表示一个变量,字符串类型会标注在图的下方
角线的长度表示值的大小
stars(x[c("x1","x2","x3")],full = T,draw.segments = T)

脸谱图

安装aplpack包
faces(x[c("x1","x2","x3")])
用五官的宽度和高度来描绘数值
人对脸谱高度敏感和强记忆
适合较少样本的情况

其他脸谱图

安装TeachingDemos包
faces2(x)

茎叶图

stem(x$x1)

QQ图

可用于判断是否正态分布
直线的斜率是标准差,截距是均值
点的散步越接近直线,则越接近正态分布
qqnorm(x1)
qqline(x1)
qqnorm(x3)
qqline(x3)

散点图的进一步设置

plot(x$x1,x$x2,main = "数学分析与线性代数成绩的关系",xlab = "数学分析",ylab = "线性代数",xlim = c(0,100),ylim = c(0,100),xaxs="i",yaxs="i",col = "red",pch = 19)

连线图

a = c(2,3,4,5,6)
b = c(4,7,8,9,12)
plot(a,b,type = "l")

多条曲线的效果

plot(rain$Tokyo,type = "l",col = "red",ylim = c(0,300),main = "Monthly Rainfall in major cities", xlab = "Month of Year", ylab = "Rainfall(mm)", lwd = 2)
lines(rain$NewYork,type = "l",col = "blue", lwd = 2)
lines(rain$London,type = "l",col = "green", lwd = 2)
lines(rain$Berlin,type = "l",col = "orange", lwd = 2)

密度图

函数density()
plot(density(rnorm(1000)))

R内置数据集
函数data()列出内置数据

热力图

利用内置的mtcars数据集绘制
data("mtcars")
heatmap(as.matrix(mtcars),Rowv = NA,Colv = NA,col = heat.colors(256),scale = "column",margins = c(2,8),main = "Car characteristics by Model")

Iris(鸢尾花)数据集
Sepal 花萼
Petal 花瓣
Species 种属

向日葵散点图

用来克服散点图中数据点重叠问题
在有重叠的地方用一朵“向日葵花”的花瓣数目来表示重叠数据的个数
sunflowerplot(iris[,3:4],col = "gold",seg.col = "gold")

散点图集

遍历样本中全部的变量配对画出二元图
直观地了解所有变量之间的关系
pairs(iris[,1:4])

用plot也可以实现同样的效果
plot(iris[,1:4],main = "Relationship between characteristics of iris flowers",pch = 19,col = "blue",cex = 0.9)

利用par()在同一个device输出多个散点图
Par命令博大精深,用于设置绘图参数,help(par)
par(mfrow=c(3,1))
plot(x1,x2)
plot(x2,x3)
plot(x3,x1)

关于绘图参数

Help(par)
有哪些颜色?Colors()

关于绘图参数
绘图设备

数据分析与R语言

位置控制参数
Main参数:

数据分析与R语言

Oma参数:

数据分析与R语言

三维散点图

安装scatterplot3d包
scatterplot3d(x[2:4])

三维作图

x <- y <- seq(-2*pi,2*pi,pi/15)
f <- function(x,y) sin(x) * sin(y)
z <- outer(x,y,f)
contour(x,y,z,col="blue")
persp(x,y,z,theta = 30,phi = 30,expand = 0.7,col = "lightblue")

调和曲线图

unison.r的代码
自定义函数
调和曲线用于聚类判断非常方便
source("d:/Rfile/unison.R")
unison(x[2:4])

地图

安装maps包
map("state",interior = F)
map("state",boundary = F,col = "red",add = T)
map('world',fill = T,col = heat.colors(10))

R实验:社交数据可视化

先下载安装maps包和geosphere包并加载

画出美国地图
map("state")
画出世界地图
map("world")

通过设置坐标范围使焦点集中在美国周边,并且设置一些有关颜色
xlim <- c(-171.738281,-56.601563)
ylim <- c(12.039321,71.856229)
map("world",col = "#f2f2f2",fill = T,bg="white",lwd = 0.05,xlim = xlim,ylim = ylim)

画一条弧线连线,表示社交关系
lat_ca <- 39.164141
lon_ca <- -121.64062
lat_me <- 45.21300
lon_me <- -68.906250
inter <- gcIntermediate(c(lon_ca,lat_ca),c(lon_me,lat_me),n=50,addStartEnd = T)
lines(inter)

继续画弧线
lat_tx <- 29.954935
lon_tx <- -98.701172
inter2 <- gcIntermediate(c(lon_ca,lat_ca),c(lon_tx,lat_tx),n=50,addStartEnd = T)
lines(inter2,col = "red")

装载数据

airports <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/airports.csv",header = T)
flights <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/flights.csv",header = T,as.is = T)

画出多重联系

fsub <- flights[flights$airline == "AA",]
for (j in 1:length(fsub$airline)) {
air1 <- airports[airports$iata == fsub[j,]$airport1,]
air2 <- airports[airports$iata == fsub[j,]$airport2,]

inter <- gcIntermediate(c(air1[1,]$long,air1[1,]$lat),c(air2[1,]$long,air2[1,]$lat),n=100,addStartEnd = T)

lines(inter,col = "black", lwd = 0.8)
}

数据操作

读取文本文件数据

先设置工作目录,把文本文件放于该目录下
(x = read.table("123.txt"))

读取剪贴板
文本或excel的数据均可通过剪贴板操作

读取excel文件数据
方法1:先把excel另存为空格分隔的prn文本格式再读取

合并数据框并保存到本地硬盘

#生成随机序列
num = seq(10378001,10378100)
x1 = round(runif(100,min = 80,max = 100))
x2 = round(rnorm(100,mean = 80,sd = 7))
x3 = round(rnorm(100,mean = 83,sd = 18))
x3[which(x3>100)] = 100
#合并成数据框
x = data.frame(num,x1,x2,x3)
#保存到本地硬盘
write.table(x,file = "G:/whj/Rfile/factor/mark.txt",col.names = F,row.names=F,sep = " ")

计算各科平均分

函数mean(), colMeans(), apply()
mean(x)
colMeans(x)[c("x1","x2","x3")]
apply(x, 2, mean)

求各科最高最低分

函数max(),min(),apply()
apply(x, 2, max)
apply(x, 2, min)

求每人总分

apply(x[c("x1","x2","x3")], 1, sum)

求总分最高

which.max(apply(x[c("x1","x2","x3")], 1, sum))
x$num[which.max(apply(x[c("x1","x2","x3")], 1, sum))]

统计模型

R语言的各种分布函数

数据分析与R语言

n = 10
rnorm(n,mean = 0,sd=1) #高斯(正态)
rexp(n,rate = 1) #指数
rgamma(n,shape,scale = 1) #γ分布
rpois(n,lambda) #Poisson分布
rweibull(n,shape,scale = 1) #Weibull分布
rcauchy(n,location = 0,scale = 1) #Cauchy分布
rbeta(n,shape1,shape2) #β分布
rt(n,df) #t分布
rf(n,df1,df2) #F分布
rchisq(n,df) #χ2分布
rbinom(n,size,prob) #二项
rgeom(n,prob) #几何
rhyper(nn,m,n,k) #超几何
rlogis(n,location = 0,scale = 1) #logistic分布
rlnorm(n,meanlog = 0,sdlog = 1) #对数正态
rnbinom(n,size,prob) #负二项分布
runif(n,min = 0,max = 1) #均匀分布
rwilcox(nn,m,n) #Wilcoxon分布
rsignrank(nn,n)

总体与抽样
大数定理与中心极限定理
常用统计量:样本均值,样本方差,标准差,众数,最小值,最大值,分位数,中位数,上下四分位数

常见的数据描述性分析
中位数 median()
百分位数 quantile()

正态性检验:函数shapiro.text()
P > 0.05,正态性分布

多元数据的数据特征
方差与协方差、相关系数

协方差与相关系数计算
函数cov()和cor()

相关分析与回归分析
相关分析的例子

Iris数据集

目测相关性
plot(iris[1,2])

分离种属
i1 = iris[which(iris$Species == "setosa"),1:2]
plot(i1)

求相关系数
相关系数是否显著,不能只根据值的大小还需要进行假设检验
cor(i1[1],i1[2])

相关系数显著性的假设检验

假设r0为总体相关系数,r0=0则说明没有相关系数,建立假设H0:r0=0,H1:r0<>0(alpha=0.05)
计算相关系数r的T值和P值
cor.test(i1$Sepal.Length,i1$Sepal.Width)

一元线性回归分析

原理,最小二乘法
步骤:建立回归模型,求解回归模型中的参数,对回归模型进行检验
数据:身高—体重

h = c(171,175,159,155,152,158,154,164,168,166,159,164)
w = c(57,64,41,38,35,44,41,51,57,49,47,46)
plot(w~h+1)

自定义函数

lxy <- function(x,y){
n = length(x);
sum(x * y) - sum(x) * sum(y)/n
}
假设w = a + bh
则有
b = lxy(h,w)/lxy(h,h)
a = mean(w) - b * mean(h)

作回归直线
lines(h,a + b * h)

回归系数的假设检验

建立线性模型
a = lm(w~1 + h)

线性模型的归总数据,t检验,summary()函数
summary(a)

汇总数据的解释:

residuals:残差分析数据
coefficients:回归方程的系数,以及推算的系数的标准差,t值、P值
F-statistic:F检验值
Signif:显著性标记,***极度显著,**高度显著,*显著,圆点不太显著,没有记号不显著

方差分析,函数anova()

lm()线性模型函数
适应于多元线性模型的基本函数是lm(),其调用形式是
fitted.model <- lm(formula,data = data.frame)
其中formula为模型公式,data.frame为数据框,返回值为线性模型结果的对象存放在fitted.model中
fm2 <- lm(y~x1 + x2,data = production)
适应于y关于x1和x2的多元回归模型(隐含截距项)

y~1 + x或y~x均表示y = a + bx有截距形式的线性模型
通过原点的线性模型可以表达为:y~x - 1或y~0 + x

建立数据:身高-体重
x = c(171,175,159,155,152,158,154,164,168,166,159,164)
y = c(57,64,41,38,35,44,41,51,57,49,47,46)

建立线性模型
a = lm(y~x)
求模型系数
coef(a)
提取模型公式
formula(a)

与线性模型有关的函数

计算残差平方和
deviance(a)
绘制模型诊断图(很强大,显示残差、拟合值和一些诊断情况)
plot(a)
计算残差
residuals(a)
打印模型信息
print(a)
计算方差分析表
anova(a)
提取模型汇总资料
summary(a)
作出预测
z = data.frame(x = 185)
predict(a,z)
predict(a,z,interval = "prediction",level = 0.95)

多元线性回归

RSS(残差平方和)与R2(相关系数平方)选择法:遍历所有可能的组合,选出使RSS最小,R2最大的模型。
AIC(Ask information criterion)准则与BIC(Bayesian information criterion)准则
AIC = n In (RSSp/n) + 2p
n为变量总个数,p为选出的变量个数,AIC越小越好

逐步回归

向前引入法:从一元回归开始,逐步增加变量,使指标值达到最优为止
向后剔除法:从全变量回归方程开始,逐步删去某个变量,使指标值达到最优为止
逐步筛选法:综合以上两种方法

step()函数
使用drop1作删除试探,使用add1函数作增加试探

回归诊断
样本是否符合正态分布假设?
是否存在离群值导致模型产生较大误差?
线性模型是是否合理?
误差是否满足独立性、等方差、正态分布等假设条件?
是否存在多重共线性?

正态分布检验

正太性检验:函数shapiro.test()
P>0.05,正态性分布

残差
残差计算函数residuals()
对残差作正态性检验

多重共线性
多重共线性对回归模型的影响
利用计算特征根发现多重共线性
kappa()函数

广义线性模型
目标:求出电流强度与牛是否张嘴之间的关系
困难:牛是否张嘴,是0-1离散变量,不是连续变量,无法建立线性回归模型
矛盾转化:牛张嘴的概率是连续变量

a = c(0:5)
b = c(0,0.129,0.3,0.671,0.857,0.9)
plot(a,b)

符合logistic回归模型的曲线特征

Logit变换

广义线性模型建模函数:glm()
fitted.model <- glm(formula,family = family.generator,data = data.frame)
gm <- glm(formula,family = binomial(link = logit),data = data.frame)

norell <- data.frame(x=0:5,n=rep(70,6),success=c(0,9,21,47,60,63))
norell$Ymat <- cbind(norell$success,norell$n - norell$success)
glm.sol <- glm(Ymat~x,family = binomial,data = norell)
summary(glm.sol)

非线性模型

例子:销售额x与流通费率y
x = c(1.5,2.8,4.5,7.5,10.5,13.5,15.1,16.5,19.5,22.5,24.5,26.5)
y = c(7.0,5.5,4.6,3.6,2.9,2.7,2.5,2.4,2.2,2.1,1.9,1.8)
plot(x,y)

直线回归(R2值不理想)
lm.1=lm(y~x)
summary(lm.1)

多项式回归,假设用二次多项式方程y=a+bx+cx2
x1=x
x2=x^2
lm.2=lm(y~x1+x2)
summary(lm.2)
plot(x,y)
lines(x,fitted(lm.2))

对数法,y=a+blogx
lm.log=lm(y~log(x))
plot(x,y)
lines(x,fitted(lm.log))

指数法,y=aebx
lm.exp=lm(log(y)~x)
summary(lm.exp)
plot(x,y)
lines(x,exp(fitted(lm.exp)))

幂函数法,y=axb
lm.pow=lm(log(y)~log(x))
summary(lm.pow)
plot(x,y)
lines(x,exp(fitted(lm.pow)))

对比以上各种拟合回归过程得出结论是幂函数法为最佳

非线性最小二乘问题
Nls()函数

网格方法

方法概要:用网格判断数据的集中程度,集中程度意味着是否有关联关系
方法具有一般性,即无论数据是怎样分布的,不限于特定的关联函数类型,此判断方法都是有效
方法具有等效性,计算的熵值和噪音的程度有关,跟关联的类型无关

MIC值计算

坐标平面被划分为(x,y)网格G(未必等宽),其中xy<n0.6
在G上可以诱导出“自然概率密度函数”P(x,y),任何一个方格(box)内的概率密度函数值为这个方格所包含的样本点数量占全体样本点的比例
计算网格划分G下的mutual information值IG
构造特征矩阵{mxy},矩阵的元素mxy=max{IG}/log min{x,y}。max取遍所有可能的(x,y)网格G
MIC=max{mxy}。Max取遍所有可能的(x,y)对

MIC的性质

如果变量对x,y存在函数关系,则当样本数增加时,MIC必然趋向于1
如果变量对x,y可以由参数方程c(t)=[x(t),y(t)]所表达的曲线描画,则当样本数增加时,MIC必然趋于1
如果变量对x,y在统计意义下互相独立,则当样本数增加时,MIC趋于0

对基因数据集spellman的探索
数据集包含6223组基因数据
MINE对关联关系的辨认力明显强于以往的方法,例如双方都发现了HTB1,但MINE方法挖出了过去未被发现的HSP12

数据挖掘

数据挖掘:关联规则挖掘

例子:购物篮分析
挖掘数据集:购物篮数据
挖距目标:关联规则
关联规则:牛奶=>鸡蛋[支持度=2%,置信度=60%]
支持度:分析中的全部事物的2%同时购买了牛奶和鸡蛋
置信度:购买了牛奶的筒子有60%页购买了鸡蛋
最小支持度阈值和最小置信度阈值:由挖掘者或领域专家设定

项集:项(商品)的集合
K-项集:k个项组成的项集
频繁项集:满足最小支持度的项集,频繁k-项集一般记为Lk
强关联规则:满足最小支持度阈值和最小置信度阈值的规则

两步过程:找出所有频繁项集;有频繁项集产生强关联规则
算法:Apriori

步骤说明
扫描D,对每个候选项计数,生成候选1-项集C1
定义最小支持度阈值为2,从C1生成频繁1-项集L1
通过L1xL1生成候选2-项集C2
扫描D,对C2里每个项计数,生成频繁2-项集L2
计算L3xL3,利用apriori性质:频繁项集的子集必然是频繁的,可以删去一部分项,从而得到C3,由C3再经过支持度计数生成L3
可见Apriori算法可以分成连接,剪枝两个步骤不断循环重复

用R进行购物篮分析

安装arules包并加载
内置Groceries数据集
inspect(Groceries) #查看数据集里的数据

求频繁项集
frequentsets = eclat(Groceries,parameter = list(support = 0.05,maxlen=10))

查看频繁项集
inspect(frequentsets[1:10])
#根据支持度对求得的频繁项集排序并查看
inspect(sort(frequentsets,by="support")[1:10])

利用Apriori函数提取关联规则
rules = apriori(Groceries,parameter = list(support = 0.01 , confidence = 0.5))

列出关联规则
summary(rules) #查看求得的关联规则摘要
inspect(rules)

按需要筛选关联规则
#求所需要的关联规则子集
x=subset(rules,subset = rhs %in% "whole milk" & lift >= 1.2)
#根据支持度对求得的关联规则子集排序并查看
inspect(sort(x,by = "support")[1:5])

其中lift=P(L,R)/(P(L)P(R))是一个类似相关系数的指标。Lift=1时表示L和R独立。这个数越大,越表明L和R存在在一个购物篮中不是偶然现象。

购物篮分析的应用

超市里的货架摆设设计
电子商务网站的交叉推荐销售
网站或节目的阅读/收听推荐

常见分类模型与算法

线性判别法
距离判别法
贝叶斯分类器
决策树
支持向量机(SVN)

线性判别法(Fisher)
例子:天气预报数据
G = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
x1 = c(-1.9,-6.9,5.2,5.0,7.3,6.8,0.9,-12.5,1.5,3.8,0.2,-0.1,0.4,2.7,2.1,-4.6,-1.7,-2.6,2.6,-2.8)
x2 = c(3.2,0.4,2.0,2.5,0.0,12.7,-5.4,-2.5,1.3,6.8,6.2,7.5,14.6,8.3,0.8,4.3,10.9,13.1,12.8,10.0)
a = data.frame(G,x1,x2)
plot(x1,x2)
text(x1,x2,G,adj = -0.5)

线性判别法的原理

用一条直线来划分学习集(这条直线一定存在吗?)
然后根据待测点在直线的哪一边决定它的分类

MASS包与线性判别函数lda()
library(MASS)
ld=lda(G~x1+x2)

分类判断
z=predict(ld)
newG=z$class
y=cbind(G,z$x,newG)

距离判别法

原理:计算待测点与各类的距离,取最短者为其所属分类
马氏距离,计算函数mahalanobis()

程序与例子
利用贝叶斯分类器判断垃圾邮件
多分类下的距离判别法
多分类下的贝叶斯

决策树decision tree
输入:学习集
输出:分类规则(决策树)

例子:
用SNS社区中不真实账号检测的例子说明如何使用ID3算法构造决策树。为了简单起见,假设训练集合包含10个元素。其中s、m和l分别表示小、中和大。

信息增益
设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。

根据信息增益选择分裂属性
对于特征属性为连续值,可以如此计算ID3算法:先将D中元素按照特征属性排序,则每两个相邻元素的中间点可以看做潜在分裂点,从第一个潜在分裂点开始,分裂D并计算两个集合的期望信息,具有最小期望信息的点称为这个属性的最佳分裂点,其信息期望作为此属性的信息期望。

R语言实现决策树:rpart扩展包

iris.rp = rpart(Species~.,data = iris,method = "class")
plot(iris.rp,uniform=T,branch=0,margin=0.1,main="Classification Tree\nIris Species by Petal and Sepal Length")
text(iris.rp,use.n=T,fancy=T,col = "blue")

Knn算法

算法主要思想:
1,选取k个和待分类点距离最近的样本点
2,看1中样本点的分类情况,投票决定待分类点所属的类

人工神经网络

人工神经网络
输入节点
输出节点
权向量
偏置因子
激活函数
学习率

多层前馈神经网络
隐藏层与隐藏节点
前馈——每一层的节点仅和下一层节点相连

使用R语言实现人工神经网络

安装AMORE包
P <- matrix(sample(seq(-1,1,length = 1000),1000,replace = F),ncol = 1)
target <- P^2
net <- newff(n.neurons = c(1,3,2,1),learning.rate.global = 1e-2,momentum.global = 0.5,error.criterium = "LMS",Stao = NA,hidden.layer = "tansig",output.layer = "purelin",method = "ADAPTgdwm")
result <- train(net,P,target,error.criterium = "LMS",report = T,show.step = 100,n.shows = 5)
y <- sim(result$net,P)
plot(P,y,col = "blue",pch = "+")
points(P,target,col = "red",pch = "x")

人工神经网络应用

用BP神经网络处理非线性拟合问题
随机抽选2000个样本。1900个作为学习集,100个作为验证集
先使用2-5-1类型的BP神经网络进行训练和拟合
建立神经网络模型并用学习集进行训练

#BP神经网络构建
net = newff(inputn,outputn,5)
#网络参数配置(迭代次数,学习率,目标)
net.trainParam.epochs = 100
net.trainParam.lr = 0.1
net.trainParam.goal = 0.00004
#BP神经网络训练
net = train(net,inp)

影响精度的因素

训练样本数量
隐含层数与每层节点数。层数和节点太少,不能建立复杂的映射关系,预测误差较大。但层数和节点数过多,学习时间增加,还会产生“过度拟合”的可能。预测误差随节点数呈现先减少后增加的趋势。

Hopfield神经网络

人类的联想记忆能力
Hopfield人工神经网络能模拟联想记忆功能
Hopfield人工神经网络按动力学方式运行

OCR的思路

把图像信息数字化为1和-1二值矩阵
标准图样生成的矩阵作为Hopfield网络的目标向量
生成Hopfield网络
输出已经降噪,再和标准目标矩阵(向量)比对,找出最接近者

神经网络方法的优缺点

可以用统一的模式去处理高度复杂问题
便于元器件化,形成物理机器
中间过程无法从业务角度进行解释
容易出现过度拟合问题

支持向量机(SVN)

问题的提出:最有分离平面(决策边界)

优化目标
决策边界边缘距离最远
问题转化为凸优化

问题的解决和神经网络化

对偶公式是二次规划问题,有现成的数值方法可以求解
大部分的拉格朗日乘子为0,不为0的对应于“支持向量”(恰好在边界上的样本点)
只要支持向量不变,修改其他样本点的值,不影响结果,当支持变量发生改变时,结果一般就会变化。
求解出拉格朗日乘子后,可以推出w和b

关键度量指标:距离
绝对值距离
欧氏距离
闵可夫斯基距离
切比雪夫距离
马氏距离
Lance和Williams距离
离散变量的距离计算

Dist()函数
x1=c(1,2,3,4,5)
x2=c(3,2,1,4,6)
x3=c(5,3,5,6,2)
x=data.frame(x1,x2,x3)
dist(x,method = "binary")

数据中心化与标准化变换

目的:使到各个变量平等地发挥作用
Scale()函数
极差化。Sweep()函数

scale(x,center = T,scale = T)

对变量进行分类的指标:相似系数
距离:对样本进行分类
相似系数:对变量进行分类
常用相似系数:夹角余弦,相关系数

(凝聚的)层次聚类法
思想
1,开始时,每个样本各自作为一类
2,规定某种度量作为样本之间的距离及类与类之间的距离,并计算之
3,将距离最短的两个类合并为一个新类
4,重复2-3,即不断合并最近的两个类,每次减少一个类,直至所有样本被合并为一类

各种类与类之间距离计算的方法
最短距离法
最长距离法
中间距离法
类平均法
重心法
离差平方和法

Hclust()函数
x <- c(1,2,6,8,11)
dim(x) <- c(5,1)
d <- dist(x)
hc1 <- hclust(d,"single")
hc2 <- hclust(d,"complete")
hc3 <- hclust(d,"median")
hc4 <- hclust(d,"mcquitty")
opar <- par(mfrow = c(2,2))
plot(hc1,hang = -1)
plot(hc2,hang = -1)
plot(hc3,hang = -1)
plot(hc4,hang = -1)
par(opar)

各种谱系图画法

as.dendrogram()函数
dend1 <- as.dendrogram(hc1)
opar <- par(mfrow=c(2,2),mar = c(4,3,1,2))
plot(dend1)
plot(dend1,nodePar=list(pch=c(1,NA),cex=0.8,lab.cex=0.8),type = "t",center=T)
plot(dend1,edgePar=list(col=1:2,lty=2:3),dLeaf=1,edge.root = T)
plot(dend1,nodePar=list(pch=2:1,cex=.4*2:1,col=2:3),horiz=T)
par(opar)

对变量进行聚类分析
分多少个类
Rect.hclust()函数

plot(hc1,hang = -1)
rect.hclust(hc1,k=2)

动态聚类:K-means方法
算法:
1,选择K个点作为初始质心
2,将每个点指派到最近的质心,形成K个簇(聚类)
3,重新计算每个簇的质心
4,重复2-3直至质心不发生变化

Kmeans()函数
x = iris[,1:4]
km = kmeans(x,3)

K-means算法的优缺点
有效率,而且不容易受初始值选择的影响
不能处理非球形的簇
不能处理不同尺寸,不同密度的簇
离群值可能有较大干扰(因此要先剔除)

基于有代表性的点的计数:K中心聚类法

算法步骤
1,随机选择k个点作为“中心点”
2,计算剩余的点到这k个中心点的距离,每个点被分配到最近的中心点组成聚簇
3,随机选择一个非中心点Or,用它代替某个现有的中心点Oj,计算这个代换的总代价s
4,如果S<0,则用Or代替Oj,形成新的k个中心点集合
5,重复2,直至中心点集合不发生变化

K中心法的实现:PAM

PAM使用离差平均和来计算成本S(类似于ward距离的计算)
R语言的cluster包实现了PAM
K中心法的优点:对于“噪音较大和存在离群值的情况,K中心法更加健壮,不像kmeans那样容易受到极端数据影响
k中心法的缺点:执行代价更高

Cluster包的pam()函数

x=iris[,1:4]
kc=pam(x,3)

基于密度的方法:DBSCAN
本算法将具有足够高密度的区域划分为簇,并可以发现任何形状的聚类

若干概念

R-邻域:给定点半径r内的区域
核心点:如果一个点的r-邻域至少包含最少数目M个点,则称该点为核心点
直接密度可达:如果点p在核心点q的r-邻域内,则称p是从q出发可以直接密度可达
如果存在点链p1,p2,…,pn,p1=q,pn=p,pi+1是从pi关于r和M直接密度可达,则称点p是从q关于r和M密度可达的
如果样本集D中存在点o,使得点p、q是从o关于r和M密度可达的,那么点p、q是关于r和M密度相连的

算法基本思想

1,指定合适的r和M
2,计算所有的样本点,如果点p的r-邻域里有超过M个点,则创建一个以p为核心点的新簇
3,反复寻找这些核心点直接密度可达(之后可能是密度可达)的点,将其加入到相应的簇,对于核心点发生“密度相连”状况的簇,基于合并
4,当没有新的点可以被添加到任何簇时,算法结束
DBSCAN算法描述
输入:包含n个对象的数据库,半径e,最少数目MinPts;
输出:所有生成的簇,达到密度要求
1,Repeat
2,从数据库中抽出一个未处理的点
3,IF抽出的点是核心点THEN找出所有从该点密度可达的对象,形成一个簇
4,ELSE抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点
5,UNTIL所有的点都被处理

DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。

孤立点检测

又称为异常检测,离群值检测等
孤立点是一个观测值,它与其他观测值的差别如此之大,以至于怀疑它是由不同的机制产生的
孤立点的一些场景
1,网站日志中的孤立点,试图入侵者
2,一群学生中的孤立点,天才or白痴
3,天气数据,灾害,极端天气
4,信用卡行为,试图欺诈者
5,低概率事件,接种疫苗后却发病
6,实验误差或仪器和操作问题造成的错误数据

统计方法
检测一元正态分布中的离群点,指出里均值标准差数

多元正态分布的离群值
判断点到分布中心的距离(马氏距离,why?)

基于邻近度的孤立点检测
选取合适的正整数k
计算每个点个前k个最近邻的平均距离,得到孤立度指标
如果孤立度超过预定阈值,则找到孤立点

基于聚类的孤立点检测
首先聚类所有的点
对某个待测点评估它属于某一簇的程度。方法是设定义目标函数(例如kmeans法时的簇的误差平方和),如果删去此点能显著地改善此项目目标函数,则可以将该点定位为孤立点

因子分析

主成分分析

一种多变量统计方法
通过提取主成分显示出最大的个别差异,也用来削减回归分析和聚类分析中变量的数目
可以使用样本协方差矩阵或相关系数矩阵作为出发点进行分析
成分的保留:Kaiser主张将特征值小于1的成分放弃,只保留特征值大于1的成分
如果能用不超过3-5个成分就能解释变异的80%,就算是成功

通过对原始变量进行线性组合,得到优化的指标
把原先多个指标的计算降维为少量几个经过优化指标的计算
基本思想:设法将原先众多具有一定相关性的指标,重新组合为一组新的相互独立的综合指标,并代替原先的指标

因子分析

降维的一种方法,是主成分分析的推广和发展
用于分析隐藏在表面现象背后的因子作用的统计模型。试图用最少个数的不可测的公共因子的线性函数与特殊因子之和来描述原来观测的每一分量。

主要用途

减少分析变量个数
通过对变量相关关系的探索,将原始变量分组,即将相关性高的变量分为一组,用共性因子来代替该变量。
使问题背后的业务因素的意义更加清晰呈现。

与主成分分析的区别

主成分分析侧重“变异量”,通过转换原始变量为新的组合变量使得数据的“变异量”最大,从而把样本个体之间的差异最大化,但得出的主成分往往从业务场景的角度很难解释。

因子分析更重视相关变量的“共异变量”,组合的是相关性较强的原始变量,目的是找到在背后起作用的少量关键因子,因子分析的结果更容易用业务知识加以解释。

使用复杂的数学手段

比主成分分析更加复杂的数学模型
求解模型的方法:主成分法,主因子法,极大似然法
结果还可以通过因子旋转,使得业务意义更加明显。

统计意义

因子载荷的意义
共同度
特殊方差
总方差贡献

因子载荷矩阵和特殊方差矩阵的估计
主成分法
主因子法
极大似然法

主成分法
通过样本估计期望和协方差阵
求协方差阵的特征值和特征向量
省去特征值较小的部分,求出A、D

例子:
首先对变量标准化
给出m和特殊方差的估计(初始)值
求出简约相关阵R(ρ阶方阵)
计算R
的特征值和特征向量,娶妻前m个,略去其他部分
求出A和D,再迭代计算

极大似然法
似然函数
极大似然法

方差最大的正交旋转

由于因子载荷矩阵不是唯一,有时因子的实际意义会变得难以解释
因子载荷矩阵的正交旋转
因子载荷方差
载荷值趋于1或趋于0,公共因子具有简单化的结构
Varimax()函数

因子分析函数factanal()

#函数factanal()采用极大似然法估计参数,其使用格式为
factanal(x,factors,data = NULL,covmat = NULL,n.obs = NA,subset,na.action,start = NULL,scores = c("none","regreesion","Bartlett"),retation = "varimax",control = NULL,...)

其中x是数据的公式,或者是由数据(每个样本按行输入)构成的矩阵,或者是数据框,factors是因子的个数,data是数据框,当x由公式形式给出时使用。covmat是样本的协方差矩阵或样本的相关矩阵,此时不必输入变量x.scores表示因子得分的方法,scores=”regression”,表示用回归方法计算因子得分,当参数为scores=”Bartlett”,表示用Bartlett方法计算因子得分,缺省值为”none”,即不计算因子得分,retation表示旋转,缺省值为方差最大旋转,当rotation=”none”时,不作旋转变换。


Copyright ©  吴华锦
雅致寓于高阁渔舟唱晚,古典悠然
格调外发园林绿树萦绕,馥郁清香