导航:首页 > 源码编译 > r语言差分进化算法

r语言差分进化算法

发布时间:2023-02-16 13:20:35

❶ 把数据导入R语言中怎么进行得到一阶差分图

差分用diff()函数

❷ 2019-10-22 R语言Seurat包下游分析-1

下游分析

cellranger count 计算的结果只能作为错略观测的结果,如果需要进一步分析聚类细胞,还需要进行下游分析,这里使用官方推荐 R 包(Seurat 3.0)

流程参考官方外周血分析标准流程( https://satijalab.org/seurat/v3.0/pbmc3k_tutorial.html )

Rstudio操作过程:

## 安装seurat

install.packages('Seurat')

## 载入seurat包

library(dplyr)

library(Seurat)

## 读入pbmc数据(文件夹路径不能包含中文,注意“/“的方向不能错误,这里读取的是10x处理的文件,也可以处理其它矩阵文件,具体怎样操作现在还不知道,文件夹中的3个文件分别是:barcodes.tsv,genes.tsv,matrix.mtx,文件的名字不能错,否则读取不到)

pbmc.data <- Read10X(data.dir = "D:/pbmc3k_filtered_gene_bc_matrices/filtered_gene_bc_matrices/hg19/")

## 查看稀疏矩阵的维度,即基因数和细胞数

dim(pbmc.data)

pbmc.data[1:10,1:6]

## 创建Seurat对象与数据过滤,除去一些质量差的细胞(这里读取的是单细胞 count 结果中的矩阵目录;在对象生成的过程中,做了初步的过滤;留下所有在>=3 个细胞中表达的基因 min.cells = 3;留下所有检测到>=200 个基因的细胞 min.genes = 200。)

pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200)

pbmc

##计算每个细胞的线粒体基因转录本数的百分比(%),使用[[ ]] 操作符存放到metadata中,mit-开头的为线粒体基因

pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

##展示基因及线粒体百分比(这里将其进行标记并统计其分布频率,"nFeature_RNA"为基因数,"nCount_RNA"为细胞数,"percent.mt"为线粒体占比)

VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")

plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")

CombinePlots(plots = list(plot1, plot2))

## 过滤细胞:根据上面小提琴图中基因数"nFeature_RNA"和线粒体数"percent.mt",分别设置过滤参数,这里基因数 200-2500,线粒体百分比为小于 5%,保留gene数大于200小于2500的细胞;目的是去掉空GEMs和1个GEMs包含2个以上细胞的数据;而保留线粒体基因的转录本数低于5%的细胞,为了过滤掉死细胞等低质量的细胞数据。

pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)

## 表达量数据标准化,LogNormalize的算法:A = log( 1 + ( UMIA ÷ UMITotal ) × 10000

pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)

#pbmc <- NormalizeData(pbmc) 或者用默认的

## 鉴定表达高变基因(2000个),用于下游分析,如PCA;

pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)

## 提取表达量变化最高的10个基因;

top10 <- head(VariableFeatures(pbmc), 10)

top10

plot1 <- VariableFeaturePlot(pbmc)

plot2 <- LabelPoints(plot = plot1, points = top10)

CombinePlots(plots = list(plot1, plot2))

plot1<-VariableFeaturePlot(object=pbmc)

plot2<-LabelPoints(plot=plot1,points=top10,repel=TRUE)

CombinePlots(plots=list(plot1,plot2))

## PCA分析:

# PCA分析数据准备,使用ScaleData()进行数据归一化;默认只是标准化高变基因(2000个),速度更快,不影响PCA和分群,但影响热图的绘制。

#pbmc <- ScaleData(pbmc,vars.to.regress ="percent.mt")

## 而对所有基因进行标准化的方法如下:

all.genes <- rownames(pbmc)

pbmc <- ScaleData(pbmc, features = all.genes)

pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt")

## 线性降维(PCA),默认用高变基因集,但也可通过features参数自己指定;

pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))

## 展示 pca 结果(最简单的方法)

DimPlot(object=pbmc,rection="pca")

## 检查PCA分群结果, 这里只展示前5个PC,每个PC只显示5个基因;

print(pbmc[["pca"]], dims = 1:5, nfeatures = 5)

##PC_ 1 

##Positive:  RPS27, MALAT1, RPS6, RPS12, RPL13 

##Negative:  CSTA, FCN1, CST3, LYZ, LGALS2 

##PC_ 2 

##Positive:  NKG7, GZMA, CST7, KLRD1, CCL5 

##Negative:  RPL34, RPL32, RPL13, RPL39, LTB 

##PC_ 3 

##Positive:  MS4A1, CD79A, BANK1, IGHD, CD79B 

##Negative:  IL7R, RPL34, S100A12, VCAN, AIF1 

##PC_ 4 

##Positive:  RPS18, RPL39, RPS27, MALAT1, RPS8 

##Negative:  PPBP, PF4, GNG11, SDPR, TUBB1 

##PC_ 5 

##Positive:  PLD4, FCER1A, LILRA4, SERPINF1, LRRC26 

##Negative:  MS4A1, CD79A, LINC00926, IGHD, FCER2 

## 展示主成分基因分值

VizDimLoadings(pbmc, dims = 1:2, rection = "pca")

## 绘制pca散点图

DimPlot(pbmc, rection = "pca")

## 画第1个或15个主成分的热图;

DimHeatmap(pbmc, dims = 1, cells = 500, balanced = TRUE)

