Algorithm
func minDistance(word1 string, word2 string) int {
if len(word1)*len(word2) == 0 {
return len(word1) + len(word2)
}
dp := make([][]int, len(word1)+1)
for i := 0; i <= len(word1); i++ {
dp[i] = make([]int, len(word2)+1)
}
for i := 0; i <= len(word1); i++ {
dp[i][0] = i
}
for j := 0; j <= len(word2); j++ {
dp[0][j] = j
}
for i := 1; i <= len(word1); i++ {
for j := 1; j <= len(word2); j++ {
left := dp[i-1][j] + 1
down := dp[i][j-1] + 1
left_down := dp[i-1][j-1]
if word1[i-1] != word2[j-1] {
left_down += 1
}
dp[i][j] = min(left, min(down, left_down))
}
}
return dp[len(word1)][len(word2)]
}
func min(a, b int) int {
if a <= b {
return a
}
return b
}
Review
3 Pieces of Code I Can Write in Rust (but not Go)
作者讲了他入门rust之后,了解到的和go的区别,偏简单语法层面没有太多东西。
TIP
最近在搞压测仿真度技术调研,所谓的压测仿真度就是被压服务在压测过程的表现和线上真实情况表现的相似度。如果把压测期间的数据和线上真实情况的数据抽象成2个向量数据,仿真度的计算其实就是计算这2个向量的相似度。这和NLP中的文本相似度问题有点类似,所以网上找了相关资料进行学习从0到1,了解NLP中的文本相似度。
几个常用的向量距离:
- 欧几里得距离:在数学上其实就是2个向量代表的点之间的直线距离。
- 曼哈顿距离:从点A(x1, y1)到点B(x2, y2)的曼哈顿距离为两个点上在标准坐标系上的绝对轴距之总和。
- 切比雪夫距离:各座标数值差的最大值。
- 余弦距离:Cosine distance使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比于欧几里德距离,余弦距离更加注重的是两个向量在方向上的差异。
- 汉明距离:Hamming distance在信息论中,表示为两个「等长」字符串之间对应位置的不同字符的个数。
Share
分享一个器学习解决机维度灾难的方法: PCA的数学原理。
首先,什么是维度灾难呢?机器学习中的维度灾难这篇文章解释的比较清楚:当你的训练数据不够多的情况下,如果你强行增加分类器的维度的话,这时候就会导致训练出来的模型过拟合而缺少泛用性,导致过拟合的原因就是维度灾难。
那么,要怎么解决维度灾难呢?前面提到了导致维度灾难的2个条件:训练数据不够多和特征过多。最直接的办法就是增加你的训练数据,然而现实情况很可能是训练数据很珍贵没有那么容易增加。这时候就可以考虑第二个解决方案:降维。一个著名的维度降低技术就是通过主成分分析法(PCA)来实现降维。
PCA的数学原理这篇文章由浅入深的讲述了什么是PCA,以及为什么PCA能实现降维。文章末尾这段话很清晰的诠释了PCA:
PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性”