单细胞系列教程:归一化和回归(八)

导读

现在有了高质量的细胞,首先探索数据并确定任何不需要的变异来源。然后需要对数据进行归一化,计算方差并回归任何对数据有影响的协变量。

1. 学习目标

  • 学会如何执行归一化,方差估计,鉴定易变基因

2.Info

  • 目标
  1. 准确归一化和缩放基因表达值,以解决测序深度和过度分散计数值的差异。
  2. 识别最可能指示存在的不同细胞类型的变异基因。
  • 挑战

检查并删除不需要的变异,这样就不用在下游对这些细胞进行聚类

  • 建议
  1. 在执行聚类之前,对存在的细胞类型的期望有一个很好的了解。了解是否期望细胞类型复杂性较低或线粒体含量较高,以及细胞是否正在分化。
  2. 如果需要并且适合实验,则回归 UMI 的数量(默认使用 sctransform)、线粒体含量和细胞周期,因此不要驱动下游的聚类。

3. Set-up

首先为规范化和集成步骤,创建一个新脚本(文件 -> 新文件 -> R 脚本),并将其保存为SCT_integration_analysis.R

对于工作流程的其余部分,将主要使用Seurat包中提供的功能。因此,除了tidyverse库和下面列出的其他一些库之外,还需要加载Seurat库。

# Single-cell RNA-seq - normalization

# Load libraries
library(Seurat)
library(tidyverse)
library(RCurl)
library(cowplot)

此分析的输入是seurat对象。将使用在QC课程中创建的filters_seurat

4. 变异溯源

对生物协变量的校正用于挑选出特定感兴趣的生物信号,而对技术协变量的校正可能对于揭示潜在的生物信号至关重要。最常见的生物学数据校正是去除细胞周期对转录组的影响。这种数据校正可以通过针对细胞周期分数的简单线性回归来执行。

第一步是探索数据,看看是否观察到数据中的任何影响。细胞之间的原始计数不具有可比性,不能直接使用它们进行分析。因此,将通过除以每个细胞的总计数并取自然对数来执行粗略的标准化。这种标准化仅用于探索当前数据中变异的来源。

注意:Seurat最近引入了一种名为sctransform的归一化方法,该方法同时执行方差稳定并消除不需要的变化。这是目前工作流程中实施的方法。

# 归一化
seurat_phase <- NormalizeData(filtered_seurat)

接下来,获取这些标准化数据并检查是否需要数据校正方法。

5. 影响评估

要根据每个细胞的 G2/M 和 S 期标记的表达为每个细胞分配一个分数,可以使用Seuart函数CellCycleScoring()。此函数根据输入的canonical markers计算细胞周期阶段分数。

data文件夹中为您提供了一个人类细胞周期标记物列表,作为Rdata文件,称为cycle.rda。但是,如果您不使用人类数据,还有其他材料详细说明如何获取其他感兴趣的生物的细胞周期标记。

# 加载细胞周期 markers
load("data/cycle.rda")

# 为细胞进行细胞周期评分
seurat_phase <- CellCycleScoring(seurat_phase, 
                                 g2m.features = g2m_genes, 
                                 s.features = s_genes)

# 查看分配给细胞的细胞周期分数和阶段                              
View(seurat_phase@meta.data)   

在对细胞进行细胞周期评分后,使用PCA确定细胞周期是否是数据集中变异的主要来源。要执行PCA,需要首先选择特异性的特征,然后对数据进行缩放。由于高表达的基因表现出特异性,并且不希望“特异性基因”仅反映高表达,因此需要缩放数据以缩放随表达水平的变化。Seurat ScaleData()函数将通过以下方式缩放数据:

  • 调整每个基因的表达,使细胞间的平均表达为 0
  • 缩放每个基因的表达以使跨细胞的方差为 1
# 鉴定特异基因
seurat_phase <- FindVariableFeatures(seurat_phase, 
                     selection.method = "vst",
                     nfeatures = 2000, 
                     verbose = FALSE)
		     
# 缩放表达
seurat_phase <- ScaleData(seurat_phase)

注意:对于selection.methodnfeatures参数,指定的值是默认设置。

现在,可以执行PCA分析并将前两个主成分相互绘制。按细胞周期阶段划分数字,以评估相似性或差异。

# 执行 PCA
seurat_phase <- RunPCA(seurat_phase)