DimHeatmap(pbmc, dims = 1:15, cells = 500, balanced = TRUE)

## 确定数据集的分群个数

# 鉴定数据集的可用维度,方法1:Jackstraw置换检验算法;重复取样(原数据的1%),重跑PCA,鉴定p-value较小的PC;计算‘null distribution’(即零假设成立时)时的基因scores。虚线以上的为可用维度,也可以调整 dims 参数,画出所有 pca 查看。

#pbmc <- JackStraw(pbmc, num.replicate = 100)

#pbmc <- ScoreJackStraw(pbmc, dims = 1:20)

#JackStrawPlot(pbmc, dims = 1:15)

# 方法2:肘部图(碎石图),基于每个主成分对方差解释率的排名。

ElbowPlot(pbmc)

## 细胞聚类:分群个数这里选择10,建议尝试选择多个主成分个数做下游分析,对整体影响不大;在选择此参数时,建议选择偏高的数字(为了获取更多的稀有分群,“宁滥勿缺”);有些亚群很罕见,如果没有先验知识,很难将这种大小的数据集与背景噪声区分开来。

## 非线性降维(UMAP/tSNE)基于PCA空间中的欧氏距离计算nearest neighbor graph,优化任意两个细胞间的距离权重(输入上一步得到的PC维数) 。

pbmc <- FindNeighbors(pbmc, dims = 1:10)

## 接着优化模型,resolution参数决定下游聚类分析得到的分群数,对于3K左右的细胞,设为0.4-1.2 能得到较好的结果(官方说明);如果数据量增大,该参数也应该适当增大。

pbmc <- FindClusters(pbmc, resolution = 0.5)

## 使用Idents()函数可查看不同细胞的分群;

head(Idents(pbmc), 5)

## 结果:AAACCTGAGGTGCTAG    AAACCTGCAGGTCCAC    AAACCTGCATGGAATA AAACCTGCATGGTAGG      AAACCTGCATTGGCGC 

               1                3                0               10                2 

Levels: 0 1 2 3 4 5 6 7 8 9 10 11

## Seurat提供了几种非线性降维的方法进行数据可视化(在低维空间把相似的细胞聚在一起),比如UMAP和t-SNE,运行UMAP需要先安装'umap-learn'包,这里不做介绍,两种方法都可以使用,但不要混用,如果混用,后面的结算结果会将先前的聚类覆盖掉,只能保留一个。

## 这里采用基于TSNE的聚类方法。

pbmc <- RunTSNE(pbmc, dims = 1:10)

## 用DimPlot()函数绘制散点图,rection = "tsne",指定绘制类型;如果不指定,默认先从搜索 umap,然后 tsne, 再然后 pca;也可以直接使用这3个函数PCAPlot()、TSNEPlot()、UMAPPlot(); cols,pt.size分别调整分组颜色和点的大小;

DimPlot(pbmc,rection = "tsne",label = TRUE,pt.size = 1.5)

## 这里采用基于图论的聚类方法

pbmc<-RunUMAP(object=pbmc,dims=1:10)

DimPlot(object=pbmc,rection="umap")

## 细胞周期归类

pbmc<- CellCycleScoring(object = pbmc, g2m.features = cc.genes$g2m.genes, s.features = cc.genes$s.genes)

head(x = [email protected])

DimPlot(pbmc,rection = "tsne",label = TRUE,group.by="Phase",pt.size = 1.5)

## 存储结果

saveRDS(pbmc, file = "D:/pbmc_tutorial.rds")

save(pbmc,file="D:/res0.5.Robj")

## 寻找cluster 1的marker

cluster1.markers <- FindMarkers(pbmc, ident.1 = 1, min.pct = 0.25)

head(cluster1.markers, n = 5)

## 结果:      p_val             avg_logFC        pct.1       pct.2        p_val_adj

MT-CO1  0.000000e+00    -0.6977083      0.985       0.996       0.000000e+00

RPS27  2.182766e-282     0.3076454       1.000       0.999        3.480202e-278

MT-CO3 2.146399e-274    -0.4866429      0.995       0.997       3.422218e-270

DUSP1  2.080878e-247    -1.7621662       0.376       0.745       3.317752e-243

RPL34  8.647733e-244     0.3367755        1.000       0.997       1.378795e-239

##寻找每一cluster的marker

pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)

pbmc.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC)

# A tibble: 24 x 7

# Groups:   cluster [12]

       p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene 

       <dbl>     <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>

 1 2.29e-123     0.636 0.344 0.097 3.65e-119 0       CD8B 

 2 7.62e-113     0.487 0.632 0.305 1.22e-108 0       LEF1 

 3 2.04e- 74     0.483 0.562 0.328 3.25e- 70 1       LEF1 

 4 1.39e- 61     0.462 0.598 0.39  2.22e- 57 1       ITM2A

 5 0.            2.69  0.972 0.483 0.        2       GNLY 

 6 0.            2.40  0.964 0.164 0.        2       GZMB 

 7 1.31e-121     0.768 0.913 0.671 2.09e-117 3       JUNB 

 8 2.06e- 94     0.946 0.426 0.155 3.28e- 90 3       RGS1 

 9 2.05e-255     1.57  0.586 0.09  3.27e-251 4       GZMK 

10 2.94e-140     1.57  0.69  0.253 4.68e-136 4       KLRB1

# ... with 14 more rows

## 存储marker

