CWYAlpha

Just another WordPress.com site

Archive for 三月 2012

Thought this was cool: 新浪开放平台入门及基本步骤(java SDK)

leave a comment »

转自:http://shinepw.iteye.com/blog/1401250

1. 创建一个应用,主要是为了获得App Key和Secret Key。具体说明请看官方文档:

http://open.weibo.com/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97

2. 下载新浪微薄的SDK,本文使用的是java。

http://code.google.com/p/weibo4j/

3. 请先填写相关配置:在Config.properties里

client_ID :appkey 创建应用获取到的appkey (App Key)

client_SERCRET :app_secret 创建应用获取到的appsecret (Secret Key)

redirect_URI : 回调地址 OAuth2的回调地址 (这个是为了在验证后返回到我们的web地址,此篇文章只是为了测试,不创建web应用,因此可以不需要设置)

4. 在调用/使用所有的api之前都需要进行Oath2验证。

关于OAUTH协议可以参考 http://oauth.net/2

使用OAUTH认证来获取微博数据介绍详细见:Oauth2

具体步骤:

调用example里:OAuth4Code.java。

会出现以下错误,是因为我们没有设置回调地址,没关系,复制code。

在myeclipse控制台里面黏贴进去,然后回车。

会显示以下结果:

这里可以看到我们得到了需要的access token。复制下来,以便下面调用其他API使用。

5. 调用API

经过Oath2验证以后就可以随意调用开放平台提供的各种API。

比如,我们调用获取粉丝,调用example.friendships.GetFlowers.java.

Java代码  
  1. package weibo4j.examples.friendships;  
  2.    
  3. import weibo4j.Friendships;  
  4. import weibo4j.Weibo;  
  5. import weibo4j.examples.oauth2.Log;  
  6. import weibo4j.model.User;  
  7. import weibo4j.model.UserWapper;  
  8. import weibo4j.model.WeiboException;  
  9.    
  10. public class GetFollowers {  
  11.    
  12. public static void main(String[] args) {  
  13.            String access_token = “2.00RkFknBuc4hPD05d15a59e6Yi3WRB(Access Token)”;  
  14.            Weibo weibo = new Weibo();  
  15.            weibo.setToken(access_token);  
  16.            Friendships fm = new Friendships();  
  17.            String screen_name =”任意用户的名字”;  
  18.            try {  
  19.                     UserWapper users = fm.getFollowersByName(screen_name);  
  20.                     for(User u : users.getUsers()){  
  21.                              Log.logInfo(u.toString());  
  22.                     }  
  23.                     System.out.println(users.getNextCursor());  
  24.                     System.out.println(users.getPreviousCursor());  
  25.                     System.out.println(users.getTotalNumber());  
  26.            } catch (WeiboException e) {  
  27.                     e.printStackTrace();  
  28.            }  
  29. }  
  30. }  

运行之前设置access token 和用户名字,运行后:

注意:

Example提供的都是控制它程序,也就是说都用运行main函数的demo,要运用到web程序需要响应的修改。

附:

使用Oath1验证(10年时的版本)的Web应用:

http://haolloyin.blog.51cto.com/1177454/412445

本文链接

from 博客园_业精于勤,荒于嬉;行成于思,毁于随: http://www.cnblogs.com/hnrainll/archive/2012/03/31/2427651.html

Advertisements

Written by cwyalpha

三月 31, 2012 at 3:09 下午

发表在 Uncategorized

Thought this was cool: 数据分析的老七种和新七种

leave a comment »

分析数据是将收集的数据通过加工、整理和分析、使其转化为信息,通常用方法有:老七种工具,即排列图、因果图、分层法、调查表、散步图、直方图、控制图;新七种工具,即关联图、系统图、矩阵图、KJ法、计划评审技术、PDPC法、矩阵数据图
from 互联网旁观者: http://blog.sina.com.cn/s/blog_72995dcc01012nfa.html

Written by cwyalpha

三月 31, 2012 at 3:08 下午

发表在 Uncategorized

Thought this was cool: Linux/Unix Daemon 程序设计

leave a comment »

