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页面直接渲染,取消这种糟糕的渲染方式。