write.table(pbmc.markers,file="D:/allmarker.txt")

## 各种绘图

## 绘制Marker 基因的tsne图

FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"),cols = c("gray", "red"))

## 绘制Marker 基因的小提琴图

VlnPlot(pbmc, features = c("MS4A1", "CD79A"))

VlnPlot(pbmc, features = c("NKG7", "PF4"), slot = "counts", log = TRUE)

## 绘制分cluster的热图

top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)

DoHeatmap(pbmc, features = top10$gene) + NoLegend()

剩下的便是寻找基因 marker 并对细胞类型进行注释(见下回分解)

❸ 用R语言实现遗传算法

模式识别的三大核心问题包括:

特征选择 特征变换 都能够达到降维的目的,但是两者所采用的方式方法是不同的。
特征提取 主要是通过分析特征间的关系,变换原来特征空间,从而达到压缩特征的目的。主要方法有:主成分分析(PCA)、离散K-L变换法(DKLT)等。
特征选择 选择方法是从原始特征集中挑选出子集,是原始特征的选择和组合,并没有更改原始特征空间,特征选择的过程必须确保不丢失重要特征。主要方法有:遗传算法(GA)、统计检验法、分支定界法等。

这里主要讲讲特征选择中 遗传算法 以及它的R语言实现(因为要写作业,虽然不一定写对了)。
遗传算法受进化论启发,根据“物竞天择,适者生存”这一规则,模拟自然界进化机制,寻找目标函数的最大值。

采用遗传算法对男女生样本数据中的身高、体重、鞋码、50m成绩、肺活量、是否喜欢运动共6个特征进行特征选择。

由于有6个特征,因此选用6位0/1进行编码,1表示选中该特征。

适应度函数的实现

示例

结果如下

有什么不对的地方欢迎大家在评论区指出。

❹ 多目标差分进化算法

差分进化算法(Differential Evolution, DE)是一种基于群体差异的启发式随机搜索算法,该算法是由R.Storn和K.Price为求解Chebyshev多项式而提出的。是一种用于最佳化问题的后设启发式算法。本质上说,它是一种基于实数编码的具有保优思想的贪婪遗传算法。

将问题的求解表示成"染色体"的适者生存过程,通过"染色体"群的一代代不断进化,包括复制、交叉和变异等操作,最终收敛到"最适应环境"的个体,从而求得问题的最优解或满意解。

差分进化算法类似遗传算法,包含变异,交叉操作,淘汰机制,而差分进化算法与遗传算法不同之处,在于变异的部分是随选两个解成员变数的差异,经过伸缩后加入当前解成员的变数上,因此差分进化算法无须使用概率分布产生下一代解成员。最优化方法分为传统优化方法和启发式优化方法两大类。传统的优化方法大多数都是利用目标函数的导数求解;而启发式优化方法以仿生算法为主,通过启发式搜索策略实现求解优化。启发式搜索算法不要求目标函数连续、可微等信息,具有较好的全局寻优能力,成为最优化领域的研究热点。

在人工智能领域中,演化算法是演化计算的一个分支。它是一种基于群体的元启发式优化算法,具有自适应、自搜索、自组织和隐并行性等特点。近年来,很多学者将演化算法应用到优化领域中,取得了很大的成功,并已引起了人们的广泛关注。越来越多的研究者加入到演化优化的研究之中,并对演化算法作了许多改进,使其更适合各种优化问题。目前,演化算法已广泛应用于求解无约束函数优化、约束函数优化、组合优化、多目标优化等多种优化问题中。

❺ R语言-KNN算法

1、K最近邻(k-NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

2、KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

3、KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。

简言之,就是将未标记的案例归类为与它们最近相似的、带有标记的案例所在的类 。

原理及举例

工作原理:我们知道样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出“距离”最近的k(通常k<20)数据,选择这k个数据中出现最多的分类作为新数据的分类。

算法描述

1、计算已知数据集中的点与当前点的距离

2、按距离递增次序排序

3、选取与当前数据点距离最近的K个点

4、确定前K个点所在类别出现的频率

5、返回频率最高的类别作为当前类别的预测

距离计算方法有"euclidean"(欧氏距离),”minkowski”(明科夫斯基距离), "maximum"(切比雪夫距离), "manhattan"(绝对值距离),"canberra"(兰式距离), 或 "minkowski"(马氏距离)等

Usage

knn(train, test, cl, k = 1, l = 0, prob =FALSE, use.all = TRUE)

Arguments

train

matrix or data frame of training set cases.

test

matrix or data frame of test set cases. A vector will  be interpreted as a row vector for a single case.

cl

factor of true classifications of training set

k

number of neighbours considered.

l

minimum vote for definite decision, otherwisedoubt. (More precisely, less thank-ldissenting votes are allowed, even

ifkis  increased by ties.)

prob

If this is true, the proportion of the votes for the

winning class are returned as attributeprob.

use.all

controls handling of ties. If true, all distances equal

to thekth largest are

included. If false, a random selection of distances equal to thekth is chosen to use exactlykneighbours.

kknn(formula = formula(train), train, test, na.action = na.omit(), k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts = c('unordered' = "contr.mmy", ordered = "contr.ordinal"))

参数:

formula                            A formula object.

train                                 Matrix or data frame of training set cases.

test                                   Matrix or data frame of test set cases.

na.action                         A function which indicates what should happen when the data contain ’NA’s.

k                                       Number of neighbors considered.

distance                          Parameter of Minkowski distance.

kernel                              Kernel to use. Possible choices are "rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian", "rank" and "optimal".

ykernel                            Window width of an y-kernel, especially for prediction of ordinal classes.

scale                                Logical, scale variable to have equal sd.

contrasts                         A vector containing the ’unordered’ and ’ordered’ contrasts to use

kknn的返回值如下:

fitted.values              Vector of predictions.

CL                              Matrix of classes of the k nearest neighbors.

W                                Matrix of weights of the k nearest neighbors.

D                                 Matrix of distances of the k nearest neighbors.

C                                 Matrix of indices of the k nearest neighbors.

prob                            Matrix of predicted class probabilities.

response                   Type of response variable, one of continuous, nominal or ordinal.

distance                     Parameter of Minkowski distance.

call                              The matched call.

terms                          The ’terms’ object used.

iris%>%ggvis(~Length,~Sepal.Width,fill=~Species)

library(kknn)
data(iris)

dim(iris)

m<-(dim(iris))[1]
val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))

