原文作者:Jack Stark

原文连接:https://zhuanlan.zhihu.com/p/81891467

在算法岗的面试中,除了数据结构和算法的编程题外,机器学习/深度学习的编程题也常常用来考察候选人的基础能力。不能讲了一大堆天花乱坠的算法,连个简单的算法都不能独立实现。

非极大值抑制(NMS)

NMS用来去掉重复的框。输入前面得到的框,对于每一类,按照score进行降序排序,最大的那个一定保留,然后和其他的框计算IOU。IOU大于一定阈值视为重复的框,丢弃掉。

import numpy as np
def nms(dets, thresh):x1 = dets[:, 0] # bbox top_xy1 = dets[:, 1] # bbox top_yx2 = dets[:, 2] # bbox bottom_xy2 = dets[:, 3] # bbox bottom_yscores = dets[:, 4] # 分类scoreareas = (x2 - x1 + 1) * (y2 - y1 + 1)order = scores.argsort()[::-1] # 按score做降序排序keep = []while order.size > 0:i = order[0]keep.append(i)xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)interp = w * hiou = interp / (areas[i] + areas[order[1:]] - interp)inds = np.where(iou <= thresh)[0]order = order[inds + 1] # 加1的原因。假设一个类别有n个框,这里的索引是n-1个iou是对应的,# 这里要映射到原来长度为n的order,所以加1。return keep

Batch Normalization

训练阶段,求均值和方差时,在N、H、W上操作,而保留通道 C 的维度。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 ...... 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。

import numpy as np
def batch_rorm(x, gamma, beta):# x_shape:[N, C, H, W]results = 0.eps = 1e-5x_mean = np.mean(x, axis=(0, 2, 3), keepdims=True)x_var = np.var(x, axis=(0, 2, 3), keepdims=True)x_normalized = (x - x_mean) / np.sqrt(x_var + eps)results = gamma * x_normalized + betareturn results

BN在测试阶段使用的统计量不是在一个batch上计算的,而是整个数据集上的,可以用移动平均法求得。

Group Normalization

计算均值和标准差时,把每一个样本 feature map 的 channel 分成 G 组,每组将有 C/G 个 channel,然后将这些 channel 中的元素求均值和标准差。各组 channel 用其对应的归一化参数独立地归一化。多用于检测分割等占用显存较大的任务。

import numpy as np
def group_norm(x, gamma, beta, G=16):# x_shape:[N, C, H, W]results = 0.eps = 1e-5x = np.reshape(x, (x.shape[0], G, x.shape[1]//G, x.shape[2], x.shape[3]))x_mean = np.mean(x, axis=(2, 3, 4), keepdims=True)x_var = np.var(x, axis=(2, 3, 4), keepdims=True)x_normalized = (x - x_mean) / np.sqrt(x_var + eps)results = gamma * x_normalized + betaresults = np.reshape(results, (results.shape[0], results.shape[1]*results.shape[2], results.shape[3], results.shape[4]))return results

Kmeans聚类

下面是简易版本的实现。

注意,np.random.randint()是取值范围是左闭右开区间,python自带的random.randint()是闭区间。

import numpy as np
import randomdef kmeans(data, k):m = len(data)     # 样本个数n = len(data[0])  # 维度cluster_center = np.zeros((k, n))   # k个聚类中心# 选择合适的初始聚类中心# 在已有数据中随机选择聚类中心# 也可以直接用随机的聚类中心init_list = np.random.randint(low=0, high=m, size=k)    # [0, m)for index, j in enumerate(init_list):cluster_center[index] = data[j][:]# 聚类cluster = np.zeros(m, dtype=np.int) - 1 # 所有样本尚未聚类cc = np.zeros((k, n))   # 下一轮的聚类中心c_number = np.zeros(k)    # 每个簇样本的数目for times in range(1000):for i in range(m):c = nearst(data[i], cluster_center)cluster[i] = c  # 第i个样本归于第c簇c_number[c] += 1cc[c] += data[i]for i in range(k):cluster_center[i] = cc[i] / c_number[i]cc.flat = 0c_number.flat = 0return clusterdef nearst(data, cluster_center):nearst_center_index = 0dis = np.sum((cluster_center[0] - data) ** 2)for index, center in enumerate(cluster_center):dis_temp = np.sum((center - data) ** 2)if dis_temp < dis:nearst_center_index = indexdis = dis_tempreturn nearst_center_indexif __name__ == "__main__":data = [[0,0], [1,0], [0,1], [100,100], [101,101], [102, 100], [-100,-100], [-101,-101], [-102, -100]]data = np.array(data)cluster = kmeans(data, 3)print(cluster)# [0 0 0 1 1 1 2 2 2] 每个样本对应的类别,结果有随机性

