R语言与数据分析之三:分类算法1

分类算法与我们的生活息息相关,也是目前数据挖掘中应用最为广泛的算法,如:已知系列的温度、湿度的序列和历史的是否下雨的统计,我们需要利用历史的数据作为学习集来判断明天是否下雨;又如银行信用卡诈骗判别。

分类问题都有一个学习集,根据学习集构造判别函数,最后根据判别函数计算我们所需要判别的个体属于哪一类的。

常见的分类模型与算法

传统方法

1、线性判别法;2、距离判别法;3、贝叶斯分类器;

现代方法:

1、决策树;2、支持向量机;3、神经网络;

线性判别法:

天气预报数据(x1,x2分别为温度和湿度,G为是否下雨)

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)

观察上图可以1点分布在右下方区域,2点主要分布在上方区域,肉眼可见这两个集合分离的比较明显,线性判别法的原理就是在平面中找出一条直线,使得属于学习集1号的分布在直线一侧,属于学习集2号的分布在直线另一侧。

判别式是允许有出差的,只要在一定的范围内即可。

R语言的表达如下:

library(MASS)
ld=lda(G~x1+x2)
z=predict(ld)
newG=z$class
y=cbind(G,z$x,newG)

由上左图可以看出,首先计算先验概率,数据中1,2各占50%,然后计算x1和x2的平均值,最后给出了判别函数的代数表达:

观察上右图可见,newG为预测的判别,可见两类分别只有一个判错,同时可以见判别函数的值为正值时判为第2类,判别函数值为负值时判为第1类。

距离判别法

计算待测点和各类的距离,选择最近的分类进行归类。其中距离的计算非常关键,常见的距离为马氏距离:

R语言没有自动距离判别法的函数,我们需要自己手动写:

myDiscriminiant<- function(TrnX1,TrnX2,TstX =NULL,var.equal=FALSE)
{
	if(is.null(TstX)==TRUE) TstX <- rbind(TrnX1,TrnX2)
	if(is.vector(TstX)==TRUE) TstX<- t(as.matrix(TstX))
	else if(is.matrix(TstX) !=TRUE)
		TstX <- as.matrix(TstX)
	if(is.matrix(TrnX1)!=TRUE) TrnX1 <- as.matrix(TrnX1)
	if(is.matrix(TrnX2)!=TRUE) TrnX2 <- as.matrix(TrnX2)
	nx <- nrow(TstX)
	blong <- matrix(rep(0,nx),nrow=1,byrow=TRUE,dimnames=list("blong",1:nx))
	mu1 <-colMeans(TrnX1);mu2 <- colMeans(TrnX2)
	if(var.equal==TRUE || var.equal==T){
		S<- var(rbind(TrnX1,TrnX2))
		w<- mahalanobis(TstX,mu2,S)-mahalanobis(TstX,mu1,S)
	}
	else{
		S1<-var(TrnX1);S2<-var(TrnX2)
		w<-mahalanobis(TstX,mu2,S2)-mahalanobis(TstX,mu1,S1)
	}
	for(i in 1:nx){
		if(w[i]>0)
			blong[i] <- 1
		else
			blong[i] <- 2
	}
	blong
}

保存到当前空间后,在控制台调用它:

classX1 <- data.frame(
			x1=c(6.6,6.6,6.1,6.1,8.4,7.2,8.4,7.5,7.5,8.3,7.8,7.8),
			x2=c(39,39,47,47,32,6,113,52,52,113,172,172),
			x3=c(1,1,1,1,2,1,3.5,1,3.5,0,1,1.5)
 )
 classX2 <- data.frame(
			x1=c(8.4,8.4,8.4,6.3,7,7,7,8.3,8.3,7.2,7.2,7.2,5.5,8.4,8.4,7.5,7.5,8.3,8.3,8.3,8.3,7.8,7.8),
			x2=c(32,32,32,11,8,8,8,161,161,6,6,6,6,113,113,52,52,97,97,89,56,172,283),
			x3=c(1,2,2.5,4.5,4.5,6,1.5,1.5,0.5,3.5,1.0,1.0,2.5,3.5,3.5,1,1,0,2.5,0,1.5,1,1)
)
source("myDiscriminiant.R")
myDiscriminiant(classX1,classX2,var.equal=TRUE)