建立训练数据集

data.train<-iris[-val,]

建立测试数据集

data.test<-iris[val,]

调用kknn  之前首先定义公式

formula : Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

iris.kknn<-kknn(Species~.,iris.train,iris.test,distance=1,kernel="triangular")

summary(iris.kknn)

# 获取fitted.values

fit <- fitted(iris.kknn)

# 建立表格检验判类准确性

table(iris.valid$Species, fit)
# 绘画散点图,k-nearest neighbor用红色高亮显示

pcol <- as.character(as.numeric(iris.valid$Species))

pairs(iris.valid[1:4], pch = pcol, col = c("green3", "red")[(iris.valid$Species != fit)+1]

二、R语言knn算法

install.packages("class")

library(class)

对于新的测试样例基于距离相似度的法则,确定其K个最近的邻居,在K个邻居中少数服从多数

确定新测试样例的类别

1、获得数据

2、理解数据

对数据进行探索性分析,散点图

如上例

3、确定问题类型,分类数据分析

4、机器学习算法knn

5、数据处理,归一化数据处理

normalize <- function(x){

num <- x - min(x)

denom <- max(x) - min(x)

return(num/denom)

}

iris_norm <-as.data.frame(lapply(iris[,1:4], normalize))

summary(iris_norm)

6、训练集与测试集选取

一般按照3:1的比例选取

方法一、set.seed(1234)

ind <- sample(2,nrow(iris), replace=TRUE, prob=c(0.67, 0.33))

iris_train <-iris[ind==1, 1:4]

iris_test <-iris[ind==2, 1:4]

train_label <-iris[ind==1, 5]

test_label <-iris[ind==2, 5]

方法二、

ind<-sample(1:150,50)

iris_train<-iris[-ind,]

iris_test<-iris[ind,1:4]

iris_train<-iris[-ind,1:4]

train_label<-iris[-ind,5]

test_label<-iris[ind,5]

7、构建KNN模型

iris_pred<-knn(train=iris_train,test=iris_test,cl=train_label,k=3)

8、模型评价

交叉列联表法

table(test_label,iris_pred)

实例二

数据集

http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data

导入数据

dir <-'http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'wdbc.data <-read.csv(dir,header = F)

names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean','area_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concave points_max_mean','symmetry_max_mean','fractal dimension_max_mean')

table(wdbc.data$Diagnosis)## M = malignant, B = benign

wdbc.data$Diagnosis <- factor(wdbc.data$Diagnosis,levels =c('B','M'),labels = c(B ='benign',M ='malignant'))

❻ R语言常用函数整理(基础篇)

R语言常用函数整理本篇是基础篇,即R语言自带的函数。

vector:向量
numeric:数值型向量
logical:逻辑型向量
character;字符型向量
list:列表
data.frame:数据框
c:连接为向量或列表
length:求长度
subset:求子集
seq,from:to,sequence:等差序列
rep:重复
NA:缺失值
NULL:空对象
sort,order,unique,rev:排序
unlist:展平列表
attr,attributes:对象属性
mode,class,typeof:对象存储模式与类型
names:对象的名字属性

字符型向量 nchar:字符数
substr:取子串 format,formatC:把对象用格式转换为字符串
paste()、paste0()不仅可以连接多个字符串,还可以将对象自动转换为字符串再相连,另外还能处理向量。
strsplit:连接或拆分
charmatch,pmatch:字符串匹配
grep,sub,gsub:模式匹配与替换

complex,Re,Im,Mod,Arg,Conj:复数函数

factor:因子 codes:因子的编码 levels:因子的各水平的名字 nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子
table:交叉频数表 split:按因子分组 aggregate:计算各数据子集的概括统计量 tapply:对“不规则”数组应用函数

dev.new() 新建画板
plot()绘制点线图,条形图,散点图.
barplot( ) 绘制条形图
dotchart( ) 绘制点图
pie( )绘制饼图.
pair( )绘制散点图阵
boxplot( )绘制箱线图
hist( )绘制直方图
scatterplot3D( )绘制3D散点图.

par()可以添加很多参数来修改图形
title( )添加标题
axis( )调整刻度
rug( )添加轴密度
grid( )添加网格线
abline( )添加直线
lines( )添加曲线
text( )添加标签
legend()添加图例

+, -, *, /, ^, %%, %/%:四则运算 ceiling,floor,round,signif

1、round() #四舍五入

例:x <- c(3.1416, 15.377, 269.7)

round(x, 0) #保留整数位

round(x, 2) #保留两位小数

round(x, -1) #保留到十位

2、signif() #取有效数字(跟学过的有效数字不是一个意思)

例:略

3、trunc() #取整

floor() #向下取整

ceiling() #向上取整

例:xx <- c(3.60, 12.47, -3.60, -12.47)

trunc(xx)

floor(xx)

ceiling(xx)

max,min,pmax,pmin:最大最小值
range:最大值和最小值 sum,prod:向量元素和,积 cumsum,cumprod,cummax,cummin:累加、累乘 sort:排序 approx和approx fun:插值 diff:差分 sign:符号函数

abs,sqrt:绝对值,平方根
log, exp, log10, log2:对数与指数函数
sin,cos,tan,asin,acos,atan,atan2:三角函数
sinh,cosh,tanh,asinh,acosh,atanh:双曲函数
beta,lbeta,gamma,lgamma,digamma,trigamma,tetragamma,pentagamma,choose ,lchoose:与贝塔函数、伽玛函数、组合数有关的特殊函数

fft,mvfft,convolve:富利叶变换及卷积
polyroot:多项式求根
poly:正交多项式
spline,splinefun:样条差值
besselI,besselK,besselJ,besselY,gammaCody:Bessel函数
deriv:简单表达式的符号微分或算法微分

array:建立数组
matrix:生成矩阵
data.matrix:把数据框转换为数值型矩阵
lower.tri:矩阵的下三角部分
mat.or.vec:生成矩阵或向量
t:矩阵转置
cbind:把列合并为矩阵
rbind:把行合并为矩阵
diag:矩阵对角元素向量或生成对角矩阵
aperm:数组转置
nrow, ncol:计算数组的行数和列数
dim:对象的维向量
dimnames:对象的维名
rownames,colnames:行名或列名
%*%:矩阵乘法
crossprod:矩阵交叉乘积(内积)
outer:数组外积
kronecker:数组的Kronecker积
apply:对数组的某些维应用函数
tapply:对“不规则”数组应用函数
sweep:计算数组的概括统计量
aggregate:计算数据子集的概括统计量
scale:矩阵标准化
matplot:对矩阵各列绘图
cor:相关阵或协差阵
Contrast:对照矩阵
row:矩阵的行下标集
col:求列下标集

solve:解线性方程组或求逆
eigen:矩阵的特征值分解
svd:矩阵的奇异值分解
backsolve:解上三角或下三角方程组
chol:Choleski分解
qr:矩阵的QR分解
chol2inv:由Choleski分解求逆

><,>,<=,>=,==,!=:比较运算符 !,&,&&,|,||,xor():
逻辑运算符 logical:
生成逻辑向量 all,
any:逻辑向量都为真或存在真
ifelse():二者择一 match,
%in%:查找
unique:找出互不相同的元素
which:找到真值下标集合
plicated:找到重复元素

optimize,uniroot,polyroot:一维优化与求根

if,else,
ifelse,
switch:
分支 for,while,repeat,break,next:
循环 apply,lapply,sapply,tapply,sweep:替代循环的函数。

function:函数定义
source:调用文件 ’
call:函数调用 .
C,.Fortran:调用C或者Fortran子程序的动态链接库。
Recall:递归调用
browser,debug,trace,traceback:程序调试
options:指定系统参数
missing:判断虚参是否有对应实参
nargs:参数个数 stop:终止函数执行
on.exit:指定退出时执行 eval,expression:表达式计算
system.time:表达式计算计时
invisible:使变量不显示
menu:选择菜单(字符列表菜单)

其它与函数有关的还有:
delay,
delete.response,
deparse,
do.call,
dput,
environment ,
formals,
format.info,
interactive,
is.finite,
is.function,
is.language,
is.recursive ,
match.arg,
match.call,
match.fun,
model.extract,
name,
parse 函数能将字符串转换为表达式expression
deparse 将表达式expression转换为字符串
eval 函数能对表达式求解
substitute,
sys.parent ,
warning,
machine

cat,print:显示对象
sink:输出转向到指定文件
mp,save,dput,write:输出对象
scan,read.table,readlines, load,dget:读入

ls,objects:显示对象列表
rm, remove:删除对象
q,quit:退出系统
.First,.Last:初始运行函数与退出运行函数。
options:系统选项
?,help,help.start,apropos:帮助功能
data:列出数据集
head()查看数据的头几行
tail()查看数据的最后几行

每一种分布有四个函数:
d―density(密度函数),p―分布函数,q―分位数函数,r―随机数函数。
比如,正态分布的这四个函数为dnorm,pnorm,qnorm,rnorm。下面我们列出各分布后缀,前面加前缀d、p、q或r就构成函数名:

norm:正态,
t:t分布,
f:F分布,
chisq:卡方(包括非中心)
unif:均匀,
exp:指数,
weibull:威布尔,
gamma:伽玛,
beta:贝塔
lnorm:对数正态,
logis:逻辑分布,
cauchy:柯西,
binom:二项分布,
geom:几何分布,
hyper:超几何,
nbinom:负二项,
pois:泊松
signrank:符号秩,
wilcox:秩和,
tukey:学生化极差

sum, mean, var, sd, min, max, range, median, IQR(四分位间距)等为统计量,
sort,order,rank与排序有关,
其它还有ave,fivenum,mad,quantile,stem等。

R中已实现的有chisq.test,prop.test,t.test。

cor,cov.wt,var:协方差阵及相关阵计算
biplot,biplot.princomp:多元数据biplot图
cancor:典则相关
princomp:主成分分析
hclust:谱系聚类
kmeans:k-均值聚类
cmdscale:经典多维标度
其它有dist,mahalanobis,cov.rob。

ts:时间序列对象
diff:计算差分
time:时间序列的采样时间
window:时间窗

lm,glm,aov:线性模型、广义线性模型、方差分析

quo()等价于quote()
enquo()等价于substitute()

❼ R语言-17决策树

是一个预测模型,分为回归决策树和分类决策树,根据已知样本训练出一个树模型,从而根据该模型对新样本因变量进行预测,得到预测值或预测的分类

从根节点到叶节点的一条路径就对应着一条规则.整棵决策树就对应着一组表达式规则。叶节点就代表该规则下得到的预测值。如下图决策树模型则是根据房产、结婚、月收入三个属性得到是否可以偿还贷款的规则。

核心是如何从众多属性中挑选出具有代表性的属性作为决策树的分支节点。

最基本的有三种度量方法来选择属性

1. 信息增益(ID3算法)

信息熵

一个信源发送出什么符号是不确定的,衡量它可以根据其出现的概率来度量。概率大,出现机会多,不确定性小;反之不确定性就大。不确定性函数f是概率P的 减函数 。两个独立符号所产生的不确定性应等于各自不确定性之和,即f(P1,P2)=f(P1)+f(P2),这称为可加性。同时满足这两个条件的函数f是对数函数,即

在信源中,考虑的不是某一单个符号发生的不确定性,而是要考虑这个信源所有可能发生情况的平均不确定性。因此,信息熵被定义为

决策树分类过程

2、增益率(C4.5算法)
由于信息增益的缺点是:倾向于选择具有大量值的属性,因为具有大量值的属性每个属性对应数据量少,倾向于具有较高的信息纯度。因此增益率使用【信息增益/以该属性代替的系统熵(类似于前面第一步将play换为该属性计算的系统熵】这个比率,试图克服这种缺点。
g(D,A)代表D数据集A属性的信息增益,

3. 基尼指数(CART算法)

基尼指数:

表示在样本集合中一个随机选中的样本被分错的概率。越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高。

假设集合中有K个类别,则:

说明:

1. pk表示选中的样本属于k类别的概率,则这个样本被分错的概率是(1-pk)

2. 样本集合中有K个类别,一个随机选中的样本可以属于这k个类别中的任意一个,因而对类别就加和

3. 当为二分类是,Gini(P) = 2p(1-p)

基尼指数是将属性A做二元划分,所以得到的是二叉树。当为离散属性时,则会将离散属性的类别两两组合,计算基尼指数。

举个例子:

如上面的特征Temperature,此特征有三个特征取值: “Hot”,“Mild”, “Cool”,
当使用“学历”这个特征对样本集合D进行划分时,划分值分别有三个,因而有三种划分的可能集合,划分后的子集如下:

对于上述的每一种划分,都可以计算出基于 划分特征= 某个特征值 将样本集合D划分为两个子集的纯度:

决策数分类过程

先剪枝 :提前停止树的构建对树剪枝,构造树时,利用信息增益、统计显着性等,当一个节点的划分导致低于上述度量的预定义阈值时,则停止进一步划分。但阈值的确定比较困难。
后剪枝 :更为常用,先得到完全生长的树,再自底向上,用最下面的节点的树叶代替该节点
CART使用代价复杂度剪枝算法 :计算每个节点剪枝后与剪枝前的代价复杂度,如果剪去该节点,代价复杂度较小(复杂度是树的结点与树的错误率也就是误分类比率的函数),则剪去。
C4.5采用悲观剪枝 :类似代价复杂度,但CART是利用剪枝集评估代价复杂度,C4.5是采用训练集加上一个惩罚评估错误率

决策树的可伸缩性

ID3C4.5CART都是为较小的数据集设计,都限制训练元祖停留再内存中,为了解决可伸缩性,提出了其它算法如
RainForest(雨林):对每个属性维护一个AVC集,描述该结点的训练元组,所以只要将AVC集放在内存即可
BOAT自助乐观算法:利用统计学,创造给定训练数据的较小样本,每个样本构造一个树,导致多颗树,再利用它们构造1颗新树。优点是可以增量的更新,当插入或删除数据,只需决策树更新,而不用重新构造。

决策树的可视化挖掘
PBC系统可允许用户指定多个分裂点,导致多个分支,传统决策树算法数值属性都是二元划分。并且可以实现交互地构建树。

rpart是采用cart算法,连续型“anova”;离散型“class”;

2)进行剪枝的函数:prune()

3)计算MAE评估回归树模型误差,这里将样本划分成了训练集和测试集,testdata为测试集
rt.mae为根据训练集得到的决策树模型对测试集因变量预测的结果与测试集因变量实际值得到平均绝对误差

