Jupyterlab交互式环境配置

安装jupyter notebook 插件 table of content 用于为长文本生成目录 一些color scheme, background image 之类 安装jupyter lab 为jupyter lab 安装插件 pixiedust: IBM的notebook debugger 安装 jupyterlab-variableInspector 用于更快捷地观察变量, 妈妈再也不用担心我整天print变量了

剑指offter读书笔记

面试流程 电话面试 远程面试 现场面试 在电话面试中,要用尽可能简洁和形象化的语言讲述问题; 在远程面试中,重点考察的是编码的能力,要注意以下三点: 想清楚再写 使用单元测试 注意代码风格 在编码之前,应该先写写单元测试(或构造一些边界情况) 现场面应该注意: 提前规划好路线及估算好时间,预留30min作缓冲 提前追备好几个问题问面试官 一场面试中的环节 自我介绍 (30s - 1min) 项目经历 (5min - 10min) 技术考察 (40min - 50min) 应聘者提问 (~5min) 自我介绍 暖场用 项目经历 建议使用以下的框架讲述自己的项目经历 Situation (简述项目的背景,如规模,功能,目标群体等等) Task (已完成的任务,注意用词:参与 vs 负责) Action (做了什么工作,怎么做的) Result (自己的贡献,完成了多少的功能,做了多少的优化,提升了多少的功能) 常见套路: 项目中遇到的最大的问题是什么?如何克服的? 从这个项目中学到了什么? 团队协作中遇到过什么问题?如何解决的? 为什么跳槽/为什么选择与本专业不同的职业? 回答为什么跳槽这类的问题,模板:在原来的工作岗位上没有了激情,寻求新环境改变、提升自己. 比如说自己在原工作上做了好多年,技能上没有了上升的空间,寻找 一家新的公司获得提升. 技术考察 通常是题目的考察。一定要注意,在写代码之前先和面试官沟通好,明确题意是什么,再讲述自己的解题思路,还要说说自己构造的测试用例,体现自己思考问题的严谨性与全面性。 应聘者提问 不要问什么公司未来的发展战略的问题,作为一线的开发者,问问关于自身岗位的问题,也不要去谈薪资,谈你是否会给我offer之类的问题. 面试能力的考察 沟通能力 学习能力 在沟通能力中,常见的套路是面试官提出一个描述并不清楚的问题,试图让面试者通过反复的沟通理解题意。从而,面试者要有主动沟通的意识 在考察学习能力方面,常见的两个套路:1. 最近在看什么书或项目?2. 试图让面试者解决他所不熟悉的领域问题,或者一个新概念,让面试者试图解决问题。 沟通能力和学习能力的考察常常交织在一起,要注意灵活应对。 总结 主动沟通意识 想清楚再写 先和面试官讲清楚解题的思路 进行单元测试 参考资料 何海涛. 剑指offer第二版

堆与堆排序

