bakey的小世界
日历
网志分类
· 所有网志 (166)
· 胡思乱想 (3)
· 学习生活 (10)
· 未分类 (153)
最新的评论
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· polly
· 高性能网络编程maillist

订阅 RSS

0028665

歪酷博客

bakey @ 2009-06-30 11:30

贝叶斯算法是基于概率,这里有一篇说得挺详细的介绍:http://hi.baidu.com/finlandrbt/blog/item/8f05b2115e019e78cb80c474.html
简单来说,首先对两类文本信息进行学习,计算出每个token在各类文本中的一个概率,公式简单表示为:字频/token总数,
这样得出两个hash table,分别表示两类文本,再按照两个hash table算出一个关于概率的hash_table,表示某个字串属于某一类文本的可能性。公式为:token在该类文本中的字频/该token在两类文本中的概率之和。当要分析一个新文本的时候,首先得出它所有的token串,然后查表得出这么多token串的概率,然后算出一个复合概率:所有概率的乘积/(所有概率的乘积+(1-各个概率)之和),便可得出这个文本属于这一类的一个概率,再设定一个阈值,如果超过这个阈值,则可判定这个文本为此类文本。
综合来说:贝叶斯算法也是基于概率的一个算法,有很大的不确定性,但是,他是基于机器学习的启发式概率算法,有一定的人工智能的味道在里面。理论上来说,如果样本空间足够大,是否能说贝叶斯算法足够能得出正确的结果呢。
感觉这个算法挺奇妙,至少感觉是从理论的高度上确定了算法的可行性。以前自己在思考这类问题的时候,思路和他差不多,但是没能想得这么细河这么系统,在平时的工作时,有很多需要加入一些机器判定的问题可以借鉴贝叶斯算法的原理。例如:在一些论坛上判定一些垃圾账号,文本分类推荐,对spider抓取的数据进行分类等等........
迟点打算写个程序出来实现这个算法。


 
bakey @ 2009-05-15 16:46

t = n ^ (n-1)
因为n-1实际上是把n的最后一位1变成0,其他位不变,所以这样得出来之后,是n的最后一位为1,其他位都是0(因为异或的意思是相同的数会为0,不同的为1,而n-1和n只有n的最后一位1这个位置不同)
然后n & t ,则会把其他位都置为0,而最后一位为1


 
bakey @ 2009-04-11 00:24

以前有时间有精力的时候不去做,现在才忽然发现应该好好做一下。以上说的是USACO,玩ACM的时候曾经兴冲冲地跑上去做了几题之后就扔下不管了,结果自己的水平也就一直停留在那上面,现在却忽然发现其中的乐趣,又打算做了起来。如果我当年能够意识到,可能现在我就完全不是这样了,不过过去了的事情也没办法再说什么了。还是重新上路吧,每天用脑子思考一下难题也蛮有趣的,还可以写写自己喜欢的代码,只是希望这次不要那么功利,争取自己独立完成它吧。~~~~~现在做到了chapter1的section1.3了,争取下周把chapter1完成它:)


 
bakey @ 2009-04-09 15:12

在FireFox地址栏中输入 about:config 确定之后出来FireFox的详细配置,搜索browser.tabs修改下面两项
browser.tabs.loadBookmarksInBackground
browser.tabs.loadDivertedInBackground
设置为true
就可以实现在FireFox点页内链接打开新标签页但不切换到新标签页的效果.


 
bakey @ 2009-03-28 23:44

很久没有静下心来看一些英文的技术书了,最近在无聊的时候又拿起这本经典的书籍来读一下。这次的确感觉到了经典的英文技术书和国产的书籍的差距了,老外真的可以做到很详细地站在读者的角度,把一个算法从从头到尾给你剖析得清清楚楚,如果真的有心看进去,绝对会对书中描述的算法有个很深入的理解。忽然很后悔当初买了之后一直都不能静下心好好读一读这本书,导致自己现在的基础也是很不牢固,其实这个缺点一直伴随着我的成长,太浮躁了,从来不肯好好的,慢慢的去把一样东西深入地学好。可惜了那段学习的岁月了。闲话先不说,记一下这两天看到的东西。
1:插入排序。在少量数据的时候表现最好,虽然均摊复杂度为O(n^2),但是最优可以去到omiga(N)。现在stl的sort算法好像在少量数据的情况下也是用插入排序来代替快排的。
2:快速排序。均摊O(nlogn)的复杂度,但是最坏情况可以达到O(n^2),这是出现在当待排序的数据已经是排好序,并且每一次我们都挑选最大的那个数据来作为中枢的情况下(对照快排的过程来思考下)。这个时候我们可以采用随机挑选一个数据作为中枢的办法来防止最坏的情况出现,如果这样的话你都能碰上最坏的情况,那恭喜你,去买彩票吧。
3:基于比较的排序算法的lower_bound是O(nlogn)的,这是基于一个叫做“决定树”的模型来作出的。具体的证明没细看。因为前面的基于递归的复杂度方程推演没怎么看,下来还是要好好看。
4:相对于输入数据为正整数的情况,有线性复杂度的排序,首先是一个“计数排序”,针对某个上限的整数集合的排序,然后基于这个,有基数排序,复杂度为O(kn)和桶排序。不过不知道这种排序算法的实用性有多大呢。
5:在一个线性表中同时查找最大最小的值,可以把比较次数优化到3*n/2。另外找k大k小数,有个基于和快速排序非常类似的划分过程的算法,期望复杂度可以认为是线性。
6:二分查找树,给出一个二分搜索树的节点x,找出这个节点在这棵树的有序序列中的最近后继和最近前继,最近前继所在的节点是一个它的左孩子也为x的祖先的最靠近叶子的节点(是不是有点拗口^_^),复杂度是树的高度(logn)
后面打算阅读的内容:
1:递归方程
2:二分搜索树的其他内容,红黑树,动态规划,贪心,B树............................


 
bakey @ 2009-03-01 18:41