unix
进程可以运行在前台或是后台,运行在前台的程序通过终端与用户进行交互,而后以进程是单独运行的,用户可以查看它的状态,但不清楚它具体在做什么。我们将运行在后台的程序叫做”daemon”程序。如常见的httpd,nfsd,sshd都属于”daemon”程序,要写这样的程序,你可能要考虑如下的一些处理。
1,后台运行处理
使用FORK()调用创建一个子进程,然后让父进程退出。这样子进程就与父进程分离了并运行在后台。
    i=fork();
    if (i<0)
exit(1);
    if (i>0)
exit(0);
   

2,进程依赖处理
每个子进程继承父进程的控制终端,进程将会接收关联终端的信号。为了防止daemon程序从创建它的进程接收信号,必需去除与控制终端的关联。

在UNIX系统中,进程运行在一个进程组,子进程会从父进程继承进程组,一个DAEMON进程应该不依赖于进程组的其它进程.
  setsid()
这个函数将DAEMON进程放置于一个新的进程组,并去除了与控制终端的关联。
3,继承的文件描述符号和标准I/O处理
子进程会继承父进程打开的文件描述符,这样会导致文件描述符资源的浪费,所以应该关闭所有继承过来的文件描述符。
    for
(i=getdtablesize();i>=0;–i) close(i);
对于stdin,stdout,stderr,将它们重定向到/dev/null。
   
i=open(“/dev/null”,O_RDWR);
    dup(i);
    dup(i);
由于关闭了所有文件描述符,上面的操作会从0开始顺序产生文件描述符。

4,文件掩码处理
为了安全的考虑,需要将设置文件掩码
  umask(027);

5,运行目录处理
一个daemon进程应该运行在一个固定的目录,防止用户在不同的目录下运行程序后找不到相关的文件。
  chdir(“/servers/”);

6,保持单DAEMON进程处理
为了保持单daemon进程,防止运行多个daemon进程,有效的方式是建立一个文件,并对其加锁,在进程退出时进行解锁。
   lfp=open(“exampled.lock”,O_RDWR|O_CREAT,0640);

    if (lfp<0)
exit(1);
    if
(lockf(lfp,F_TLOCK,0)<0) exit(0);
   

   
sprintf(str,”%d\n”,getpid());
   
write(lfp,str,strlen(str));

7,信号处理
对于daemon进程要忽略和处理一些接收到的信号,如子进程结束时会发送SIGCHLD信号组父进程,有些daemon进程通过SIGHUP信号来重启。

  signal(SIG_IGN,SIGCHLD);
上面的代码将忽略SIGCHLD信号。
  void Signal_Handler(sig)
    int sig;
    {
    
   switch(sig){

    
  
    case
SIGHUP:
    
  
  
    
    
  
  
    
break;    
   
    
  
    case
SIGTERM:
    
  
  
    
    
  
  
    
exit(0)
    
  
  
    
break;    
   
    
   } 
 
    }

   
signal(SIGHUP,Signal_Handler);
   
signal(SIGTERM,Signal_Handler);
  建立一个信号处理函数,并与信号关联。
8,日志处理
  运行程序有一些重要的信息需要记日志,有如下几种方法记录日志:

  重定向输出到标准I/O,这种方式将日志直接输出到终端(显示器),实际上这个程序是运行在前台的。这种方式不适用于daemon进程。

  写日志文件,将日志写入文件。
   void
log_message(filename,message)
    char *filename;
    char *message;
    {
    FILE *logfile;
    
   logfile=fopen(filename,”a”);

    
   if(!logfile)
return;
    
   fprintf(logfile,”%s\n”,message);

    
   fclose(logfile);

    }

   
log_message(“conn.log”,”connection accepted”);
    log_message(“error.log”,”can
not open file”);
日志服务:这种方式是将日志送给一个日志服务,由日志服务来记录日志,并提供查阅,
UNIX系统带有SYSLOGD日志服务,可以通过如下方式将日志写入SYSLOGD。
  openlog(“mydaemon”,LOG_PID,LOG_DAEMON)
    syslog(LOG_INFO, “Connection
from host %d”, callinghostname);
    syslog(LOG_ALERT, “Database
Error !”);
    closelog();