❽ 优化算法笔记(六)遗传算法

遗传算法(Genetic Algorithms,GA)是一种模拟自然中生物的遗传、进化以适应环境的智能算法。由于其算法流程简单,参数较少优化速度较快,效果较好,在图像处理、函数优化、信号处理、模式识别等领域有着广泛的应用。
在遗传算法(GA)中,每一个待求问题的候选解被抽象成为种群中一个个体的基因。种群中个体基因的好坏由表示个体基因的候选解在待求问题中的所的得值来评判。种群中的个体通过与其他个体交叉产生下一代,每一代中个体均只进行一次交叉。两个进行交叉的个体有一定几率交换一个或者多个对应位的基因来产生新的后代。每个后代都有一定的概率发生变异。发生变异的个体的某一位或某几位基因会变异成其他值。最终将以个体的适应度值为概率选取个体保留至下一代。

遗传算法启发于生物的繁殖与dna的重组,本次的主角选什么呢?还是根据大家熟悉的孟德尔遗传规律选豌豆吧,选动物的话又会有人疑车,还是植物比较好,本次的主角就是它了。

遗传算法包含三个操作(算子):交叉,变异和选择操作。下面我们将详细介绍这三个操作。
大多数生物的遗传信息都储存在DNA,一种双螺旋结构的复杂有机化合物。其含氮碱基为腺嘌呤、鸟嘌呤、胞嘧啶及胸腺嘧啶。

