/images/avatar.png

vllbc

ELMo

ELMo

在Transformer中提到了ELMo解决了word2vec中存在的多义词问题,其使用双向的LSTM作为特征提取器,考虑了上下文的语义,所以可以解决多义词问题。这篇文章就详细介绍一下ELMo。

线性回归

参考:https://cuijiahua.com/blog/2017/11/ml_11_regression_1.html

什么是回归?

回归的目的是预测数值型的目标值。最直接的办法是依据输入写出一个目标值的计算公式。

HorsePower = 0.0015 * annualSalary - 0.99 * hoursListeningToPublicRadio

这就是所谓的回归方程(regression equation),其中的0.0015和-0.99称为回归系数(regression weights),求这些回归系数的过程就是回归。一旦有了这些回归系数,再给定输入,做预测就非常容易了。具体的做法是用回归系数乘以输入值,再将结果全部加在一起,就得到了预测值。

计数质数

计数质数

https://leetcode-cn.com/problems/count-primes/

一开始直接暴力,隐约感觉会超时,果然不出我所料

class Solution:
    def countPrimes(self, n: int) -> int:
        counts = 0
        for i in range(n):
            if self.isprime(i):
                counts += 1
        return counts
                
    def isprime(self,n):
        from itertools import count
        if n <=1:
            return False
        for i in count(2):
            if i* i > n:
                return True
            if n % i == 0:
                return False

我还特意用了itertools库,没想到还是超时了

感知机算法

感知机算法

感知机印象中没有系统学习过但是是一个很简单的算法,最近看了一下李航老师的统计学习方法,发现感知机的思想和svm十分类似,并且比svm简单的多,不需要间隔最大,只需要分开就可以。同时老师在课堂上面讲的版本也有点不一样,主要是计算上的不同,本质还是一样的。然后就打算整理一下这一块。

KNN

导入包

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import plotly.graph_objects as go

导入数据

data = pd.read_csv("./datasets/Social_Network_Ads.csv")
X = data.iloc[:,[2,3]].values
Y = data.iloc[:,4].values
# scatter = go.Scatter(x=X[:,0],y=X[:,1],mode='markers',marker={'color':Y})
# fig = go.Figure(scatter)
# fig.show()
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.25,random_state=0)

标准化

from sklearn.preprocessing import StandardScaler
sca = StandardScaler()
X_train = sca.fit_transform(X_train)
X_test = sca.transform(X_test)

训练模型

from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=5,p=2)
model.fit(X_train,Y_train)
KNeighborsClassifier()

模型得分

model.score(X_test,Y_test)
0.93

最大数

最大数

题目:

https://leetcode-cn.com/problems/largest-number/

思路:

一开始直接暴力搜索,把所有的情况都列举然后比较,结果超时了,最后利用了自定义排序的方法

代码:

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        class Comapre(str):
            def __lt__(self,other):
                return int(self+other) > int(other+self)
        nums.sort(key=Comapre)
        return str(int(''.join(map(str,nums))))

注意的是这里利用了自定义的比较类型,继承了str,也可以从functools里导入cmp_to_key方法来实现比较

检查平衡性

检查平衡性

题目:

https://leetcode-cn.com/problems/check-balance-lcci/

思路:

算深度,然后作差是否大于1

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if self.maxdepth(root) < 1:
            return True
        if abs(self.maxdepth(root.left) - self.maxdepth(root.right)) > 1:
            return False
        return self.isBalanced(root.right) and self.isBalanced(root.left)


    def maxdepth(self,root):
        if not root:
            return 0
        return 1 + max(self.maxdepth(root.right),self.maxdepth(root.left))