就写这么多了,要变成你自己的东东,还得你自己去研究.希望这篇文章对初学者有个指引.

Daemon设计原则

Daemon程序设计主要原则包括:

(1)      
程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。

(2)      
调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。

(3)      
设置文件创建mask为0,避免创建文件时权限的影响。

(4)      
关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。

(5)      
Daemon无法输出信息,可以使用SYSLOG或自己的日志系统进行日志处理。(可选)

(6)      
编写管理Daemon的SHELL脚本,使用service对Daemon进行管理和监控。(可选)

Daemon程序框架

int init_daemon(void)

{

  pid_t pid;

  int i;

 

 

  if((pid = fork()) < 0)

    return
-1;

  else if(pid != 0)

   
exit(0);

 

  setsid();

  for(i=0;i< NOFILE ;++i)

   
close(i);

 

  umask(0);

  return 0;

}

 

void sig_term(int signo)

{

  if(signo == SIGTERM) 

  {

    
wsio_logit(“”, “wsiod stopped\n”);

    
exit(0);

 }

}

 

int main(void)

{

if(init_daemon() == -1){

printf(“can’t fork self\n”);

exit(0);

  }

  wsio_logit(“”, “wsiod started\n”);

  signal(SIGTERM, sig_term);

 

  while (1) {

    // Do
what you want here

    … …

  }

  exit(0);

}

Daemon日志

这里使用自己的日志系统,当然也可以使用SYSLOG。

#define LOGBUFSZ
256    

#define LOGFILE 
“/var/log/wsiod.log” 

int wsio_logit(char * func, char *msg, …)

{

       
va_list args;

       
char prtbuf[LOGBUFSZ];

       
int save_errno;

       
struct tm *tm;

       
time_t current_time;

       
int fd_log;

 

       
save_errno = errno;

       
va_start (args, msg);

       
(void) time
(&current_time);           

       
tm = localtime (&current_time);

       
sprintf (prtbuf, “d/d d:d:d %s “, tm->tm_mon+1,

                   
tm->tm_mday, tm->tm_hour,
tm->tm_min, tm->tm_sec, func);

       
vsprintf (prtbuf+strlen(prtbuf), msg, args);

       
va_end (args);

       
fd_log = open (LOGFILE, O_WRONLY | O_CREAT | O_APPEND, 0664);

       
write (fd_log, prtbuf, strlen(prtbuf));

       
close (fd_log);

       
errno = save_errno;

       
return 0;

}

Daemon管理

Daemon程序可以使用service工具进行管理,包括启动、停止、查看状态等,但前题是需要编写一个如下的简单SHELL脚本。

# /etc/rc.d/init.d/wsiod

#!/bin/sh

#

#
wsiod        
This shell script takes care of starting and stopping wsiod.

#

# chkconfig: 35 65 35

# description: wsiod is web servce I/O server, which is used to
access files on remote hosts.

 

# Source function library.

. /etc/rc.d/init.d/functions

 

# Source networking configuration.

. /etc/sysconfig/network

 

# Check that networking is up.

[ ${NETWORKING} = “no” ] && exit
0

 

RETVAL=0

prog=”wsiod”

WSIOARGS=”-h $HOSTNAME -p 80 -t STANDALONE -k -c -d”

start() {

       
# Start daemons.

       
echo -n $”Starting $prog: “

       
daemon /usr/local/bin/wsiod ${WSIOARGS}

       
RETVAL=$?

       
echo

       
[ $RETVAL -eq 0 ] && touch
/var/lock/subsys/wsiod

       
return $RETVAL

}

stop() {

       
# Stop daemons.

       
echo -n $”Shutting down $prog: “

       
killproc wsiod

       
RETVAL=$?

       
echo

       
[ $RETVAL -eq 0 ] && rm -f
/var/lock/subsys/wsiod

       
return $RETVAL

}

 

# See how we were called.

case “$1” in

  start)

       
start

       
;;

  stop)

      
 stop

       
;;

  restart|reload)

       