观看blong就可以看出个体属于哪一分类

贝叶斯分类器:

计算个体属于所有分类的概率,根据概率大小选择所属分类,已两个总体总体的判别情况来看,X1,X2分别具有概率密度函数f1(x)和f2(x),则样本实际来自X1却误判为X2的概率为:

同样来自X2却误判为X1的概率简单转换下即可;

来自X1也被判为X1的概率为:

来自X2也被判为X2的也类似

设p1,p2分别表示X1和X2的先验概率,则

用L(1|2)表示X2被误判为X1的损失,其他类似,为了是分类越准确,则需降低平均误判损失(expected
cost of misclassification:ECM)越小越好:

上式便为Bayes版别式。

按照上述数学推导,我们构建自己的两个总体的Bayes判别程序:

myBayes <- function(TrnX1,TrnX2,rate=1,TstX=NULL,var.equal=FALSE){
	if(is.null(TstX)==TRUE) TstX<-rbind(TrnX1,TrnX2)
	if(is.vector(TstX)==TRUE) TstX<-t(as.matrix(TstX))
	else if(is.matrix(TstX)!=TRUE)
		TstX <- as.matrix(TstX)
	if(is.matrix(TrnX1)!=TRUE) TrnX1 <- as.matrix(TrnX1)
	if(is.matrix(TrnX2)!=TRUE) TrnX2 <- as.matrix(TrnX2)
	nx <- nrow(TstX)
	blong <- matrix(rep(0,nx),nrow=1,byrow=TRUE,dimnames=list("blong",1:nx))
	mu1 <-colMeans(TrnX1);mu2 <- colMeans(TrnX2)
	if(var.equal==TRUE || var.equal==T){
		S<- var(rbind(TrnX1,TrnX2))
		w<- mahalanobis(TstX,mu2,S)-mahalanobis(TstX,mu1,S)
	}
	else{
	S1<-var(TrnX1);S2<-var(TrnX2)
	beta <-2*log(rate)+log(det(S1)/det(S2))
	w<-mahalanobis(TstX,mu2,S2)-mahalanobis(TstX,mu1,S1)
	}
	for(i in 1:nx){
		if(w[i]>beta)
			blong[i] <- 1
		else
			blong[i] <- 2
	}
	blong
}

以天气预报为案例,我们看看如何使用Bayse分类器:

我们在控制台录入数据:

TrnX1<- matrix(
	c(24.8,24.1,26.6,23.5,25.5,27.4,
		-2,-2.4,-3,-1.9,-2.1,-3.1),
	ncol=2)
TrnX2<-matrix(
	c(22.1,21.6,22,22.8,22.7,21.5,22.1,21.4,
		-0.7,-1.4,-0.8,-1.6,-1.5,-1,-1.2,-1.3),
	ncol=2)
source("myBayes.R")
myBayes(TrnX1,TrnX2,rate=8/6)

下图可见所有的样本全部判别正确:

时间: 2024-08-06 19:45:27

R语言与数据分析之三:分类算法1的相关文章

R语言与数据分析之三:分类算法2

上期与大家分享的传统分类算法都是建立在判别函数的基础上,通过判别函数值来确定目标样本所属的分类,这类算法有个最基本的假设:线性假设.今天继续和大家分享下比较现代的分类算法:决策树和神经网络.这两个算法都来源于人工智能和机器学习学科. 首先和小伙伴介绍下数据挖掘领域比较经典的Knn(nearest neighbor)算法(最近邻算法) 算法基本思想: Step1:计算出待测样本与学习集中所有点的距离(欧式距离或马氏距离),按距离大小排序,选择出距离最近的K个学习点: Step2:统计被筛选出来的K

R语言与数据分析之四:聚类算法1