表格中表示了一个有10个基因的个体,它们每一个基因的值为0或者1。

生物的有性生殖一般伴随着基因的重组。遗传算法中父辈和母辈个体产生子代个体的过程称为交叉。

表中给出了两个豌豆的基因,它们均有10个等位基因(即编号相同的基因)。
遗传算法的交叉过程会在两个个体中随机选择1位或者n位基因进行交叉,即这两个个体交换等位基因。
如,A豌豆和B豌豆在第6位基因上进行交叉,则其结果如下

当两个个体交叉的等位基因相同时,交叉过程也有可能没有产生新的个体,如交叉A豌豆和B豌豆的第2位基因时,交叉操作并没有产生新的基因。

一般的会给群体设定一个交叉率,crossRate,表示会在群体中选取一定比例的个体进行交叉,交叉率相对较大,一般取值为0.8。

基因的变异是生物进化的一个主要因素。
遗传算法中变异操作相对简单,只需要将一个随机位基因的值修改就行了,因为其值只为0或1,那么当基因为0时,变异操作会将其值设为1,当基因值为1时,变异操作会将其值设为0。

上图表示了A豌豆第3位基因变异后的基因编码。
与交叉率相似,变异操作也有变异率,alterRate,但是变异率会远低于交叉率,否则会产生大量的随机基因。一般变异率为0.05。