stop

       
start

       
RETVAL=$?

       
;;

  status)

       
status wsiod

       
RETVAL=$?

       
;;

  *)

       
echo $”Usage: $0 {start|stop|restart|status}”

       
exit 1

esac

 

exit $RETVAL

 

OK,到这儿为止,一个完整的Linux Daemon程序就完成了。

from 互联网旁观者: http://blog.sina.com.cn/s/blog_72995dcc01012m3u.html

Written by cwyalpha

三月 31, 2012 at 3:08 下午

发表在 Uncategorized

Thought this was cool: 新书推荐:Machine Learning in Action

leave a comment »

如果你经常阅读原版书籍,那你应该对那些印制精美的封面有很深刻的印象。例如O’Reilly的软件开发系列,都是采用最为简洁的黑白铜版画,主题是一两只珍稀动物。而另一家著名出版商Manning出的软件系列图书,封面上的图案均选自1799年初版于西班牙马德里的一本各地服装简编。这些丰富生动的图片表明了世界各个区域的独特个性。使用这种封面设计意在让这本简编中的图片重现于世,由此来庆祝计算机业的创意、进取和乐趣。

Manning的实战系列(IN ACTION),是为了使用户能快速上手,以解决实际中遇到的问题。基本上该系列书不大适合零基础的入门读者;目标读者是那些对书中知识有基础的了解,并有过简单的模仿实践,但是无法真正将该技术应用于实践的中初级读者。《Machine Learning in Action》正是这样一本中级进阶图书。它将基本的机器学习理论与实际的运用工具(Python)相结合。该书回避了复杂的数学原理(如果你需要机器学习背后的数学知识,可以参考The Elements of_Statistical Learning),提供了大量的案例和代码来实现各种机器学习算法。你可以略加改动就可以将这些代码用于数据处理、分析和可视化工作中。即使你不用Python也很有参考价值。

大纲目录:
PART 1 CLASSIFICATION 第一篇:分类
1.Machine learning basics 机器学习基础
2.Classifying with k-Nearest Neighbors K近邻分类器
3.Splitting datasets one feature at a time: decision trees 决策树分类器
4.Classifying with probability theory: naïve Bayes 朴素贝叶斯分类器
5.Logistic regression 逻辑回归分类器
6.Support vector machines 支持向量机分类器
7.Improving classification with the AdaBoost meta algorithm 提升算法

PART 2 FORECASTING NUMERIC VALUES WITH REGRESSION 第二篇:回归
8.Predicting numeric values: regression 回归预测
9.Tree-based regression 决策树回归

PART 3 UNSUPERVISED LEARNING 第三篇:非监督学习
10.Grouping unlabeled items using k-means clustering K均值聚类
11.Association analysis with the Apriori algorithm 关联分析
12.Efficiently finding frequent itemsets with FP-growth FP-Growth算法

PART 4 ADDITIONAL TOOLS 第四篇:其它工具
13.Using principal component analysis to simplify data 主成份分析
14.Simplifying data with the singular value decomposition 奇异值分解
15.Big data and MapReduce 大数据集与MapReduce

至于在哪下载,你知道的

from 数据科学与R语言: http://xccds1977.blogspot.com/2012/03/machine-learning-in-action.html

Written by cwyalpha

三月 30, 2012 at 2:53 上午

发表在 Uncategorized

Thought this was cool: reCAPTCHA下一步要帮助Google Images还是Google Street View?

leave a comment »

注册过网络服务,下载网络文件的人肯定见过reCAPTCHA验证码。该服务在2009年四月顶住了4chan高手自动刷票机的阴谋(但没挡住人肉刷票),在同年9月被Google收购。至此之后,reCAPTCHA的提问难度越发变态,并且逐步成为Google最强大的机器训练源。

Google收购reCAPTCHA后延续了它原来的图书电子化事业,在2010年把纽约时报20年的老存档给OCR(光学字符识别)了;此外Google Books的扫描工作也应该与reCAPTCHA的题目密切相关。

