<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[bubingyang的博客]]></title><description><![CDATA[write]]></description><link>https://blog.youkuaiyun.com/bubingyang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; bubingyang]]></copyright><item><title><![CDATA[玩转python（8）图形界面随想]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/109297085</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/109297085</guid><author>bubingyang</author><pubDate>Mon, 26 Oct 2020 20:53:02 +0800</pubDate><description><![CDATA[两年没写博客了，这两年自己主导设计和开发了不少项目，收获颇丰，以后的博客中我会逐一介绍（不限于玩转python系列）。
我为什么要做图形界面？
假设你在负责一个项目，如果你的用户和我们一样是技术人员，显然应该留给用户更多的选择，使自己的产品尽可能灵活。直白一点就是：我提供足够的功能就行，怎么用是你的事。
某种意义上说，这其实是把责任抛给了用户（这里没有贬低的意思）。但当你的用户是技术小白，这样做是不行了，此时需要遵循的原则是，尽量屏蔽技术细节，用俗语代替术语，尽可能使用图形界面。最后一点尤为重要，命令行对于]]></description><category></category></item><item><title><![CDATA[玩转python（7）python多协程，多线程的比较]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80807202</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80807202</guid><author>bubingyang</author><pubDate>Mon, 25 Jun 2018 20:42:05 +0800</pubDate><description><![CDATA[前段时间在做一个项目，项目本身没什么难度，只是数据存在一个数据接口服务商那儿，这就意味着，前端获取数据需要至少两次http请求，第一次是前端到后端的请求，第二次是后端到数据接口的请求。有时，后端接收到前端的一次请求后，可能需要对多个接口进行请求，按照传统串行执行请求的方法，用户体验肯定是非常糟糕了，而且对计算资源也是极大的浪费，正好前段时间学习了协程和线程的知识，所以我花了一些时间，对几种可行方案...]]></description><category></category></item><item><title><![CDATA[玩转python（6）协程]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80527038</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80527038</guid><author>bubingyang</author><pubDate>Thu, 31 May 2018 16:59:27 +0800</pubDate><description><![CDATA[多任务系统一般都需要解决一个问题：多个任务如何调度。抢占式调度就是一种很常见的任务调度机制。以单核模式下的进程调度为例，一个进程处于运行状态，其他的处于就绪队列，等到当前运行的进程放弃CPU的使用权，系统将CPU立刻分配给新到达的进程，由于任务的执行顺序是不确定的，看上去就像一堆任务在竞争CPU的使用权，所以这种多任务运行方式叫做“多任务竞争”。与之对应的是非抢占式调度。当前任务会持续执行下去直到...]]></description><category></category></item><item><title><![CDATA[玩转python（5）生成器的原理]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80372798</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80372798</guid><author>bubingyang</author><pubDate>Sat, 19 May 2018 11:27:52 +0800</pubDate><description><![CDATA[函数的调用满足“后进先出”的原则，也就是说，最后被调用的函数应该第一个返回，函数的递归调用就是一个经典的例子。显然，内存中以“后进先出”方式处理数据的栈段是最适合用于实现函数调用的载体，在编译型程序语言中，函数被调用后，函数的参数，返回地址，寄存器值等数据会被压入栈，待函数体执行完毕，将上述数据弹出栈。这也意味着，一个被调用的函数一旦执行完毕，它的生命周期就结束了。
在python这样的解释型语言...]]></description><category></category></item><item><title><![CDATA[玩转python（4）生成器]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80359470</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80359470</guid><author>bubingyang</author><pubDate>Fri, 18 May 2018 09:09:45 +0800</pubDate><description><![CDATA[生成器是python中一个很有趣的概念，不只是有趣，而且很实用。
我们经常需要生成数组，一般来说，数组占据内存的大小和数组的长度有直接关系。数组中的元素越多，长度越长，占据的空间也越大。下面的代码中，我们初始化3个列表，并分别存放10，100，1000个元素：

import sys

l1 = list()
l2 = list()
l3 = list()

for i in range(10):...]]></description><category></category></item><item><title><![CDATA[玩转python（3）全局解释器锁学习心得]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80258535</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80258535</guid><author>bubingyang</author><pubDate>Wed, 09 May 2018 19:47:47 +0800</pubDate><description><![CDATA[这几天我在GitHub上读了GIL的实现和python主循环的源码，总算对python的GIL有了大概的理解，现在来分享一下心得。 
GIL源码上有这样一段注释：


  The GIL is just a boolean variable (locked) whose access is protected by a mutex (gil_mutex), and whose changes ar...]]></description><category></category></item><item><title><![CDATA[玩转python（2）多线程的历史2]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80240280</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80240280</guid><author>bubingyang</author><pubDate>Tue, 08 May 2018 15:21:09 +0800</pubDate><description><![CDATA[线程这个概念早在多核CPU出现之前就提出来了，单核时代的多线程主要是为了让CPU尽量不处于空闲状态，使其计算能力始终能得到利用。但本质上讲，在任意时刻只有一个线程在执行。

尽管任意时刻只有一个线程在执行，但是依然有些问题需要解决，其中最重要的就是线程安全。这个问题的来源很简单，我之前说过，CPU对指令是一条一条执行的，不过要注意的是，高级语言中的一行代码在汇编语言层面上，可能由多条汇编指令组成的...]]></description><category></category></item><item><title><![CDATA[玩转python（1）多线程的历史1]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/80228545</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/80228545</guid><author>bubingyang</author><pubDate>Mon, 07 May 2018 17:15:10 +0800</pubDate><description><![CDATA[2017年年底，我从老东家离职。离职后我和小伙伴创业，负责确定技术栈以及服务端的开发部署。在进行了综合考虑之后，我决定使用python作为我们的后端语言。虽然只有一年半的工作经验，还是个菜鸟，但是我也明白一个优秀的程序员不应该只满足功能的实现，更要对性能有不懈的追求，这里要提到的多线程就是一种提高性能的手段。 
不过，python的多线程和其他的语言的多线程是有所不同的。我上一份工作是java开发...]]></description><category></category></item><item><title><![CDATA[抽象代数学习笔记（16）子环]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79856475</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79856475</guid><author>bubingyang</author><pubDate>Sun, 08 Apr 2018 19:23:08 +0800</pubDate><description><![CDATA[
  定义：设(R,+,∗)(R,+,∗)(R,+,*)是个环，SSS是RRR的一个非空子集。如果+++和∗∗*也是SSS的运算，且(S,+,∗)(S,+,∗)(S,+,*)也是个环，则说(S,+,∗)(S,+,∗)(S,+,*)是(R,+,∗)(R,+,∗)(R,+,*)是的一个子环。在所指运算不混淆时，简称SSS是RRR的一个子环。


在介绍环的时候，提到的偶数环是有理数环的子环。 
(R,...]]></description><category></category></item><item><title><![CDATA[抽象代数学习笔记（15）环]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79438420</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79438420</guid><author>bubingyang</author><pubDate>Sun, 04 Mar 2018 18:13:11 +0800</pubDate><description><![CDATA[
  定义：设集合RRR上有两种二元运算，一个叫加法，记为+++;一个叫乘法，记为∗∗*，且(R,+)(R,+)(R,+)是个交换群；乘法∗∗*在RRR上是结合的；对任意a,b,c∈Ra,b,c∈Ra,b,c\in R，都有a∗(b+c)=a∗b+a∗c,(b+c)∗a=b∗a+c∗aa∗(b+c)=a∗b+a∗c,(b+c)∗a=b∗a+c∗aa*(b+c)=a*b+a*c,(b+c)*a=b*...]]></description><category></category></item><item><title><![CDATA[卷积神经网络学习笔记与心得（5）全连接层]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79387882</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79387882</guid><author>bubingyang</author><pubDate>Tue, 27 Feb 2018 14:25:27 +0800</pubDate><description><![CDATA[经过若干层卷积和池化后，图片的维度会越来越小，数量会越来越多，最终进入全连接层并分类输出（传统的神经网络）。由于全连接层会有大量的连接权值，模型过拟合的可能性会增加。对此，研究者提出过稀疏连接和Dropout等方法，降低过拟合的可能性。

Dropout是一种简单且有效的防止过拟合的方法。它用于训练阶段的全连接层:每次训练时，随机使全连接层的某些节点不更新，但是将他的权重保留下来。

Dropou...]]></description><category></category></item><item><title><![CDATA[卷积神经网络学习笔记与心得（4）池化]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79371331</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79371331</guid><author>bubingyang</author><pubDate>Sun, 25 Feb 2018 20:34:35 +0800</pubDate><description><![CDATA[图片经过卷积、激活后的结果一般带有大量原图信息。



上图中卷积核提取的是竖直方向上的连续像素，但是，被增强的像素只占了结果的1/3，对于多层网络，其余重要性较低的信息也被传入了下一层网络，造成了不必要的浪费，因此需要用池化对卷基层得到的结果做聚合统计。池化的理论基础是：图像相邻位置的像素是相关的，即使间隔一段尺寸对图像进行采样，得到的结果依旧能保持大部分信息。常用的池化方式有最大池化和均值池化...]]></description><category></category></item><item><title><![CDATA[卷积神经网络学习笔记与心得（3）卷积]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79310665</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79310665</guid><author>bubingyang</author><pubDate>Sun, 11 Feb 2018 14:47:14 +0800</pubDate><description><![CDATA[数字图像是一个二维的离散信号，对数字图像做卷积操作其实就是利用卷积核（卷积模板）在图像上滑动，将图像点上的像素灰度值与对应的卷积核上的数值相乘，然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值。

从卷积的效果来看，在二维图像上进行卷积时，卷积核对所在区域上符合某种条件的像素赋予较多的权重，其他的像素赋予的权重较少，这可以看作是一种滤波行为，因此卷积神经网络的卷积核有时也被称为滤...]]></description><category></category></item><item><title><![CDATA[卷积神经网络学习笔记与心得（1）前言]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79295957</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79295957</guid><author>bubingyang</author><pubDate>Fri, 09 Feb 2018 10:31:08 +0800</pubDate><description><![CDATA[博主是一名刚毕业一年的本科生。去年的这个时候，我有幸参与了一个关于字符识别的实验性项目，对于一个打算致力于数据挖掘和机器学习的本科生而言，这样的机会很是难得。刚接触这个项目的时候我和同事很茫然，不知道应该把重点放在何处，加之我在本科阶段做过一个简单的字符识别系统，误以为识别的实现难度不大，因此我和同事没有过多的关注识别环节，而是将大把的精力和时间花在图像的预处理，纠错等环节上。 
经过一段时间的摸...]]></description><category></category></item><item><title><![CDATA[卷积神经网络学习笔记与心得（2）数据集]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79295924</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79295924</guid><author>bubingyang</author><pubDate>Fri, 09 Feb 2018 10:27:42 +0800</pubDate><description><![CDATA[机器学习领域有很多现成的数据集，它们由个人或组织制作、整理，且向外界公开下载，比如在字符识别领域有mnist数据集等，数据挖掘领域有Iris，Adult数据集等。这些数据集为相关技术研究者提供了很大的便捷，有了这些资源，研究者就可以把更多的精力放在模型的研究上，可以说这些数据集的制作整理者对推动数据挖掘和机器学习的发展做出了巨大的贡献。
不过，在不少情况下，这些数据集未必能满足我们的需求，这时就要...]]></description><category></category></item><item><title><![CDATA[抽象代数学习笔记（14）商群]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/79293688</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/79293688</guid><author>bubingyang</author><pubDate>Thu, 08 Feb 2018 21:15:29 +0800</pubDate><description><![CDATA[上一次提到“商”这个字眼，还是在讲商集的时候。我们将商集看做是以等价关系对集合的一个划分。现在我们更进一步，提出商群的概念。

如果 NNN 是不变子群，那么利用 NNN 可以导出　GGG 上的一个等价关系，　a&amp;nbsp;ba&amp;nbsp;ba~b 当且仅当　a−1b∈Na−1b∈Na^{-1}b\in N ，也就是 a,ba,ba,b　同属于　NNN 的一个左陪集。

（证明： 
首先a−1a∈...]]></description><category></category></item><item><title><![CDATA[机器学习系列-支持向量机]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/78959097</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/78959097</guid><author>bubingyang</author><pubDate>Wed, 03 Jan 2018 11:06:40 +0800</pubDate><description><![CDATA[支持向量机

支持向量机（SVM）是基于统计学习理论的一种机器学习方法，通过寻求结构化风险最小来提高学习机泛化能力，实现经验风险和置信范围的最小化，从而达到在统计样本量较少的情况下，亦能获得良好统计规律的目的。通俗来讲，它是一种二类分类模型，其基本模型定义为特征空间上的间隔最大的线性分类器，即支持向量机的学习策略便是间隔最大化，最终可转化为一个凸二次规划问题的求解。

给定训练样本集D=(x1,y...]]></description><category></category></item><item><title><![CDATA[机器学习系列-k均值]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/78958733</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/78958733</guid><author>bubingyang</author><pubDate>Wed, 03 Jan 2018 10:42:07 +0800</pubDate><description><![CDATA[K-means原理

聚类属于无监督学习，以往的回归、朴素贝叶斯、SVM等都是有类别标签y的，也就是说样例中已经给出了样例的分类。而聚类的样本中却没有给定y，只有特征x。 K-means也是聚类算法中最简单的一种。在聚类问题中，给我们的训练样本是x(1),...,x(m)x(1),...,x(m){x^{(1)},...,x^{(m)}}，每一个x(i)∈Rnx(i)∈Rnx^{(i)}\in{\...]]></description><category></category></item><item><title><![CDATA[机器学习系列-Bagging与随机森林]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/78635684</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/78635684</guid><author>bubingyang</author><pubDate>Sun, 26 Nov 2017 09:49:49 +0800</pubDate><description><![CDATA[Bagging集成学习算法有两个大类:一个是Boosting，代表算法是AdaBoost；另一个是Bagging，本文介绍的随机森林是它的一个变种。Bagging也叫自举汇聚法（bootstrap aggregating），它在原始数据集上通过有放回抽样重新选出TT个包含mm条数据的新数据集来训练分类器。也就是说这些新数据集是允许重复的。使用训练出来的分类器集合来对新样本进行分类，然后用多数投票或者]]></description><category></category></item><item><title><![CDATA[机器学习系列-AdaBoost]]></title><link>https://blog.youkuaiyun.com/bubingyang/article/details/78626407</link><guid>https://blog.youkuaiyun.com/bubingyang/article/details/78626407</guid><author>bubingyang</author><pubDate>Fri, 24 Nov 2017 17:02:31 +0800</pubDate><description><![CDATA[集成学习在一般经验中，如果把好坏不等的东西掺到一起，那么通常结果会是比最 
坏的要好一些，比最好的要坏一些。这就是集成学习的出发点。如果把多个学习器结合起来，是否能获得比最好的单一学习器更好的性能呢?集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务。集成学习一般先产生一组“个体学习器”(individual learner)，再用某种策略将它们结合起来。个体学习器]]></description><category></category></item></channel></rss>