作为三大经典排序算法的堆排序,借助了堆这种精巧的数据结构,实现了排序. 理解了堆结构,再理解堆排序就不难了. 堆排序中三点要重点掌握: 怎样通过下标找到节点的父节点及子节点 建堆算法 堆调整算法 什么是堆 堆是一种数据结构,能够支持高效的操作.堆得一种经典实现是使用完全二叉树,这种实现也被称为完全二叉堆.事实上,堆的树结构只是它的一种逻辑结构,也就是画在纸的,在我们脑海中想象出来的,实际内存中的物理结构,常常是使用数组. 有时候堆也被称为优先级队列,这是它的逻辑上的名字,别人用起来就好像是这种结构具有某种优先级.一般来说,堆分两种: 大根堆和小根堆.作为一种数据结构,考察堆的增删改查操作.修改在堆中并不常见,忽略. 查找操作也只限定在查找最大值/最小值上. 增加操作通常加在堆的最后,删除操作通常删除根节点. 堆与数组的转化 堆结构和数组具有很好的对应,即给定一个规模为n的二叉堆,给堆得层序遍历序列对应的就是一个数组,大小同样为n. 从而,有了一个数组,就能把这个数组当成堆来用.使用三个公式即可找到任意节点i的父节点,左节点和右节点(如果有的话). 假设大小为n的数组arr,下标记为$i = 0, 1, \cdots, n - 1$, 则其左节点的下标为 $2 \cdot i + 1$, 其右节点(如果有)的下标为 $2 \cdot i + 2$, 对于下标为j的节点,其父节点的下标为 $(j - 1) / 2$, 注意当$j = 0$ 时 其父节点时自身,$(0 - 1) / 2 = 0$ 不会越界. 建堆与维护堆 堆中,最重要的两种操作是:建堆和维护堆.建堆是指给定一组数据,比如就是一个数组,通过某种算法将其调整为一个堆(调整操作也就是调整数组中元素的位置);维护堆是指当增删后的堆不再是一个堆时,用某种算法将其再次调整为一个合法的堆.一个合法的堆是指该堆满足堆序性,对于大根堆,堆序性是指根节点是堆中最大值,对于小根堆,定义类似. 已知对于一棵高度为h的满二叉树,其规模$n = 2^{(h + 1)}- 1$, 即 $h = O(\log n)$, 下面讨论建堆算法和堆调整算法. 建堆 最开始的思路 任意给定一个大小为n的数组,从零位置的元素出发,即从空堆出发,不断将新元素加入堆中,堆的增加操作复杂度为O(logn), 从而要建立一个大小为n的堆,复杂度为: $$\log 1 + \log 2 + … + \log n = O(n\log n)$$ 更细致的复杂度分析,假定一个规模为n的堆高度是h, 则该堆中第i层的节点个数是2^i, 其中 0 <= i < h, 建堆需要每一个元素i都上溯,则复杂度: $$1 \cdot 2^1 + 2 \cdot 2^2 + … + h \cdot 2^h = O(n \log n)$$ Floyd算法 算法一过于复杂,建堆就需要O(nlogn),还不如使用快排或归排.我们需要一个更高效的算法. 从相反的思路考虑,假设堆已经建好了,我们需要做的是调整堆,即下沉操作.时间复杂度: $$(h - 1) \cdot 2^1 + (h - 2) \cdot 2^2 + … + (h - h) \cdot 2^h = O(n)$$ Done! 维护堆 堆的维护发生在增加或删除操作之后. 对于增加操作,新元素被添加至树的最后一层,最坏情况下该元素需要O(logn)次操作上溯至根节点的位置,才能保证对的合法性;对于删除操作,根节点被删除,堆的最后一个节点被移至根节点的位置,最多需要O(logn)次操作下沉至最后一层,才能保证新堆的合法性....

周志华《机器学习》读书笔记

