文章目录
Lesson-02
Previous Course:
- Out of Vocabulary(OOV)?
Pr(w_o) = constant < Pr(w_1) : 设置成小于一次频率
简易版的导航地图:
- 城市经纬度数据
- 根据城市经纬度计算距离的函数
- 用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代码做如下改进
- visitied 去掉,因为for循环里面有if city in path判断,去掉visitied
能实现到某点所有路线的搜索, - 找到目标点,不返回,而是添加到搜索结果里面
- 对搜索结果排序,如果排序最少的路线包含了目标点表示已经找到了
- 由于是一层一层搜索,没搜索完一层进行排序,如果排序最小的路径包含目标点,说明是最优点,因为下一层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)