不过最近几天reCAPTCHA有了新的变化,Google似乎对图片里的数字产生了浓厚兴趣。上图均为用户收集到的reCAPTHA提问,以明显的路牌与门牌号加传统的reCAPTCHA文字为组合。

如果只是普通的OCR训练,为什么这么专注在路牌与门牌号的图片上?如果这是Google Street View默认会屏蔽的隐私文字,Google扫描这个的原因是什么?唯一可以确认的是,有全球这么大基数的网民在下载文件并快乐的解着验证码,reCAPTCHA有能力培养出新的Google Overlord。

某程度上,为下载文件而忠诚服务于机器学习的网民们,不已经是Overlord的奴隶了吗?一两个“捣蛋者”恐怕难以颠覆这种“众数算法”。


By 店长 at 比特客栈的文艺复兴, 2012. | 永久链接
Post tags: , , , ,

from 比特客栈的文艺复兴: http://bitinn.net/9466/

Written by cwyalpha

三月 29, 2012 at 2:23 下午

发表在 Uncategorized

Thought this was cool: 基于用户投票的排名算法(六):贝叶斯平均

leave a comment »

(这个系列实在拖得太久,今天是最后一篇。)

上一篇介绍了“威尔逊区间”,它解决了投票人数过少、导致结果不可信的问题。

举例来说,如果只有2个人投票,”威尔逊区间”的下限值会将赞成票的比例大幅拉低。这样做固然保证了排名的可信性,但也带来了另一个问题:排行榜前列总是那些票数最多的项目,新项目或者冷门的项目,很难有出头机会,排名可能会长期靠后。

IMDB为例,它是世界最大的电影数据库,观众可以对每部电影投票,最低为1分,最高为10分。

系统根据投票结果,计算出每部电影的平均得分。然后,再根据平均得分,排出最受欢迎的前250名的电影。

这里就有一个问题:热门电影与冷门电影的平均得分,是否真的可比?举例来说,一部好莱坞大片有10000个观众投票,一部小成本的文艺片只有100个观众投票。这两者的投票结果,怎么比较?如果使用”威尔逊区间”,后者的得分将被大幅拉低,这样处理是否公平,能不能反映它们真正的质量?

一个合理的思路是,如果要比较两部电影的好坏,至少应该请同样多的观众观看和评分。既然文艺片的观众人数偏少,那么应该设法为它增加一些观众。

排名页面的底部,IMDB给出了它的计算方法。

  

  - WR, 加权得分(weighted rating)。

  - R,该电影的用户投票的平均得分(Rating)。

  - v,该电影的投票人数(votes)。

  - m,排名前250名的电影的最低投票数(现在为3000)。

  - C, 所有电影的平均得分(现在为6.9)。

仔细研究这个公式,你会发现,IMDB为每部电影增加了3000张选票,并且这些选票的评分都为6.9。这样做的原因是,假设所有电影都至少有3000张选票,那么就都具备了进入前250名的评选条件;然后假设这3000张选票的评分是所有电影的平均得分(即假设这部电影具有平均水准);最后,用现有的观众投票进行修正,长期来看,v/(v+m)这部分的权重将越来越大,得分将慢慢接近真实情况。

这样做拉近了不同电影之间投票人数的差异,使得投票人数较少的电影也有可能排名前列。

把这个公式写成更一般的形式:

  

  - C,投票人数扩展的规模,是一个自行设定的常数,与整个网站的总体用户人数有关,可以等于每个项目的平均投票数。

  - n,该项目的现有投票人数。

  - x,该项目的每张选票的值。

  - m,总体平均分,即整个网站所有选票的算术平均值。

这种算法被称为“贝叶斯平均”(Bayesian average)。因为某种程度上,它借鉴了“贝叶斯推断”(Bayesian inference)的思想:既然不知道投票结果,那就先估计一个值,然后不断用新的信息修正,使得它越来越接近正确的值。

在这个公式中,m(总体平均分)是”先验概率”,每一次新的投票都是一个调整因子,使总体平均分不断向该项目的真实投票结果靠近。投票人数越多,该项目的”贝叶斯平均”就越接近算术平均,对排名的影响就越小。