chapter 2. 模型选择和评估 Q1:什么模型才是好的模型? A1:泛化能力强的(即泛化误差小的)模型是更好的模型 Q2:怎样知道模型的泛化能力? A2:思路:将数据集分为训练/验证集,在训练集上训练模型,在验证集上跑模型得到的预测误差近似认为是泛化误差 Q3:具体来说,应该怎样对数据集进行划分? A3:常用三种划分方法: hand-out: 直接按比例划分 k-fold:k折交叉验证,特殊形式:留一法 boostrap sampling: 放回抽样 Q4:如何度量模型的预测误差?(怎样才能判断一个模型表现得更好?) A4:有很多的量化指标可以用来度量模型的误差,常用的有:错误率、正确率、查全率、查准率、F-1、 ROC、AUC、confusion matrix、cost matrix、F-beta、cost-sensitive curve、P-R图、BEP、cost curve等等 [Notes] 过拟合无法避免,我们只能缓解或是降低其发生的风险 训练/验证集要能够充分反映数据的原始规律 在不少的应用任务中,参数调得好不好往往对最终模型性能有着关键性影响 同一算法,不同参数,会产生不同的模型;不同算法,不同参数,会产生更多不同的模型 [Tips] 在验证集上进行完了模型选择和调参后,记得要在全体数据集(训练+验证集)上在跑一遍模型 直观理解查全率、查准率、F-1(P30) 记住 bias-varance 平衡的那张图 chapter 3. 线性模型 Q1:什么是线性模型?什么是广义线性模型? A1:线性模型:形如 y_hat = W_TX+b 广义线性模型:形如 y_hat = g(W_TX+b) Q2:怎样从二分类问题推广到多分类问题? A2:思路:通过组合多个二分类器,得到一个多分类器 具体: OVO:对于N个类别,训练 N(N-1)/2 个分类器 OVR:对于N个类别,训练 N 个分类器 MvM: 常用 ECOC技术 Q3:怎样处理类别不平衡问题? A3: 欠抽样(undersampling): 丢弃样本(但是不能随便丢弃,否则会丢失重要信息) 过抽样(oversampling): 增加样本(但是不能简单重复,否则会造成过拟合) 阈值移动(threshold-moving): 再缩放/再平衡 chapter 4. 决策树 Q1:什么是决策树? A1:形如 【此处应该有图】 Q2:怎样生成一棵决策树? A2:不同的算法基于不同的原则,如ID3基于信息增益原则,C4.5基于增益率原则,CART基于基尼指数 Q3:怎样对决策树进行剪枝? A3:常用两种剪枝策略: 1、预剪枝:训练时间短,但易于欠拟合 2、后剪枝:训练时间长,但不易欠拟合 Q4:怎样处理缺失值和连续值? A4:缺失值:C4.5 连续值:连续变量离散化,常用二分法 Notes 为了生成一棵决策树,就要合理的选择特征作为一系列的决策变量,为了怎样合理的选择特征这一问题,诞生了一系列的决策树算法 信息增益原则对可取值数目较多的特征有偏好;增益率原则对于可取值数目较少的特征有偏好 决策树决定的决策边界有一个明显的特征:轴平行 单决策树:【此处应该有图】;多变量决策树:【此处应该有图】 chapter 8. 集成学习 Q1:什么是模型融合? A1: 通过某种方式训练和组合多个模型,最终得到一个总的模型 Q2:为什么模型融合是可行的? A2: “好而不同”的单个模型,通过某种有效的方式组合在一起,是有可能得到一个比单模型更好的融合模型 Q3:都有哪些模型融合的方法? A3: 1、Boosting(串行):【此处应该有图】 2、Bagging(并行): 【此处应该有图】 Q4:什么是Boosting? A4: STEP1. 先从初试训练集训练出一个单模型 STEP2. 根据单模型的表现对训练数据分布进行调整,使得先前单模型做错的样本在后续的训练中得到更多的关注 STEP3. 根据调整后的训练数据训练下一个单模型,返回STEP2,直到训练得到了总共T个单模型 STEP4. T个单模型加权平均 Q5:什么是Bagging? A5: STEP1. 采样出T个训练数据集 STEP2. 基于各个采样集单独训练模型 STEP3. 模型融合 Q6:怎样组合多个单模型? A6:常用1、平均法,2、投票法,3、学习法(stacking) Q7:什么是模型间的差异性? A7:模型的多样性(差别有多么的大) Q8:怎样进行差异性的度量? A8:成对型差异性度量指标,有助于绘图观察:不合度量,相关系数,Q-统计量,k-统计量 Q9:怎样增强模型间的差异性? A9:有如下几种常用方法:1、数据样本扰动,2、特征扰动,3、输出扰动,4、算法参数扰动 Notes 模型融合中的核心问题:1、怎样训练多个单模型?2、怎样组合多个单模型? Boosting主要关注降低偏差;Bagging主要关注降低方差; RF中的k同时使用了数据样本扰动和特征扰动两种方式,且k一般取log_2(d), d是特征的维数 不稳定模型(对数据敏感):决策树、神经网络 稳定模型(对数据不敏感):SVM、朴素贝叶斯、KNN、线性分类器

Python tutorial 摘录

