js 原生的时间格式化挺强的,内部用的是 Intl.DateTimeFormat()
,附 文档 , Intl
对象是 ECMAScript
国际化 API
的名称空间,它提供语言敏感的字符串比较、数字格式化以及日期和时间格式化。
以下附实用:
1 | const date = new Date('2020/9/25 09:40:50'); |
Tip: 每个日期时间组件属性的默认值都是 undefined
,但如果所有组件属性都未定义,则假定年、月和日为 numeric
。
js 原生的时间格式化挺强的,内部用的是 Intl.DateTimeFormat()
,附 文档 , Intl
对象是 ECMAScript
国际化 API
的名称空间,它提供语言敏感的字符串比较、数字格式化以及日期和时间格式化。
以下附实用:
1 | const date = new Date('2020/9/25 09:40:50'); |
Tip: 每个日期时间组件属性的默认值都是 undefined
,但如果所有组件属性都未定义,则假定年、月和日为 numeric
。
引用自 NLP-LOVE/ML-NLP
数据挖掘十大算法之一的EM算法。
最大期望算法(Expectation-maximization algorithm,又译为期望最大化算法),是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。
最大期望算法经过两个步骤交替进行计算,
第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;
第二步是最大化(M),最大化在E步上求得的最大似然值来计算参数的值。M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行。
极大似然估计用一句话概括就是:知道结果,反推条件θ。
现实应用中属性维数经常成千上万。而许多学习方法都涉及距离计算,而高维空间会给距离计算带来很大的麻烦,例如当维数很高时甚至连计算内积都不再容易。
事实上,在高维情形下出现的数据样本稀疏、距离计算困难等问题,是所有机器学习方法共同面临的严重障碍,被称为 “维数灾难(curse of simensionality)”。缓解维数灾难的一个重要途径是 降维(dimension reduction) , 亦称 ”维数约简“, 即通过某种数学变换将原始高维属性空间转变为一个低维 ”子空间“(subspace), 在这个子空间中样本密度大幅提高,距离计算也变得更为容易。
为什么可以降维呢? 因为很多时候,人们观测或者收集到的数据样本虽然是高维的,但与学习任务密切相关的也许仅是某个低维分布,即高维空间的一个低维 ”嵌入“。例如:数据属性中存在噪声属性、相似属性或冗余属性等,对高维数据进行降维能在一定程度上达到提炼低维优质属性或降噪的效果。
在很多算法中,降维算法成为了数据预处理的一部分,如
PCA
目前已经存在大量的数据降维算法,可以从另个不同的维度对它们进行分类。按照是否有使用样本的标签值,可以将降维算法分为 有监督降维 和 无监督降维 ;按照降维算法使用的映射函数,可以将算法分为 线性降维 与 非线性降维 。
PCA
。有监督的降维算法 则使用了样本标签值,是一种有监督学习算法,其典型代表是 LDA
PCA
和 LDA
都是 线性降维算法 ; 非线性降维算法则构造一个非线性映射完成数据的降维。很多时候数据是非线性的,因此需要使用 非线性降维算法 以取得更好的效果,LLE
就是一种 非线性降维算法对于 线性降维,我们主要使用 投影 的方法。对于 非线性降维, 我们主要使用 流形学习。流形学习(manifold learning) 是一种借助拓扑流形概念的降维方法,流形是指在局部与欧式空间同胚的空间,即在局部与欧式空间具有相同的性质,能用欧氏距离计算样本之间的距离。这样即使高维空间的分布十分复杂,但是在局部上依然满足欧式空间的性质,基于流形学习的降维正是这种 “邻域保持” 的思想。可以简单的将流形理解成二维空间的曲线,三维空间的曲面,等几何体在更高维空间的推广。
有时候, 投影 并不是降维的最佳方法。在很多情况下,子空间可能会扭曲和转动,比如图所示的著名的瑞士卷数据集:
简单地将数据集投射到一个平面上会将瑞士卷的不同层叠在一起,如图左侧所示。但是,你真正想要的是展开瑞士卷所获取到的类似图右侧的 2D 数据集。这时候就需要使用 流形学习。
所以采用哪种方式降维,这一切都取决于数据集。
大概介绍一下几个比较出名的降维算法: PCA
、 LDA
、 LLE
Service Workers
可以让你的网页在离线模式下访问。 附几个链接:
- Service Workers 使用文档
- Workbox:快速构建
Service Workers
的工具- A 5 minute intro to Workbox 3.0
IE
… 使用前请用 caniuse 查询支持情况https
的页面才支持。为了调试,本地 localhost
也可以通过观察拥有 Service Workers
的网站,比如说 996.ICU ,通过打开 Chrome dev tools => Application => Service Workers 选项,可以看到这个网站注册了一个 Service Workers
, 它使用的源文件是 service-worker.js ,点击打开可以看到里面的代码,这个很简单,而且使用 workbox
生成的。
其实我们的浏览器会记录所有访问过的网站里面有 Service Workers
的。在上面的调试窗口下,可以看到 996.icu 下面还有一个 Service workers from other domains 的选项,打开就可以看到其他使用 Service Workers
的网站了。我看了我访问过的那些网站, 除了 lodash 的 sw.js 不知道用什么生成的外,其他的都用的是 workbox
生成的。
下面简单说一下步骤,简单明了,保证你一看就会。就以 frontend-nanodegree-mobile-portfolio(这是上一篇博文网页关键渲染路径中的实例仓库) 为例
CI
(continuous integration) : 持续集成。用来做一些自动化工作,比如程序的打包,单元测试,部署等。
- 我最常用的
git
仓库是Github
,Travis CI
对Github
支持的特别好,使用非常方便。- 公司的仓库在
Gitlab
上,Gitlab
自己内部集成了Gitlab CI
。本文主要介绍这两种
CI
自动化打包部署flutter apk
Travis CI
与 Github
结合比较紧密,对 GitHub
上的开源Repo是免费的,私有Repo收费。
Travis CI
有两个网址,一个是 travis-ci.org , 另一个是 travis-ci.com 。 官方推荐使用 travis-ci.com
, 告诉我们 travis-ci.org
后面会全部迁徙到 travis-ci.com
。 目前在两个网址都可以实现效果,没啥区别,但不能同时使用。
下面以 travis-ci.org
为例,反正我刚开始用的时候就选了这个,索性 “将错就错”
使用 github
账号登录 travis-ci.org
, 在个人设置中心可以看到自己在 github
上的仓库, 打开对应的开关即可激活。如图:
.travis.yml
在项目根目录下添加 .travis.yml
, travis
提供了多种语言要用的例子, 可以参考这儿。这儿想实现一个 flutter
打包 apk
的 CI
, 我们可以参照它提供的 android
例子。 但是 flutter
和 android
都更新的太快了,所以例子上用的都是老的 android
。
这是我的 .travis.yml
, 基于最新的 flutter
版本(目前稳定版是 flutter 1.5.4
)与 android28
进行打包。我这儿暂时没有加签名…
谷歌开发了 dart
语言,目前已经可以用作 web
端 和 移动端(flutter
),在谷歌的展望中以后还可以做桌面端,大一统啊。 此处记录下一些基本又重要,自己会选择性忽视和经常要用的点。
特点:
js
,拥有 var
) 或 类型注解(使用 静态类型关键字 来声明变量,以获得严格的类型检查)。我们可以这样编写我们的代码,在函数的入口,即定义函数的参数时使用 类型注解;而在函数内部,当类型并不重要时使用 动态类型。看 Crash Course 得到的一部分知识。讲的真好,翻译的也真好。
每两年左右,随着材料和制造技术的发展,同样大小的空间,IC能塞进两倍数量的晶体管。这就是 摩尔定律
windows
由于缺乏内存保护,有时候程序的不当使用会导致系统崩溃,从而引发蓝屏文件的本质是一段二进制,通常在前面的几位是文件头,描述了文件的大小,描述了如图片文件的行列数(什么时候换行)…
windows
删除文件的时候其实只是删除了目录文件下对该文件的记录,让我们无法看到,而没有在在硬盘上的删除该文件。所以我们可以通过有些工具恢复删除的文件windows
上同一块存储上移动文件特别快,原因是因为只需要在原来目录下的目录文件中删除该文件信息,然后再目标目录下的目录文件中添加该文件信息即可。而不是在存储结构上真实的移动windows
在多次进行文件的删除、修改、迁移之后,会使得很多文件在存储上占用的存储块都是不连续的。而 碎片整理 就是从新让文件在存储上顺序排列的过程( SSD
不需要 碎片整理 )图片颜色用 红绿蓝 三种颜色合成表示,每个颜色都是 1 个字节, 所以一个 16px 的图片 占用的内存是 16 * 3 = 48 字节。我们可以用以下方法实现减少内存。
很早之前看过一句话,最近又重新看到。一个程序员,应该花80%的时间做代码设计、画UML图、画时序图,20%的时间写code和debug。而我恰恰相反,是不是得改变一下做法了?
flutter
做出来的 App 性能非常好,比 react-native
好太多了,基本和原生一样。flutter
里面的组件叫做 Widget
,名称不同,思想一样,下面是一些组件通信的技巧。
这个简单,父组件给子组件传递回调函数参数,子组件在需要的地方调用传进来的回调函数即可
类似于 vue
中的 refs
, 可以直接获取子组件 state
的引用
示例代码:
main.dart
:
1 | import 'package:flutter/material.dart'; |
机器学习算法可以分为三大类:监督学习、无监督学习和强化学习。
- 监督学习可用于一个特定的数据集(训练集)具有某一属性(标签),但是其他数据没有标签或者需要预测标签的情况。
- 无监督学习可用于给定的没有标签的数据集(数据不是预分配好的),目的就是要找出数据间的潜在关系。
- 强化学习位于这两者之间,每次预测都有一定形式的反馈,但是没有精确的标签或者错误信息。
有几种常见的关于监督学习和无监督学习的算法。比如决策树、朴素贝叶斯分类、最小二乘法(是一种计算线性回归的方法)。在这儿,主要介绍一种无监督学习的算法:奇异值分解(SVD), 在线性代数中,SVD 是复杂矩阵的因式分解。
设 A 是 n 阶矩阵,若存在数 $\lambda$ 及非零的 n 维列向量 $\nu$ ,使得
$$A\nu=\lambda\nu$$
成立,则称$\lambda$是矩阵 A 的特征值,称非零向量 $\nu$ 是矩阵 A 属于特征值 $\lambda$ 的特征向量