因此,这种方法可以给一些投票人数较少的项目,以相对公平的排名。

=================================================

“贝叶斯平均”也有缺点,主要问题是它假设用户的投票是正态分布。比如,电影A有10个观众评分,5个为五星,5个为一星;电影B也有10个观众评分,都给了三星。这两部电影的平均得分(无论是算术平均,还是贝叶斯平均)都是三星,但是电影A可能比电影B更值得看。

解决这个问题的思路是,假定每个用户的投票都是独立事件,每次投票只有n个选项可以选择,那么这就服从“多项分布”(Multinomial distribution),就可以结合贝叶斯定理,计算该分布的期望值。由于这涉及复杂的统计学知识,这里就不深入了,感兴趣的朋友可以继续阅读William Morgan的How to rank products based on user input

(完)

文档信息


0

   

0

IT 牛人博客聚合网站(udpwork.com) 聚合
|
评论: 0

from IT牛人博客聚合网站: http://www.udpwork.com/item/7048.html

Written by cwyalpha

三月 29, 2012 at 1:26 上午

发表在 Uncategorized

Thought this was cool: 用R来进行布丰投针实验

leave a comment »

在3月14日也就圆周率日那一天,果壳网推出一篇文章《圆周率日特献:π究竟牛B在哪里?》。其中就提到了布丰(Buffon)用投针实验来计算π的近似值。不过这篇文章并没有详细说明如何用软件来做这个实验,也看到网上有朋友在问具体的过程。所以本文尝试用R来实现这个实验,算是狗尾续貂以作消遣。另外,Maxtrix67魏太云都对这个问题有过精彩的论述,有兴趣的朋友可以参考一下。

简单来讲,投针实验是指假设有两根平行的线,它们之间的距离是1。随意抛掷一根长度为0.5的针,那么投针便有机会与平行线相交。如果总的投掷次数为N,发生相交的次数为X,那么可以用N/X来估计π的值。具体的故事和公式还可以参考这个文章

为了在R中实现这个实验过程,我们先绘制出一个空的图形,再加两根平行线。可以只考虑针与一条线的相交情况,我们用一个while循环来进行反复投针,其中用随机数来模拟投针的坐标和角度,并绘制在图形中。如果发现相交则增加变量cross的计数,同时用cat函数显示实验次数和估计值。下图是根据上述假设编写代码所绘制的图形。如果你自己在R语言中运行代码,可以按空格来反复投针,用y来结束实验,可以观察到当试验次数增加,估计值也随之接近真值。

R代码如下:
rm(list=ls())

# 绘制空白图形
plot(c(0,2),c(0,2),type='n',main='布丰投针实验',xlab='X',ylab='Y')
# 增加平行线
abline(h=0.5)
abline(h=1.5,col='red')
finished <- FALSE
# trial为实验次数,cross为交叉次数
trial <- 0
cross <- 0
while (!finished) {
# Dist为针的中心距离红线的垂直距离
# Theta为针的角度
Dist <- runif(1,min=0,max=1/2)
Theta <- runif(1,0,pi)
# central.x为针中心点的横坐标
# central.y为针中心点的纵坐标
central.x <- runif(1,0.5,1.5)
central.y <- Dist +1
# 计算针两端的坐标
y1 <- sin(Theta)/4 + central.y
x1 <- cos(Theta)/4 + central.x
y2 <- sin(Theta+pi)/4 + central.y
x2 <- cos(Theta+pi)/4 + central.x
trial <- trial +1
# 计数交叉次数
cross <- cross + ifelse(0.25*sin(Theta)>=Dist,1,0)
# 绘制针的线型和中心点
lines(c(x1,x2),c(y1,y2),lty=2)
points(central.x,central.y,pch=16,col='grey')
cat('trial=',trial,'cross=',cross,'PI=',trial/cross,'\n')
#continue?
input <- readline('stop?')
# 若输入y,则结束实验
if (input =='y') finished <- TRUE
}

from 数据科学与R语言: http://xccds1977.blogspot.com/2012/03/r_27.html

Written by cwyalpha

三月 27, 2012 at 5:08 下午

发表在 Uncategorized