前言 学习Python良久,想全面的回顾一下Python的基础知识,于是阅读了Python3.4的官方教程;在这里做要点的摘录,只为提纲挈领,对细节不做过多的解释。 Control Flow Tools TODO Data Structures list, dict, set, tuple, str More on Lists methods: append(x), extend(L), insert(i, x), remove(x), pop([i]), clear(), index(x), count(x), sort(), reverse(), copy() Using Lists as Stacks(OK) Using Lists as Queues(Not efficient) -> Using collections.deque Comprehensions List/Set/Dictionary Comprehensions Looping Techniques Using the items() method to loop over dictionaries Using the enumerate() function to loop over a sequence Using the zip() function to loop over two or more sequences at the same time Using the reversed() function to loop over a sequence in reverse Using the sorted() function to loop over a sequence in sorted order Comparing Sequences and Other Types (1, 2, 3) < (1, 2, 4) [1, 2, 3] < [1, 2, 4] 'ABC' < 'C' < 'Pascal' < 'Python' # Comparisons can be chained (1, 2, 3, 4) < (1, 2, 4) (1, 2) < (1, 2, -1) (1, 2, 3) == (1....

Python对象持久化

面向对象 python 并不会自动调用超类的构造函数!需要编程者自己显示的调用 对象持久化 dump & load #!/usr/bin/python # Filename: pickling.py import cPickle as p #import pickle as p shoplistfile = 'shoplist.data' # the name of the file where we will store the objec shoplist = ['apple', 'mango', 'carrot'] # Write to the file f = open(shoplistfile, 'w') p.dump(shoplist, f) # dump the object to a file f.close() del shoplist # remove the shoplist # Read back from the storage f = open(shoplistfile, 'r') storedlist = p.load(f) print storedlist f.close() 参考资料 a byte of python

Thinking in Java 笔记 01

面向对象程序设计方法 一切东西都是对象 程序就是一堆对象的集合,他们之间互通信息 每个对象都有自己的存储空间(即“内存资源”) 每一个对象(object)都有一种类型(class) 同一类的所有对象能够相应也响应相同的消息 每个对象都需要“资源”才能生存,其中最重要的一类“资源”,就是内存 内存池 = 内存堆(Heap) 参考书 Grady Booch 《Object-Oriented Design with Applications,第2版 本》

面向对象程序设计-JAVA 学习笔记01

对象交互 面向对象的设计思想 看问题域中包含哪些对象,他们之间的交互行为是怎样的 例子:数字时钟 关于private,public 私有的含义是对于类而言的,而不是对对象来说私有 若一个对象/函数没有private,public的访问属性限制,则这个东东被视为friendly的,即同一个包内的其他对象可以访问这一个这个成员 包 JAVA的类管理是通过文件夹来实现的,简单来说,就是一个文件夹就是一个包,里面的若干个JAVA文件就同属于这个包的。 full name vs. given name 类对象和类函数 简单来说,就是加了static修饰符的对象和函数 类对象和类函数只能被同级对象/函数访问,无法被对象变量/对象函数访问

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick Start Create a new post $ hexo new "My New Post" More info: Writing Run server $ hexo server More info: Server Generate static files $ hexo generate More info: Generating Deploy to remote sites $ hexo deploy More info: Deployment

[Leetcode每日打卡]旋转链表

原题描述 旋转链表 思路 简单题,可使用模拟法。注意处理空链表、k >=链表长度len等边界情况 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* rotateRight(ListNode* head, int k) { ListNode* cur = head; if (cur == nullptr) return 0; int len = 0; while (cur) ++len, cur = cur->next; int first = (len - (k % len)) % len; if (first == 0) return head; cur = head; for (int i = 0; i < first - 1; ++i) { cur = cur->next; } ListNode* last = cur->next; cur->next = nullptr; ListNode* ans = last; while (last->next) last = last->next; last->next = head; return ans; } }; 运行结果 执行用时:8 ms, 击败82.17%的用户 内存消耗:11.4 MB,超过44.80%的用户