选择操作是遗传算法中的一个关键操作,它的主要作用就是根据一定的策略随机选择个体保留至下一代。适应度越优的个体被保留至下一代的概率越大。
实现上,我们经常使用“轮盘赌”来随机选择保留下哪个个体。

假设有4个豌豆A、B、C、D,它们的适应度值如下:

适应度值越大越好,则它们组成的轮盘如下图:

但由于轮盘赌选择是一个随机选择过程,A、B、C、D进行轮盘赌选择后产生的下一代也有可能出现A、A、A、A的情况,即虽然有些个体的适应度值不好,但是运气不错,也被选择留到了下一代。
遗产算法的三个主要操作介绍完了,下面我们来看看遗传算法的总体流程:

前面我们说了遗传算法的流程及各个操作,那么对于实际的问题我们应该如何将其编码为基因呢?

对于计算机来所所有的数据都使用二进制数据进行存放,如float类型和double类型的数据。
float类型的数据将保存为32位的二进制数据:1bit(符号位) 8bits(指数位) 23bits(尾数位)
如-1.234567f,表示为二进制位

Double类型的数据将保存为64位的二进制数据:1bit(符号位) 11bits(指数位) 53bits(尾数位)
如-1.234567d,表示为二进制为

可以看出同样的数值不同的精度在计算机中存储的内容也不相同。之前的适应度函数 ,由于有两个double类型的参数,故其进行遗传算法基因编码时,将有128位基因。
虽然基因数较多,但好在每个基因都是0或者1,交叉及变异操作非常简单。

相比二进制编码,十进制编码的基因长度更短,适应度函数 有两个输入参数,那么一个个体就有2个基因,但其交叉、变异操作相对复杂。
交叉操作
方案1:将一个基因作为一个整体,交换两个个体的等位基因。
交换前

交换第1位基因后

方案2:将两个个体的等位基因作为一个整体,使其和不变,但是值随机
交换前

交换第1位基因后

假设A、B豌豆的第一位基因的和为40,即 ,第一位基因的取值范围为0-30,那么A、B豌豆的第一位基因的取值范围为[10,30],即 为[0,30]的随机数, 。
变异操作,将随机的一位基因设置为该基因取值范围内的随机数即可。

这个过程说起来简单但其实现并不容易。

我们要将它们的值映射到一个轴上才能进行随机选择,毕竟我们无法去绘制一个轮盘来模拟这个过程

如图,将ABCD根据其值按顺序排列,取[0,10]内的随机数r,若r在[0,1]内则选择A,在(1,3]内则选择B,在(3,6]内则选择C,在(6,10]则选择D。
当然这仍然会有问题,即当D>>A、B、C时,假如它们的值分布如下

那么显然,选D的概率明显大于其他,根据轮盘赌的选择,下一代极有可能全是D的后代有没有办法均衡一下呢?
首先我想到了一个函数,

不要问我为什么我不知道什么是神经什么网络的,什么softmax、cnn统统没听说过。

