2017年7月9日星期日

分类算法——adaboost算法

       学习资料:《机器学习实战》——算法实现学习;李航《统计学习方法》、《数据挖掘导论》、周志华《机器学习》、O'Reilly《Hands-On Machine Learning with Scikit-Learn&TensorFlow》——这四本主要是理论的学习。
       参考的博客:Adaboost 算法的原理与推导

      下面我主要说说我的学习过程以及其中对这个算法的一些理解和疑惑。
     首先,对于这个算法的原理,我主要看上面罗列的博客和李航的《统计学习方法》。博客参考了李航的书,两者在讲解原理和举例来解释原理上比较详尽清晰。辅助资料是《导论》、周志华、O'Reilly这三本书。
       对于这个算法的伪代码,我截取了《数据挖掘导论》这本书的内容:
        
针对伪代码提出的问题:
  1. 对于步骤5,如何获得多个基分类器?
  2. 在产生多个基分类器中,通过计算带权分类误差【步骤7】来获得基分类器的原理是什么?
  3. 为什么带权分类误差大于0.5,要重新从步骤4开始?
  4. 如何计算获得新一轮的每个特征的权重。
对于前两个问题,我找到一篇博客:关于AdaBoost的再思考。【未完待续】



2017年6月17日星期六

python文件读写的几种方法

       工作的第一个任务就是用python将一个6层的json字符串解析成json对象,这差不多是一年前的任务了,完成这个任务后就没再写python代码。最近在看用python实现的机器学习算法,在读取文件时会回去查以前的代码,索性把python 2.x版本读写文件的方法记在博客里。

方法一:
一次性读取文件的所有内容:
def load_data():
    with open(file_name, 'r') as f:
         for line in f.read():
              print line
       此处,f.read()也可以直接替换为f。从第二行开始读,可以使用切片:f.read()[1:],或则在遍历前跳到第二行:next(f.read())
       只读取第一行,使用f.readline()方法。


方法二:
将文件内容转成list读入,如——
['-0.017612\t14.053064\t0\n', '-1.395634\t4.662541\t1\n']

def load_data():
    with open(file_name, 'r') as f:
         for line in f.readlines():
              print line
       其中,每个元素,即每行line会有转义字符,处理方式是:line.strip(str),参数rm是开头和结尾的字符串,字符串str不区分前后的字符顺序。
       当strip()方法参数为空的时候,默认删除空白符(包括转义字符'\n', '\r',  '\t',  ' '等)。另外,只删除开头或结尾的字符串,可用方法lstrip()和rstrip(),使用方式同上。

2017年4月7日星期五

对两个list中元素需求的处理

需求1:

  • 原始的list1={1,2,3},现在对其进行增删,得到list2={2,3,4}。现在要找出新增的元素,在这里是{4},以及被删除的元素,在这里是{1}。

解决:

  • 使用java自带的removeAll()方法:

list1.removeAll(list2);  // list1中相对于list2中不同的元素,为1;

  • 下面算法获得的结果是{1,4}:

Map<String, Integer> map = new HashMap<String, Integer>();
List<String> maxList = list1;
List<String> minList = list2;
if (list2.size() > list1.size()) {
maxList = list2;
minList = list1;
}
for (String str : maxList) {
map.put(str, 1);
}
for (String str : minList) {
Integer strCount = map.get(str);
if (null != strCount) {
map.put(str, ++strCount);
continue;
}
map.put(str, 1);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
System.out.println(entry.getKey());
}
}


需求2:

  • 从数据库中获得模糊查询的list1,通过权限判断获得list2,从list1中获取与list2相交的元素。

2017年3月3日星期五

Ajax请求阻塞渲染界面

   项目开发中我使用到的框架:bootstrap+SSM。我的需求是获得数据库里面的数据,按照时间归类做成二级菜单界面,如图:

   刚开始的实现方式是点击这个页面的url,跳转到对应的Controller,在Controller中不进行任何的数据库获取数据操作,直接return到这个页面,在这个过程中,利用ajax请求进行数据获取然后在js文件中进行数据的拼接展示。Ajax方法如图:

   实现之后遇到一个问题,看图:
浏览页面时竟然花了23s,我打印了数据分类花费的时间为1~2s,前台使用js进行拼接也不超过1s,用开发工具查看了资源加载的情况,发现加载其中一类流程时,从后台返回到前台的数据竟然有4.5MB,问题就是出现在这里。

  最后的解决办法直接用Sping MVC的ModelAndView携带数据返回到jsp页面直接渲染,取消这种糟糕的渲染方式。


2016年6月23日星期四

python新手学习的阶段性总结

        在对python学习进行阶段性总结之前,先大概回顾自己的技术之路。我的大学学院和专业是数学,在学院和学校的职业生涯规划中,这个学院的很多学生会走写代码的技术路线。所以在大一学习C语言之后,身边很多人选择自学编程立志ACM竞赛。我大一第一个学期对生活充满了新鲜和好奇,所以没随一波人的潮流。但是第二个学期开始,因为学业压力以及选修了C++,我开始以刘汝家编著的《算法竞赛入门经典》学习算法和写代码。然而对于一个上了大学才知道编程这玩意儿的人来说,学习的过程倍感艰辛。早上六点半起床,学C语言的基础知识或者在书中或者学校的OJ平台找一道题目题目练习,大多时候临近上课了还是没有把题目做出来。这个过程经历多次,同时想着大学生活不能就这样经历无限苦闷思考循环而荒废了,所以我把学业的重心放在了课本的理论知识,决定放弃编程实践练习这条技术路线,转向对非技术岗位素质和独立思考能力的培养上面来。这个过程持续的时间到大二第二个学期,这里先略过,找个时间再好好回顾自己这个功利主义小粉红否定自己十多年人生的思想转变过程。
        大二下第一个学期上了一门全校选修过,因为和主讲老师在思想上产生很多共鸣,期末结束后被他忽悠组建了一个创业团队,呆了将近一年才发行团队里面包括我在内的几个人都是在帮他做一个电子商务的项目。在这个过程中,由项目开发重新开始接触技术。我从类UNIX系统的CentOS开始学习,这个过程主要学习了服务器运维和SVN代码管理的一些知识,参与修改利用OFBiz开源框架搭建的电商项目。在2015年8月份面临工作压力和几个朋友跳出团队之后,觉悟这一年拼命当狗卖命而痛苦不已,另一个方面,当我决定找和技术相关的工作时才发现这一年接触的东西很多都相当的落后,比如为团队搭建的SVN这种集中式的代码管理工具,当我学习了git并对比了之后,会觉得还使用SVN就像还活在20世纪一样。再者,自己在技术方面的基础知识相当薄弱,所以在秋招的一段时间里,屡屡碰壁。所以在秋招的两个月时间里,一边投着简历参加面试,一边恶补基础知识。但是要想在短时间内熟悉计算机操作系统、计算机网络、数据结构和算法,以及和自己要投的岗位JAVA开发相关的如JAVA语言的基础知识和JAVA生态圈的项目,我也觉得自己是在痴人说梦。但是我始终没有放弃和技术相关的工作,我总结了有两点原因:
  1. 技术学习的第一阶段放弃除了遭受挫折以及希望自己大学有另外一种多彩的生活之外,还有一个原因是害怕技术的快速发展给人带来的极大学习压力,但是现在反而是喜欢这种挑战。人有很多局限性,其中之一就是生活在一个舒适圈内不愿意接受新事物。当我意识并且痛恨这点时,技术变化的挑战能提醒我保持对新鲜事物的敏感以及在技术、语言等方面不断学习的决心。
  2. 或许在未来我会经历长时间的代码敲打工作,但是我不想把自己定位为一颗螺丝钉。我希望并且我努力让自己产生想法。当想法成熟那天,我能通过技术实现想法。 
       10月底,拿了两家公司的offer之后,我选择了其中一家公司。因为在找工作的过程中自己技术能力太弱了,所以决定先静下心来恶补基础知识。中途因为奶奶重病继而离世,停下了一段时间,所以重新真正开始学习python是大四第二个学期开学之后了。
        唠叨了这么多,这才开始总结自己的python过程。我决定学python是想看看openstack这个项目的,后来发现python语言如其哲学理念一样,优雅、明了、简洁,都说编程语言决定使用者的思维方式,应该有不少人像我一样不能抗拒这语言的魅力吧,所以决定进一步学习这门语言。
        虽然国内外已经有很多学习python资料汇总的网站了,但是我觉得将自己学习python的过程以及自己时涉及到的资料写出来,一方面是对自己学习的总结、沉淀,另一方面,如果遇到志同道合的朋友有幸看到这篇文章,可以对一些内容进行补充和交流。
        首先,我是先大概浏览了一遍廖雪峰老师网站的python教程。因为之前有一点计算机基础和JAVA语言基础了,所以在教程学习过程中困难不是特别大,遇到自己觉得重要的知识点,就直接复制粘贴到印象笔记中。
        到现在为止,我觉得掌握一门语言比较快的方式是问题驱动的实践,在这个过程中通过google、stackoverflow等工具查询知识点比反复阅读更有效。在这里顺便分享在Twitter上看到的陈皓老师的一段话:
有同事问我某个技术咋查不到?我发现他在Google里用中文关键词。我说,你得用英文关键词啊,就算是中文社区里有也要坚持用英文,因为技术都是从西方传过来的,不用英文的话,就永远无法与世界真正接轨,你的信息视野无法真正扩大,翻墙并不是架个VPN,还用中文搜索的话,就算翻了也等于没翻。
 个人的体会是抛开GFW全面的信息封锁不谈,单就技术领域的学习和查询,搜索工具和搜索方式真的很重要。
        基本了解了知识点之后,我从两方面实践进一步学习python语言,一个方面是上面python教程的实战内容;另一个方面做是leetcode上Array、String和Hashtable知识点相关的题目。
        在第一个方面实践的过程中我觉得有必要特别注意的是学习并善用git和github。原因有二:

  1. 通过git管理自己在网站上照葫芦画瓢的代码,可以更加直观的对比自己写的代码前后差别。
  2. 无论是学习廖老师的python实战教程还是学习《Flask Web开发:基于python的Web应用开发实战》这本书的内容,结合git和github,效率会比单独看内容要高。
 上面提到了《Flask Web开发:基于python的Web应用开发实战》这本书,在这里需要说明的是,单单学习廖老师的实战内容,对python和python应用在web开发的知识挺困惑,我尝试了再拓展了解使用python搭建的Tornado、Django和Flask三种框架之后,发现结合Flask学习有助于更深入的了解实战内容。下面我贴出在这个过程中我接触到的一些知识点和资料:

  1. 网友提供的资料:https://github.com/zhouxinkai/awesome-python3-webapp
  2. python的type和object之间是怎么一种关系:https://www.zhihu.com/question/38791962
  3. python中的函数、闭包和修饰器:https://mcfloundinho.github.io/python-function.html

2016年6月7日星期二

关于建博客的想法

        这段时间一直尝试着搭建一个属于个人空间的独立博客,框架是flask。我这个人有个毛病,总希望一次性把事情做好了,所以找了好几个开源的代码都觉得不够好,所以暂时把家安在google这个Blogger上面。
        需要说明的是,选择google这个博客平台,是对GFW以及信息封锁的个人反击。网上看到一句话特别赞同:“信息优势决定进化优势”。大多追求自由信息的人不容易受到国内信息地忽悠,我喜欢并且尊敬这些人。博客取名“城市广场”来自于古希腊城市广场,域名wiliam8964是因为个人喜欢莎士比亚,数字来自89年天安门事件。