# 可视化
DimPlot(seurat_phase,
        reduction = "pca",
        group.by= "Phase",
        split.by = "Phase")

基于这个图,没有看到很大的差异,不会回归由于细胞周期引起的变化。

6. SCTransform

使用SCTransform归一化和回归不需要的变异。

现在可以使用sctransform方法作为更准确的归一化方法,估计原始过滤数据的方差,并识别特异基因。sctransform方法使用正则化负二项式模型对UMI计数进行建模,以消除由于测序深度(每个细胞的总 nUMI)引起的变化,同时根据具有相似丰度的基因的汇集信息调整方差(类似于一些Bulk RNA-seq的 方法)。

模型的输出(残差)是每个测试转录本的归一化表达水平。

Sctransform通过回归测序深度 (nUMIs) 自动计算细胞测序深度。但是,如果在探索步骤期间在数据中发现了其他无趣变化的来源,也可以包括这些来源。由于细胞周期阶段,观察到几乎没有影响,因此选择不从数据中回归。观察到线粒体表达的一些影响,因此选择从数据中回归。

为了运行 SCTransform,以下面的代码为例。

# SCTranform  不需要运行,仅展示
seurat_phase <- SCTransform(seurat_phase, vars.to.regress = c("mitoRatio"))

7. 迭代

  • 迭代数据集中的样本

由于数据集中有两个样本(来自两个条件),希望将它们保持为单独的对象并转换它们,因为这是集成所需的。首先将seurat_phase对象中的单元格拆分为“Control”和“Stimulated”:

# 按条件拆分 seurat 对象以对所有样本执行细胞周期评分和 SCT
split_seurat <- SplitObject(seurat_phase, split.by = "sample")

split_seurat <- split_seurat[c("ctrl", "stim")]

现在将使用“for 循环”在每个样本上运行SCTransform(),并通过在SCTransform()函数的vars.to.regress 参数中指定来回归线粒体表达式。

在运行这个 for 循环之前,如果有一个大型数据集,那么可能需要使用以下代码调整 R 内允许的对象大小的限制(默认为 500 * 1024 ^ 2 = 500 Mb):

options(future.globals.maxSize = 4000 * 1024^2)

现在,运行以下循环来对所有样本执行sctransform。这可能需要一些时间(约 10 分钟):

for (i in 1:length(split_seurat)) {
    split_seurat[[i]] <- SCTransform(split_seurat[[i]], vars.to.regress = c("mitoRatio"))
    }

注意:默认情况下,在归一化、调整方差和回归无意义的变异来源之后,SCTransform 将按残差对基因进行排序,并输出 3000 个变异最多的基因。如果数据集具有较大的单元数,则使用variable.features.n 参数将此参数调整得更高可能会有所帮助。

请注意,输出的最后一行指定“将默认检测设置为 SCT”。可以查看存储在seurat对象中的不同assays

# # 检查哪些assays存储在对象中
split_seurat$ctrl@assays

现在可以看到,除了原始RNA计数之外,现在的检测槽中还有一个SCT组件。最具可变性的特征将是存储在SCT分析中的唯一基因。当进行scRNA-seq分析时,将选择最合适的方法用于分析中的不同步骤。

8. 保存结果

在完成之前,将此对象保存到data/文件夹。回到这个阶段可能需要一段时间,尤其是在处理大型数据集时,最好将对象保存为本地易于加载的文件。

saveRDS(split_seurat, "data/split_seurat.rds")

# 加载rds到环境中
split_seurat <- readRDS("data/split_seurat.rds")
本文转载于网络 如有侵权请联系删除