C++ Template 中的typename、class关键字
   在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?
        相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为:       template<class T>...... 
在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:       template<typename T>......
在模板定义语法中关键字class与typename的作用完全一样。
        typename难道仅仅在模板定义中起作用吗?其实不是这样,typename另外一个作用为:使用嵌套依赖类型(nested  depended name),如下所示:
  class MyArray     
   {     
   public:
       typedef   int   LengthType;
       .....
   }

   template<class T>
   void MyMethod( T myarr ) 
   {         
       typedef typename T::LengthType LengthType;       
       LengthType length = myarr.GetLength; 
   }
这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有typename,编译器没有任何办法知道T::LengthType是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。


 
bakey @ 2009-02-26 14:24

首先当然是要安装samba了,呵呵:
代码:
sudo apt-get install samba
sudo apt-get install smbfs


下面我们来共享群组可读写文件夹,假设你要共享的文件夹为: /home/ray/share

首先创建这个文件夹
代码:
mkdir /home/ray/share
chmod 777 /home/ray/share


备份并编辑smb.conf允许网络用户访问
代码:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
sudo gedit /etc/samba/smb.conf


搜寻这一行文字
代码:
; security = user


用下面这几行取代
代码:
security = user
username map = /etc/samba/smbusers


将下列几行新增到文件的最后面,假设允许访问的用户为:newsfan。而文件夹的共享名为 Share

代码:
[Share]
comment = Shared Folder with username and password
path = /home/ray/share
public = yes
writable = yes
valid users = newsfan
create mask = 0700
directory mask = 0700
force user = nobody
force group = nogroup
available = yes
browseable = yes


然后顺便把这里改一下,找到[global]把 workgroup = MSHOME 改成
代码:
workgroup = WORKGROUP
display charset = UTF-8
unix charset = UTF-8
dos charset = cp936

后面的三行是为了防止出现中文目录乱码的情况。其中根据你的local,UTF-8 有可能需要改成 cp936。自己看着办吧。

现在要添加newsfan这个网络访问帐户。如果系统中当前没有这个帐户,那么
代码:
sudo useradd newsfan

要注意,上面只是增加了newsfan这个用户,却没有给用户赋予本机登录密码。所以这个用户将只能从远程访问,不能从本机登录。而且samba的登录密码可以和本机登录密码不一样。

现在要新增网络使用者的帐号:
代码:
sudo smbpasswd -a newsfan
sudo gedit /etc/samba/smbusers


在新建立的文件内加入下面这一行并保存
代码:
newsfan = "network username"


如果将来需要更改newsfan的网络访问密码,也用这个命令更改
代码:
sudo smbpasswd -a newsfan


删除网络使用者的帐号的命令把上面的 -a 改成 -x
代码:
sudo testparm
sudo /etc/init.d/samba restart

最后退出重新登录或者重新启动一下机器。


 
bakey @ 2009-02-22 00:57

遇到什么internal server down之类,错误日志为:/var/www/drupal/.htaccess: order not allowed here
在apache的配置文件中添加:
<directory "/var/www/drupal">
        AllowOverride FileInfo Limit Options Indexes
</directory>
----------------------------------------------------------------------------------------------
让php支持mysql:
sudo apt-get install libapache2-mod-auth-mysql
sudo apt-get install php5-mysql
重启apache
ok!!
-------------------------------------------------------------------------------------------------
出现这个错误:Can't connect to local MySQL server through socket /var/run/***/mysql.sock
则去/etc/php5/apache/php.ini文件中修改下面这个值
mysql.default_socket = /tmp/mysql.sock

[经验:多查看log,一般apache的log在/var/log/apache2,其他系统log一般会在/var/log/syslog]