前面和大家分享的分类算法属于有监督学习的分类算法,今天继续和小伙伴们分享无监督学习分类算法---聚类算法.聚类算法也因此更具有大数据挖掘的味道 聚类算法本质上是基于几何距离远近为标准的算法,最适合数据是球形的问题,首先罗列下常用的距离: 绝对值距离(又称棋盘距离或城市街区距离) Euclide距离(欧几里德距离,通用距离) Minkowski 距离(闵可夫斯基距离),欧几里德距离 (q=2).绝对值距离(q=1)和切比雪夫距离(q=无穷大),这些都是闵可夫斯基的特殊情况. Chebyshew(切

R语言与数据分析之四:聚类算法2

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">今天继续和小伙伴们分享聚类算法和R语言的实现,上篇和大家分享了聚类中的距离.类间距离和最古典的层次聚类法,今天和大家分享几个动态聚类算法.</span> 首先和大家分享被评为十大数据挖掘算法之一的K-means 算法(K为分类的个数,mean为平均值,该算法的难点即为K的指点

R语言︱决策树族——随机森林算法

笔者寄语:有一篇<有监督学习选择深度学习还是随机森林或支持向量机?>(作者Bio:SebastianRaschka)中提到,在日常机器学习工作或学习中,当我们遇到有监督学习相关问题时,不妨考虑下先用简单的假设空间(简单模型集合),例如线性模型逻辑回归.若效果不好,也即并没达到你的预期或评判效果基准时,再进行下换其他更复杂模型来实验. ---------------------------------------------- 一.随机森林理论介绍 1.1 优缺点 优点. (1)不必担心过度拟合

R语言与数据分析

K最近邻(k-Nearest Neighbor,KNN)分类算法 R语言实现包:R语言中有kknn package实现了weighted k-nearest neighbor. 决策树: R语言实现决策树:rpart扩展包 iris.rp = rpart(Species~.,data = iris,method = "class")print(iris.rp)#输出模型结果 node), split, n, loss, yval, (yprob) * denotes terminal

R语言学习笔记—K近邻算法

K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适合分类,也适合回归.KNN算法广泛应用在推荐系统.语义搜索.异常检测. KNN算法分类原理图: 图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆点最近的5个邻居,虚线圈内),则有3个蓝色方块是绿色圆点的"最近邻居",比例为3/5,因此绿色圆点应当划归到蓝色方块一类:如果

R语言基因组数据分析可能会用到的data.table函数整理

R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理快,内部处理的步骤进行了程序上的优化,使用多线程,甚至很多函数是使用C写的,大大加快数据运行速度.因此,在对大数据处理上,使用data.table无疑具有极高的效率.这里主要介绍在基因组数据分析中可能会用到的函数. fread 做基因组数据分析时,常常需要读入处理大文件,这个时候我们就可以舍弃read.ta

基于R语言的数据分析和挖掘方法总结——描述性统计

1.1 方法简介 描述性统计包含多种基本描述统计量,让用户对于数据结构可以有一个初步的认识.在此所提供之统计量包含: 基本信息:样本数.总和 集中趋势:均值.中位数.众数 离散趋势:方差(标准差).变异系数.全距(最小值.最大值).内四分位距(25%分位数.75%分位数) 分布描述:峰度系数.偏度系数 用户可选择多个变量同时进行计算,亦可选择分组变量进行多组别的统计量计算. 1.2 详细介绍 1.2.1 样本数和总和 1. R语言涉及的方法:length(x) 1.2.2 均值(Mean) 1.

R语言和数据分析十大:购物篮分析

提到数据挖掘,我们的第一个反应是之前的啤酒和尿布的故事听说过,这个故事是一个典型的数据挖掘关联规则.篮分析的传统线性回归之间的主要差别的差别,对于离散数据的相关性分析: 常见的关联规则: 关联规则:牛奶=>卵子[支撑=2%,置信度=60%] 支持度:分析中的所有事务的2%同一时候购买了牛奶和鸡蛋,需设定域值,来限定规则的产生. 置信度:购买了牛奶的筒子有60%也购买了鸡蛋,需设定域值,来限定规则的产生. 最小支持度阈值和最小置信度阈值:由挖掘者或领域专家设定. 与关联分析相关的专业术语包含: 项