相关文章

  • Visual Studio 2017 “无法查找或打开PDB文件“ 解决方法

    大家好,又见面了,我是你们的朋友全栈君。运行的时候提示无法查找或打开PDB文件解决办法(注意:必须使用管理员身份运行VS)第一步打开调试窗口的选项第二步调试——>常规——>勾选启用源服务器支持 它会弹出警告窗口,点“是”即可 第三步调试——>符号——>勾选Microsoft符号服务器我这儿选择使用http://msdl.microsoft.com/download/symbols,然后选择路径。 最后确定。点击运行,它自动连接服务器,将符号下载到本地并加载。 一两分钟后,如果显示下面的结果,说明OJBK了。(下载耗时取决于网速) 打开相应的文件夹,可以看到已经下载好的符号: 最后的话:1,第一次下载符号的时候会比较慢。下载完毕后,再次运行就很快,无需等待。 2,如果还是提示”无法查找或打开PDB文件”,尝试以管理员身份运行VS(经笔者测试,不以管理员运行的VS,无法把符号保存到指定路径上,可能是与文件夹的权限有关)。最近很多人私信我能不能分享以下PDB文件,我已将下载好的PDB文件(仅仅是项目工程编译时所下载的部分,可能不完整)上传到百度网盘。链接:https

  • Excel催化剂插件功能修复与更新汇总篇之十

    在半年时间里,自己使用过程中,发现的一些小bug,更新了一下,也追加了一些自定义函数,不成系统,就单独放在修复与更新系列中。一、第24波-批量发送邮件并指点不同附件不同变量Excel催化剂功能第24波-批量发送邮件并指点不同附件不同变量 追加了可以在正文中显示附件图片,方便阅读邮件时更快速看到全部内容。同样在87波用Outlook发邮件也可以 QQ群里经常有人说发送邮件功能有问题,笔者开发机器上一直正常,也不知道怎么排查,如果第87波不成功就用第24波发送,两个功能都能发邮件。OutLook中直接粘贴图片的方式排版不可行,发送出去一直是空的,所以最好用附件发图片,或者引用网络路径的图片如把图片(使用第102波可实现)。 第102波-批量上传本地图片至网络图床(外网可访问) 自定义函数新增一般自定义函数增加的比较多,用到时,觉得有机会重复用,就简单把它写在自定义函数里。其实日常最高频使用的也就是自己写的这些自定义函数,随手拿来就用,还可以根据内容自动更新结果,比起使用功能命令好太多了。因为第106波已经完成了历史大使命,可以让众多功能轻松触达,其实太多时候,连自己都不知道有哪些自定义函

  • 用户体验

    用户体验指标如今,越来越多的产品和服务被部署在网络上,这对衡量大规模的用户体验提出了新的挑战。不过,用户体验是一种纯主观的心理感受,存在着许多不确定因素和个体差异,要想精确地评估用户体验不是一件容易的事。传统的网站衡量指标PULSEPULSE是基于商业和技术的产品评估系统,被很多组织和公司广泛应用于监测产品的状况,这里的PULSE是指:PageView(页面访问次数)Uptime(持续运行时间)Latency(延迟)SevenDaysActiveUser(7天活跃用户数)Earning(收入)这些指标非常重要,并且和用户体验息息相关。但是,这些指标要么层次太浅,要么和用户体验不直接相关,很难用于评估用户界面的改变对用户的影响。新型指标为了弥补PULSE指标中存在的问题,Google的用户体验师提出了作为补充的度量体系:HEART框架,这里的HEART分别是指:Happiness(愉悦感)Engagement(参与度)Adoption(接受度)Retention(留存率)TaskSuccess(任务完成率)这5个仅仅是衡量指标体系的范畴,不同的产品可由此定义特定的指标,用以监控达到目标的

  • Java内存模型

    “Java内存模型(JavaMemoryModel,JMM)的定义是Java虚拟机试图实现Java程序在各种平台下都能达到一致的内存访问效果。” 我们都知道指令的执行是在CPU中进行的,而数据是存放物理内存中的,但是CPU的处理速度一般比内存快的多,于是我们引入高速缓存,它的存储交互很好的解决了CPU与内存之间的矛盾。与此同时摩尔定律表明了单核CPU的主频不可能无限制的增长,要想提升新能,需要多个处理器协同工作,也就是多核。高速缓存和多核的引入,也带来了一些问题:比如缓存一致性问题(当多个处理器运算都涉及到同一块内存区域的时候,就有可能发生缓存不一致的现象)。说到这里,要表达什么呢?在多核系统中,不同系统如何解决高速缓存和多核带来的问题呢,那就是内存模型。内存模型定义了共享内存系统中多线程程序读写操作行为的规范,它保证内存的正确性(可见性、有序性、原子性)。01—Java内存模型上面对于内存模型的描述可能会有不正之处,希望大家带着批判的眼光去看这篇文章。内存模型是为了保证共享内存的正确性,在不同平台上内存模型也是存在差异的,相同的程序在不同平台上,其并发的效果也是不同的。因此Java虚

  • 用了这么多年的 Java 泛型,你对它到底有多了解?

    本篇文章idea来自用了这么多年的泛型,你对它到底有多了解?,恰好当时看了「深入Java虚拟机的第三版」了解泛型的一些历史,感觉挺有意思的,就写了写Java版的泛型。 作为一个Java程序员,日常编程早就离不开泛型。泛型自从JDK1.5引进之后,真的非常提高生产力。一个简单的泛型T,寥寥几行代码,就可以让我们在使用过程中动态替换成任何想要的类型,再也不用实现繁琐的类型转换方法。虽然我们每天都在用,但是还有很多同学可能并不了解其中的实现原理。今天这篇我们从以下几点聊聊Java泛型:Java泛型实现方式类型擦除带来的缺陷Java泛型发展史点赞再看,养成习惯,微信搜索『程序通事』。 点击查看更多相关文章 Java泛型实现方式Java采用类型擦除(Typeerasuregenerics)的方式实现泛型。用大白话讲就是这个泛型只存在源码中,编译器将源码编译成字节码之时,就会把泛型『擦除』,所以字节码中并不存在泛型。对于下面这段代码,编译之后,我们使用javap-sclass查看字节码。观察setParam部分的字节码,从descriptor可以看到,泛型T已被擦除,最终替换成了Object。ps

  • Linux基础(软件安装)

    在Linux中,安装软件通常有三种途径:既可以使用安装包,也可以借助于APT,还可以从源码安装。他们各有特点,操作方式也不尽相同。Linux下的软件既可以是软件安装包,就像windows一样,也可以是源码包。而对于安装包而言,不同的Linux发行版所使用的格式不一样,比如RedHat使用的是yum格式安装包,Ubuntu则使用deb格式以Ubuntu为例,安装软件的第一种方法,就是搜索并找到所需要的deb包,然后双击安装即可。但是这种办法一般不推荐使用,因为Linux下软件一般都只包含最精简的代码,不会包含所依赖的库或者其他函数接口程序,这就导致我们直接安装deb包时常常会发现系统缺少它所依赖的其他库或者服务,不得已需要先安装它们,但是这些被依赖的库或者服务有可能还要依赖别的库和服务,一层套一层,比较麻烦。 第二种方法,是直接使用APT软件管理器,以安装vim为例,只需要一条命令就搞定了:sudoapt-getinstallvim这种方法的好处在于,APT可以帮我们解决软件和库的依赖问题,而且会自动搜索服务站点下载并安装。是最省时省力的办法。然而,有时我们需要研究、改造软件源码,在Li

  • Java-正则表达式学习总结

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文(CreativeCommons)1.学习背景在计算机诞生之初,主要用于相关科研计算,但是随着其逐步地平民化,在编程领域可以看到越来越多的字符串的利用,而正则表达式作为一种语法,其方便之处就在于可以利用简短的规则,将目标字符串操作实现,并且其目前已经被大多数编译器所支持。2.Java中Pattern类、Matcher类介绍Pattern类与Matcher类一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现。Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(Stringregex)简单工厂方法创建一个正则表达式。注意事项:查看JDK-API文档,可以看到complie方法调用的Pattern(Stringp,intf)是被private修饰的。而Pattern类中的patte

  • 巨颖:阅读理解进阶三部曲——关键知识、模型性能提升、产品化落地 | 猿桌会第 61 期

    AI科技评论按:阅读理解是近两年自然语言处理领域的热点之一,受到学术界和工业界的广泛关注。所谓机器阅读理解,是指让机器通过阅读文本,回答内容相关的问题,其中涉及到的理解、推理、摘要等复杂技术,对机器而言颇具挑战。近日,在雷锋网AI研习社公开课上,追一科技语义算法研究员巨颖作为CMRC2018中文机器阅读理解比赛的冠军团队成员之一,将为大家剖析机器阅读理解的关键知识点,并结合追一的实践经验,分享如何从数据、模型、训练角度提升模型性能,探讨AI时代阅读理解技术的产品化落地:http://www.mooc.ai/open/course/596?=aitechtalkjuying分享嘉宾:巨颖,追一科技语义算法研究员,清华大学硕士。主要负责阅读理解相关项目,为追一AIForce、坐席助手等产品提供技术支持,在阅读理解、文本分类、信息抽取等方面有深入的研究和丰富的应用经验。分享主题:阅读理解进阶三部曲——关键知识、模型性能提升、产品化落地分享提纲:何谓阅读理解:常用数据集和基础架构阅读理解的模型性能提升:从数据、模型、训练等角度阅读理解的产品化落地雷锋网AI研习社将其分享内容整理如下:今天的分享

  • GOPS·上海站--腾讯运维双雄专场回顾

    9月14-15日,GOPS全球运维大会上海站圆满举行,为期两天的运维盛宴,为各位运维人带来了相互交流和学习的绝佳平台。腾讯运维双雄专场也不例外,腾讯社交网络运营部致力于为行业分享前沿运维经验,9月15日现场干货满满,人满为患。下面就让开心到飞起的小编领大家一起去看现场盛况。 自动化运维篇2018年9月15日9:00-12:00梁定安 腾讯SNG运维技术总监腾讯织云产品负责人DevOps标准核心编写专家从运维技术的发展路径与技术,运维自动化的非显性技术要素,到面向业务价值的自动化运维,梁定安为大家深度剖析了腾讯运维能力的演进和架构变迁,运维自动化能力冰山下的关键因素,以及运维平台架构设计等技术细节。通过对大量真实案例的分析,和大家一起分享平台建设过程中的点滴思考。 梁定安还介绍到,在腾讯社交网络运营部,这些经过10多年的产品打磨、和不断改进落地出来的经验和方式沉淀成一个独特特性--包管理。包管理也是织云的核心能力,目前在稳定管理着30万台服务器的稳定运作。它具有一些巨大优势,如:几乎对业务无侵入的灵活的文件组织形式千人一面的操作体验让学习成本大大降低基于SVN的方案实现海量包版本的低耗

  • 大数据24小时 | Apple Pay搅局移动支付 Twitter再陷“泄露”风波

    大数据管理解决方案商识代运筹申请新三板挂牌上市识代运筹成立于2011年3月4日,主营大数据管理平台解决方案及应用、数据营销应用产品及服务、以及数据分析与洞察报告产品及服务的研发与销售。东北证券为本次挂牌申请的主办券商。浙江富润复牌,拟12亿元收购泰一指尚资产,向大数据、互联网领域扩张泰一指尚具有深厚的大数据技术背景,主要依托大数据技术优势,为客户提供互联网营销及营销数据分析及服务。浙江富润此番交易完成后有望形成“传统行业+大数据+互联网”的多元化业务。“成都环保私有云”大数据平台试运行,可预测雾霾,预报准确率高达80%“成都环保私有云”大数据平台目前还在试运行阶段,大数据运算得出空气质量预测曲线,准确率已达到了70%~80%。”。据悉,这套系统预计今年5月到6月份正式投入运行,届时提供的计算服务量将是以前的7到8倍。猎豹移动任命前VMware高管范承工为CTO,负责云存储和大数据业务移动安全和工具开发商猎豹移动今日在旧金山宣布,任命VMware前高级副总裁范承工为公司新一任首席技术官(CTO)。范承工将负责领导猎豹移动的全球研发业务.此外,猎豹移动计划将硅谷建设成为继北京之后的全球第二

  • php 中进制之间的转换

    作为一个屌丝程序员,没有丰富的经验,只是一味地敲着代码,但终究有一天,我也会成为一个技术大牛,今天学了点进制相互转换的几个函数常见的进制:二进制    binary       -----> bin八进制    octal        -----> oct十进制    decimal      -----> dec十六进制  hexadecimal    -----> hexphp提供了几常见进制之间转换的函数二进制转为其他进制binoct();//转为八进制bindec();//转为十进制binhex();//转为十六进制八进制转为其他进制octbin();//转为二进制octdec();//转为十进制octhex();//转为十六进制十进制转为其他进制decbin();//转为二进制decoct();//转为八进制dechex();转为十六进制十六进制转为其他进制hexbin();转为二进制hexoct();//转为八进制hexdec();//转为十六进制上面列举了这么多,其实自己感觉一点用没有,对于上面的这些函数,你只需要急着bin、oct、dec、he

  • 基于LDA KNN的人脸识别详解

    人脸识别(LDA+KNN方法): dataTrain=creatData(TrainDatabasePath);dataTest=creatData(TestDatabasePath);trainLabel=creatTrainLabelMat();testLabel=creatTestLabelMat();[train_lda,test_lda]=LDA(dataTrain,trainLabel,dataTest);:PCA降维计算协方差矩阵再求类内均值计算Sb、Sw(类间散布矩阵、类内散布矩阵)用SbSw来计算投影进行多分类问题求解。knnrecognition->knnsearch(计算距离,寻找最匹配的)->knnrecognitionLDA原理推荐博客地址: http://www.cnblogs.com/pinard/p/6244265.htmlhttp://www.cnblogs.com/pinard/p/6244265.html首先建立训练集,creatTraindata和相应的标签creatTrainLabelMat通过trainlabel1-50每10个都

  • 沁恒CH32V103C8T6(二): Linux RISC-V编译和烧录环境配置

    目录 沁恒CH32V103C8T6(一):核心板焊接和Windows开发环境配置 沁恒CH32V103C8T6(二):LinuxRISC-V编译和烧录环境配置 硬件准备 CH32V103开发板/核心版 WCH-Link 软件准备 软件主要是用于编译的RISC-VGCC,和用于烧录的OpenOCD.这两者都需要使用沁恒定制的版本 RISC-VGCC暂时只能使用WCH版,使用公版无法正确处理interrupt("WCH-Interrupt-fast")这样定义的中断 OpenOCD暂时只能用WCH定制版本,用公版的无法识别wlink MounRiver提供的工具链,包含RISC-VGCC和OpenOCD 前往http://mounriver.com/download下载MRS_Toolchain_Linux_x64,当前是MRS_Toolchain_Linux_x64_V1.50.tar.xz,RISC-VGCC版本为8.2.0. 解压工具链压缩包,目录结构为 ──beforeinstall │├──50-wch.rules │├──60-openocd.rules │├──l

  • Label Smoothing(标签平移)

    作用 标签平滑(Labelsmoothing),像L1、L2和dropout一样,是机器学习领域的一种正则化方法,通常用于分类问题,目的是防止模型在训练时过于自信地预测标签,改善泛化能力差的问题。 原理分析 以上便为从onehot编码到标签偏移的公式。可以清楚的看到做完这种变化之后把原来onehot为0的地方变大了,为1的地方变小了,这样就导致在算交叉熵的时候不会只考虑相应类别的那个预测对应的损失,此时会把对所有类别的预测都会考虑进来算损失,使得对所有类别的预测都会相应的变大,只不过经过smoothing之后真实类别的那部分权重更大,模型会更加侧重于对应真实类别的那个预测。 避免模型对于正确标签过于自信,使得预测正负样本的输出值差别不那么大,从而避免过拟合,提高模型的泛化能力 超参数一般设置为0.1 代码实现(pytorch) deflabel_smooth(label,n_class=3,alpha=0.1): """ 标签平滑 :paramlabel:真实lable :paramn_class:类别数目 :paramalpha:平滑系数 :return: """ k=alph

  • rbac —— 权限实践

    """ASM权限控制""" importos importcopy importasyncio asyncdefinit_user_permission(): """初始化权限表""" print('初始化权限表中。。。') role_data_data=[ { "_id":1, "role":"first_root", "role_cn":"一级管理员", "operate_powers":[2,3,4,5,10], "menu_powers":[1,4], "inherit":[], }, { "_id":2, "role":"second_root", "role_cn":"二级管理员", "operate_powers":[6,7,8,9], "menu_powers":[1,2,3,], "inherit":[3,4], }, { "_id":2, "role":"common_user", "role_cn":"普通用户", "operate_powers":[], "menu_powers":[1,], "inherit":[] }, ] role_data_coll

  • 发布一款Github博客皮肤

    Major是一款基于jekyll的皮肤,没有用hexo,原因是换机器后无法更新博客,但是可以用U盘考环境。总之很麻烦!折腾纠结好久,还是用jekyll!不用发布直接push文章即可,方便快捷。用的放心舒心…… 皮肤地址:https://github.com/Cyclone77/Major 演示地址:https://cyclone77.github.io 欢迎Star,Fork! 废话不多,先上图: 为博客园打抱不平:以前看到很多园子里的朋友说,博客园样式好丑,对移动端还不兼容等等!这里就给博客园打抱不平了!申请了js权限,想怎么搞怎么搞都没人管你好吧。一起我也搞过几个皮肤文章也有介绍。其实很人性化的好么! 皮肤由来 其实我本想学一下jekyll的语法,但是配置本地环境各种错误(我的win7居然还是黑色桌面,你们懂的),无奈我只能找个功能差不多有的,开始改! 这个皮肤来源于如下:连接地址https://github.com/Kaijun/hexo-theme-huxblog 没错,别不相信。把主要样式抽掉想怎么改怎么改,然后学习下jekyll简单的语法,接下来就剩下时间了。 我

  • luogu 3952 时间复杂度(模拟)

    时间复杂度 这道题从两个月前开始做,一直没做出来,最后今晚决心一定要做出来。于是开始认真的在打草纸上写思路,最后在AC的那一刻,差点哭了出来!! 题目大意 这个自己看吧,noip2017的D1T2 solution 先介绍一下这道题我们用到的每个变量他们的用处 stack[]记录变量的循环层 vis[]记录变量在栈中是否出现过 cmp函数,这个可以用作比较循环中a和b的大小 \[\begin{cases} a<b->进入新的一层循环\\ a>b->无法进入新的循环,循环终止\\ a=b->此循环为o1 \\ \end{cases} \] stop如果循环已经无法进入,那么就用stop计数 ans表示最终的复杂度层数,maxn表示当前一层循环的复杂度层数 接下来是三种状态的 ERR条件 \[\begin{cases} F、E不匹配\\ 变量名重复 \\ \end{cases} \] No,Yes均为题目定义 呼。然后就是代码了 首先你得会字符串处理一系列问题,如w,a,b之类的数字值,然后你得会普通的栈思想。 接下来第一步,我们如何处理复杂度问题

  • FUSE简介

    什么是FUSE 传统的文件系统是操作系统的一部分,放在操作系统内核里面实现。Fuse(FilesysteminUserspace),一个用户空间文件系统框架,提供给我们一组用于实现一个文件系统的API,使我们可以在用户态实现自已的文件系统。 FUSE的优缺点 1)传统文件系统都是定义在操作系统内核层面上的,要操作系统识别一种新的文件系统,必需重写内核,而内核态代码难以调试,生产率较低;但是用户空间编程和调试难度较小,有更多的语言可以选择(目前FUSE已经绑定了很多语言,比如c++、java等),还可以复用已有的库),从而能够大幅提高生产率,极大地简少了为操作系统提供新的文件系统的工作量。 2)一些服务可以通过统一的文件系统接口来进行访问,比如说ftp、sftp、samba 3)可以把非文件的服务当做文件来实现,比如把gmail提供的巨大的空间用来进行文件存储的GmailFilesystem 4)在用户态实现文件系统必然会引入额外的内核态/用户态切换带来的开销,对性能会产生一定影响。 FUSE的结构 fuse包括三个模块:用户空间库,内核模块以及mount工具 1)用户空间库给程序员提供

  • 傅里叶变换

      1#include<stdio.h> 2#include<math.h> 3 4typedefcharint8_t; 5typedefunsignedcharuint8_t; 6typedefunsignedshortuint16_t; 7typedefshortint16_t; 8 9#defineN64//傅里叶变换的点数 10#defineM6//蝶形运算的级数,N=2^M 11#defineN232//N/2 12#defineN416//N/4 13 14#definePI3.14159//圆周率 15#definePI26.28318 16 17//定义复数结构体 18typedefstruct 19{ 20floatreal;//实部 21floatimag;//虚部 22}complex; 23 24//傅里叶变换序列,一维 25floatpr[64]= 26{ 271234,1285,1151,1086,896,671,541,392,368,565,762,905,987,1103,1352,1601,1593,1565,15

  • setTimout 第三个参数(react源码新发现)

    从来都不知道,setTimeout有第三个参数。并且能解决很经典的循环输出问题。 for(vari=0;i<10;i++){ setTimeout(function(j){ console.log(j) },1000,i) }复制 这里的第三个参数就是传递给第一个方法参数的参数。 setTimeout(requestHostCallback,0,cb);复制 react源码scheduler部分出现这种写法

  • 1、MySQL索引优化分析

    一、索引基础 1、索引 索引(Index)是帮助MySQL高效获取数据的数据结构。 索引是数据结构。可以简单理解为排好序的快速查找数据结构。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。 2、索引优缺点 优势: 提高数据检索的效率,降低数据库的IO成本。 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。 劣势: 索引大大提高了查询速度,同时却会降低更新表的速度 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间 的。 二、MySQL索引 MySQL使用的索引的数据结构是BTree。 B-Tree是为磁盘等外存储设备设计的一种平衡查找树。 系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。 InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size

相关推荐

推荐阅读