softmax

import numpy as npdef convert_label_to_onehot(classes, labels):"""classes: 类别数labels: array,shape=(N,)"""return np.eye(classes)[labels].Tdef softmax(logits):"""logits: array, shape=(N, C)"""res = np.zeros_like(logits)for i, row in enumerate(logits):exp_sum = np.sum(np.exp(row))for j, val in enumerate(row):res[i,j] = np.exp(val)/ exp_sumreturn resif __name__ == '__main__':# 有四个样本,有三个类别logits = np.array([[0, 0.45, 0.55],[0.9, 0.05, 0.05],[0.4, 0.6, 0],[1, 0, 0]])pred = np.argmax(softmax(logits), axis=1)print(pred)

softmax的上、下溢出问题

首先,什么是上溢出和下溢出?实数在计算机内用二进制表示,不是一个精确值。

  • 当数值过小的时候,被四舍五入为0,这就是下溢出。此时如果除以它就会出问题。(也有说法指超出所能表示的最小数字时是下溢出)。

  • 当数值过大超出所能表示的最大正数时,就会发生上溢出。

如对于一个数组  求softmax,

 ,如果 某个 非常大,那么  将会非常大,有可能上溢出;当所有  都非常小(绝对值很大的负数),求指数之后会接近于0,就有可能下溢出。

有个方法可以同时解决上溢出和下溢出的问题:

求所有z中的最大值max_z,然后求  即可,这样肯定不会有上溢出的风险,同时由于在分母上肯定有一个1,因此也不会有下溢出的风险。

PR曲线和ROC曲线的绘制

这两种曲线是评价分类模型performance的常用方法。其中,PR图的纵坐标是precision,横坐标是recall;ROC曲线的纵坐标是True Positive Rate,横坐标是False Positive Rate。它们的公式如下:

 ,

 ,

 ,

 .

实现的代码如下:

import numpy as np
import matplotlib.pyplot as plt
data_number = 50
labels = np.random.randint(0, 2, size=data_number)  # 真实的类别
scores = np.random.choice(np.arange(0.1, 1, 0.01), data_number)  # 模型判断样本为类别1的置信度def pr_curve(y, pred):pos = np.sum(y == 1)neg = np.sum(y == 0)pred_sort = np.sort(pred)[::-1]  index = np.argsort(pred)[::-1]  y_sort = y[index]print(y_sort)pre = []rec = []for i, item in enumerate(pred_sort):if i == 0:  pre.append(1)rec.append(0)else:pre.append(np.sum((y_sort[:i] == 1)) / i)rec.append(np.sum((y_sort[:i] == 1)) / pos)# 画图plt.plot(rec, pre, 'k')# plt.legend(loc='lower right')plt.title('PR curve')plt.plot([(0, 0), (1, 1)], 'r--')plt.xlim([-0.01, 1.01])plt.ylim([-0.01, 01.01])plt.ylabel('precision')plt.xlabel('recall')plt.show()def roc_curve(y, pred):pos = np.sum(y == 1)neg = np.sum(y == 0)pred_sort = np.sort(pred)[::-1]  index = np.argsort(pred)[::-1]  y_sort = y[index]print(y_sort)tpr = []fpr = []thr = []for i, item in enumerate(pred_sort):tpr.append(np.sum((y_sort[:i] == 1)) / pos)fpr.append(np.sum((y_sort[:i] == 0)) / neg)thr.append(item)# 画图plt.plot(fpr, tpr, 'k')plt.title('ROC curve')plt.plot([(0, 0), (1, 1)], 'r--')plt.xlim([-0.01, 1.01])plt.ylim([-0.01, 01.01])plt.ylabel('True Positive Rate')plt.xlabel('False Positive Rate')plt.show()pr_curve(labels, scores)
roc_curve(labels, scores)

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am喜欢文章,点个在看

