NLP课程-笔记-02

Lesson-02

​ Previous Course:

  1. Out of Vocabulary(OOV)?
    Pr(w_o) = constant < Pr(w_1) : 设置成小于一次频率

简易版的导航地图

  1. 城市经纬度数据
  2. 根据城市经纬度计算距离的函数
  3. 用networkx 来绘制图
任务要求:

输入:两个城市
输出:求出两个城市路径

思路:

构建图关系!!

类似图的遍历:visited 记录访问过的
广度优先遍历:
深度优先遍历:
改变出栈的规则从而实现不同的搜索方法:如广度优先是最先进后出,深度优先是先进先出,如果每次都改变栈里面的元素的排序就会导致不同的搜索方法

与自然语言处理关系

在自然语言处理方法很多都用到这个搜索方法

搜索算法

改变出栈的规则从而实现不同的搜索方法:如广度优先是最先进后出,深度优先是先进先出,如果每次都改变栈里面的元素的排序就会导致不同的搜索方法

广度优先遍历:

时间复杂度和空间复杂度都是b^n

路线搜索代码如下:

def search(start, destination, connection_grpah, sort_candidate):
    pathes = [[start]]  #每走一步都添加一个新的路径
    
    visitied = set()
    
    while pathes: # if we find existing pathes
        path = pathes.pop(0)   #获取当前要访问的路径
        froninter = path[-1]   #获取当前达到的节点
        
        if froninter in visitied: continue
            
        successors = connection_grpah[froninter]  #获取当前节点的所有连接节点
        print('当前访问节点:', froninter)
        print('当前节点邻接节点: ', successors)
        for city in successors:
            if city in path: continue  # eliminate loop 防止环形,也防止重复访问,和city in visitied有同样效果
                
            new_path = path + [city]
            
            pathes.append(new_path)
            
            if city == destination: return new_path
        
        visitied.add(froninter)
        
        pathes = sort_candidate(pathes) # 我们可以加一个排序函数 对我们的搜索策略进行控制
        print('sorted', pathes , '\n')

实现最短路径,或换乘最少的方法(也可以用最短路径算法),以上BFS代码做如下改进

  1. visitied 去掉,因为for循环里面有if city in path判断,去掉visitied
    能实现到某点所有路线的搜索,
  2. 找到目标点,不返回,而是添加到搜索结果里面
  3. 对搜索结果排序,如果排序最少的路线包含了目标点表示已经找到了
  4. 由于是一层一层搜索,没搜索完一层进行排序,如果排序最小的路径包含目标点,说明是最优点,因为下一层cost只会增加不会减少(cost必须为+才能用此方法)
def search(start, destination, connection_grpah, sort_candidate):
    pathes = [[start]]  #每走一步都添加一个新的路径
    
    visitied = set()
    
    while pathes: # if we find existing pathes
        path = pathes.pop(0)   #获取当前要访问的路径
        froninter = path[-1]   #获取当前达到的节点
        
        #if froninter in visitied: continue
            
        successors = connection_grpah[froninter]  #获取当前节点的所有连接节点
        print('当前访问节点:', froninter)
        print('当前节点邻接节点: ', successors)
        for city in successors:
            if city in path: continue  # eliminate loop 防止环形,也防止重复访问,和city in visitied有同样效果
                
            new_path = path + [city]
            
            pathes.append(new_path)
            
            if city == destination: 
              result_path.append(new_path)
        result_path = sorted(result_path, key = sort_candidate)
        if destination in result_path[0]:
          return result_path[0]
        #visitied.add(froninter)
        
深度优先遍历:

空间复杂度线性;可以改变每次搜索的深度来优化深度优先遍历

Prim最小生成树:

机器学习

以数据为驱动:

波士顿房价预测问题
每个特征的数据拟合处理

基本方法1:随机生成 kx+b 中的 k,b 然后用该函数计算与实际数据的误差,从大量的随机试验中选出误差最小的->得到拟合线

方法2:第一个k,b随机,然后随机一个方向然后逐步增长;如果沿着该方向误差变小,继续沿着该方向,直达达到预计值。如果误差变大,则随机选择另一个方向进行处理。
选对方向最关键, 如何找对改变的方向呢?
监督让他变化 —>监督学习
代码如下:

def loss_var_new(theta, x, y):
    #theta为传入的含k,b 的矩阵
    diff = np.dot(x, theta) - y  #h(x)  - y 的值
    return np.mean(np.square(diff))/2
def gradient_function(theta, x, y):
    #theta为传入的含k,b 的矩阵
    diff = np.dot(x, theta) - y  #h(x)  - y 的值
    return  (1.0/y.shape[0]) * np.dot(np.transpose(x), diff)
    
#格式化输入参数,调整矩阵,方便矩阵运算
num = x_rm.shape[0] 
X0 = np.ones((num, 1))
X = np.hstack((x_rm.reshape(num, 1), X0)) #增加一个维度,方便矩阵运算
Y = y.reshape(y.shape[0], 1)
alpha = 0.04


def gradient_descent(X, Y, alpha):
    theta = np.array([1, 1]).reshape(2, 1) #初始k b值[[1],[1]]
    gradient = gradient_function(theta, X, Y)
    while not np.all(np.abs(gradient) <= 1e-5):
        theta = theta - alpha * gradient
        gradient = gradient_function(theta, X, Y)
        #print(theta)
    return theta  
theta = gradient_descent(X,Y,alpha)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值