这样一来,它们之间的差距没有之前那么大了,只要个体适应度值在均值以上那么它被保留至下一代的概率会相对较大,当然这样缩小了个体之间的差距,对真正优秀的个体来说不太公平,相对应,我们可以在每次选择过程中保留当前的最优个体到下一代,不用参与轮盘赌这个残酷的淘汰过程。

最令人高兴的环节到了,又可以愉快的凑字数了。

由于遗传算法的收敛速度实在是太慢,区区50代,几乎得不到好的结果,so我们把它的最大迭代次数放宽到200代。

使用二进制编码来进行求解
参数如下:

求解过程如上图,可以看出基因收敛的很快,在接近20代时就图中就只剩一个点了,之后的点大概是根据变异操作产生。看一下最后的结果。

可以看出最好的结果已经得到了最优解,但是10次实验的最差值和平均值都差的令人发指。为什么会这样呢?

问题出在二进制编码上,由于double类型的编码有11位指数位和52位小数位,这会导致交叉、变异操作选到指数位和小数位的概率不均衡,在小数位上的修改对结果的影响太小而对指数为的修改对结果的影响太大,
如-1.234567d,表示为二进制为

对指数为第5位进行变异操作后的结果为-2.8744502924382686E-10,而对小数位第5为进行变异操作后的结果为-1.218942。可以看出这两部分对数值结果的影响太不均衡,得出较好的结果时大概率是指数位与解非常相近,否则很难得出好的结果,就像上面的最差值和均值一样。
所以使用上面的二进制编码不是一个好的基因编码方式,因此在下面的实验中,将使用十进制来进行试验。

使用:十进制编码来进行求解
参数如下:

我们可以看到直到40代时,所有的个体才收束到一点,但随后仍不断的新的个体出现。我们发现再后面的新粒子总是在同一水平线或者竖直线上,因为交叉操作直接交换了两个个体的基因,那么他们会相互交换x坐标或者y坐标,导致新个体看起来像在一条直线上。
我们来看看这次的结果。

这次最优值没有得到最优解,但是最差值没有二进制那么差,虽然也不容乐观。使用交换基因的方式来进行交叉操作的搜索能力不足,加之轮盘赌的选择会有很大概率选择最优个体,个体总出现在矩形的边上。
下面我们先改变轮盘赌的选择策略,使用上面的sigmod函数方案,并且保留最优个体至下一代。

使用:十进制编码来进行求解
参数如下:

看图好像跟之前的没什么区别,让我们们看看最终的结果:

可以看出,最优值没有什么变化,但是最差值和平均值有了较大的提升,说明该轮盘赌方案使算法的鲁棒性有了较大的提升。在每次保留最优个体的情况下,对于其他的个体的选择概率相对平均,sigmod函数使得即使适应度函数值相差不太大的个体被选到的概率相近,增加了基因的多样性。

使用:十进制编码来进行求解,改变交叉方案,保持两个个体等位基因和不变的情况下随机赋值。
参数如下:

上图可以看出该方案与之前有明显的不同,在整个过程中,个体始终遍布整个搜索空间,虽然新产生的个体大多还是集中在一个十字架型的位置上,但其他位置的个体比之前的方案要多。
看看结果,

这次的结果明显好于之前的所有方案,但仍可以看出,十进制的遗传算法的精度不高,只能找到最优解的附近,也有可能是算法的收敛速度实在太慢,还没有收敛到最优解。

遗传算法的探究到此也告一段落,在研究遗传算法时总有一种力不从心的感觉,问题可能在于遗传算法只提出了一个大致的核心思想,其他的实现细节都需要自己去思考,而每个人的思维都不一样,一万个人能写出一万种遗传算法,其实不仅是遗传算法,后面的很多算法都是如此。
为什么没有对遗传算法的参数进行调优,因为遗传算法的参数过于简单,对结果的影响的可解释性较强,意义明显,实验的意义不大。

遗传算法由于是模仿了生物的进化过程,因此我感觉它的求解速度非常的慢,而且进化出来的结果不一定是最适应环境的,就像人的阑尾、视网膜结构等,虽然不是最佳的选择但是也被保留到了今天。生物的进化的随机性较大,要不是恐龙的灭绝,也不会有人类的统治,要不是人类有两只手,每只手有5根手指,也不会产生10进制。
以下指标纯属个人yy,仅供参考

目录
上一篇 优化算法笔记(五)粒子群算法(3)
下一篇 优化算法笔记(七)差分进化算法

优化算法matlab实现(六)遗传算法matlab实现

❾ 时间序列差分法R语言

差分直接用函数diff就行了……

阅读全文

与r语言差分进化算法相关的资料

热点内容
算法设计与分析英文版 浏览:910
java程序员加班吗 浏览:141
编译检查的是什么错误 浏览:405
加密兔f码生成器免费 浏览:292
思科路由器命令明文加密 浏览:171
方舟生存进化服务器如何改名字 浏览:892
央行数字货币app怎么注册 浏览:431
51单片机显示时间 浏览:770
我的世界网易版怎么压缩地图 浏览:682
qq小程序云服务器和 浏览:740
方舟服务器怎么玩才好玩 浏览:557
单片机的部件 浏览:621
编译原理遍的过程 浏览:266
python读取json字符串 浏览:72
ubuntu1404安装php 浏览:636
lua能编译吗 浏览:118
思仙怎么看服务器 浏览:660
php微信图片防盗链 浏览:800
安卓1怎么读音 浏览:297
农业app怎么开通快捷支付 浏览:913