【基础算法】常见的ML、DL编程题相关推荐

  1. 编程的50种基础算法_[校招基础算法]常见的ML、DL编程题

    原文作者:Jack Stark 原文连接:https://zhuanlan.zhihu.com/p/81891467 在算法岗的面试中,除了数据结构和算法的编程题外,机器学习/深度学习的编程题也常常用 ...

  2. 一、基础算法9:区间合并 模板题+算法模板(区间合并)

    文章目录 算法模板 离散化题目模板 模板题 区间和 原题链接 题目 题解 思路 算法模板 离散化题目模板 // 将所有存在交集的区间合并 void merge(vector<PII> &a ...

  3. Web前端开发精品课HTML CSS JavaScript基础教程第六章课后编程题答案

    编程题: 利用这样一章学到的知识,制作如图6-10所示的表格效果,并且要求代码语义化. 用VS2013新建ASP.NET空网站,添加新项,建立HTML文件,向其加入以下代码: <!DOCTYPE ...

  4. Web前端开发精品课HTML CSS JavaScript基础教程第四章课后编程题答案

    编程题 利用这一章学到的各种文本标签,把图4-25所示的网页效果做出来. 用VS2013新建ASP.NET空网站,添加新项,建立HTML文件,向其加入以下代码: <!DOCTYPE html&g ...

  5. Web前端开发精品课HTML CSS JavaScript基础教程第五章课后编程题答案

    编程题: 图5-15所示为一个问卷调查的网页,请制作出来.要求:大标题用h1标签:小题目用h3标签:前两个问题使用有序列表:最后一个问题使用无序列表. 用VS2013新建ASP.NET空网站,添加新项 ...

  6. 华为机试python需要需要当时编译通过吗_华为校招软开算法岗历年机试编程题77道C++代码详解(五)...

    温馨提示:考虑到华为每年校招机试在牛客网进行,所以本文以及同系列其他八篇文章的所有代码均仅保证在牛客网华为机试页面100%accepted.其他编译器使用本代码可能会出现不通过的情况,请知晓. 41. ...

  7. 招行算法2020届实习技术面编程题:实现O(1)最小栈(手撸代码)

    何为最小栈?栈最基础的操作是压栈(push)和退栈(pop),现在需要增加一个返回栈内最小值的函数(get_min),要求get_min函数的时间复杂度为o(1).python的栈肯定是使用list实 ...

  8. 【基础算法】最大公约数(Acwing872题)(辗转相除法)

    题目 给定n对正整数ai,bi,请你求出每对数的最大公约数. 输入格式 第一行包含整数n. 接下来n行,每行包含一个整数对ai,bi. 输出格式 输出共n行,每行输出一个整数对的最大公约数. 数据范围 ...

  9. 零基础学Java语言---编程题

    零基础学Java语言-编程题 注意:没有上机实际测过,代码仅供参考 1.温度转换 写一个将华氏温度转换成摄氏温度的程序,转换的公式是: °F = (9/5)*°C + 32 其中C表示摄氏温度,F表示 ...

最新文章

  1. 为什么老外不愿意用MyBatis?
  2. 2021算法竞赛入门班第八节课【数学】习题
  3. tensorflow随笔-条件循环控制(4)
  4. mysql 8.0 一条insert语句的具体执行流程分析(二)
  5. 华南地区最大数据中心上线 阿里云河源数据中心正式开服
  6. Java程序运行时,没有赋值的基本类型变量会在内存中分配空间吗?
  7. 安卓app开发-02-安卓app快速开发
  8. 我们DevSkim、Jarvis和USG是这样子的
  9. kingcms留言模块修改
  10. 卸载电脑右下角闪烁的游戏图标的教程
  11. Office Word和Excel的工具栏显示不全,只显示文件、绘图和帮助的解决办法
  12. 深入浅出通信原理2021-03-03
  13. cocos2dx ios iap接入
  14. php基础介绍,PHP基本语法的介绍
  15. java基础(家庭收支记账软件)
  16. 公司员工考勤管理系统C语言课程设计
  17. /mnt/sdcard或者/sdcard这是Android手机中SD卡的文件夹路径
  18. 案例分析架构分析汇总-系统架构师考试
  19. python实现dat文件批量转换为 excel文件 关键词 批量格式转换 dat文件 excel读写 诺祺 可发表知乎ed csdn ed
  20. Latex 双栏论文中间间隔消失 文字重叠

热门文章

  1. 博客园T恤PP泄漏版(附图)
  2. 爬虫+python3(网页图片)
  3. Python+MySQL学习笔记(一)
  4. PHP程序员的技术成长规划(转)
  5. Hibernate + MySQL中文乱码问题
  6. Thinkpad在Windows8上热键的解决方案
  7. 楼市调控要“围堵”更要“疏通”
  8. 自定义曲线_完美动力小课堂:AnimationCurve(动画曲线编辑) 如何使用?
  9. python多线程爬虫界面_多线程网页爬虫 python 实现
  10. Simulink中的某一个模块用了我自己定义的MATLAB function模块,但是出现的结果是:The block ‘**/matlab function/sfunction‘ is in an