2013年7月13日星期六

jQuery选择器完整介绍

jQuery选择器使得获得页面元素变得更加容易、更加灵活,从而大大减轻了开发人员的压力。如同盖楼一样,没有砖瓦,就盖不起楼房。得不到元素谈何其他各种操作呢?可见,jQuery选择器的重要性。当然想一下子掌握所有选择器也是很困难的,这个得靠实践和积累。
现在我们正式进入jQuery选择器的学习。我们将jQuery选择器进行分类学习,将jQuery选择器分为以下几种:
1、基本选择器
  • id                              根据元素ID选择
  • elementname       根据元素名称选择
  • classname            根据元素css类名选择
举例:
<input type="text" id="ID" value="根据ID选择" />
<a>根据元素名称选择</a>
<input type="text" class="classname" value="根据元素css类名选择" />
jQuery("#ID").val();
jQuery("a").text();
jQuery(".classname").val();
即可分别得到元素的值。以上三种为最常见的选择器,其中ID选择器是效率最高的,在可能的情况下应该尽量使用它。
2、层次选择器
  • ancestor descendant  祖先和子孙选择器
  • parent > child           父子节点选择器
  • prev + next                同级别选择器
  • prev ~ siblings         过滤选择器
举例:
<div id="divTest">
    <input type="text" value="投资" />
    <input id="next" type="text" />
    <input type="text"  value="担当" />
    <input type="text" title="学习" value="学习" />
    <a>1</a>
    <a>2</a>
</div>
//得到div中的a标签内容 结果为12
jQuery("#divTest a").text();
//输出div直接子节点 结果为投资
jQuery("#divTest>input").val();
//输出id为next的后一个同级别元素 结果为担当
jQuery("#next+input").val();
//同上,并且是有title的元素 结果为学习
jQuery("#next~[title]").val();
3、基本过滤选择器
  • :first                       找到第一元素
  • :last                       找到最后一个元素
  • :not(selector)      去除与给定选择器匹配的元素
  • :even                     匹配索引值为偶数的元素 从0开始计数
  • :odd                       匹配索引值为奇数的元素 从0开始计数
  • :eq(index)             匹配一个给定索引值元素 从0开始
  • :gt(index)              匹配大于给定索引值元素
  • :lt(index)               匹配小于给定索引值元素
  • :header                 选择h1,h2,h3一类的标签 (目前没用过)
  • :animated             匹配正执行动画效果的元素 (目前没用过)
举例:
<div id="divTest">
    <ul>
        <li>投资</li>
        <li>理财</li>
        <li>成熟</li>
        <li>担当</li>
        <input type="radio" value="学习" checked="checked" />
        <input type="radio" value="不学习" />
    </ul>
</div>
//第一个li内容 结果为投资
jQuery("li:first").text();
//最后一个li内容 结果为担当
jQuery("li:last").text();
//input未被选中的值 结果为不学习
jQuery("li input:not(:checked)").val();
//索引为偶数的li 结果为投资 成熟
jQuery("li:even").text();
//索引为奇数的li 结果为理财 担当
jQuery("li:odd").text();
//索引大于2的li的内容 结果为担当
jQuery("li:gt(2)").text();
//索引小于1的li的内容 结果为投资
jQuery("li:lt(1)").text();
4、内容过滤器
  • :contains(text)              匹配包含给定文本的元素
  • :empty                        匹配所有不包含子元素或者文本的空元素
  • :has(selector)              匹配含有选择器所匹配的元素
举例:
<div id="Test">
    <ul>
        <li>hyip投资</li>
        <li>hyip</li>
        <li></li>
        <li>理财</li>
        <li><a>投资</a></li>
    </ul>
</div>   
//包含hyip的li的内容 结果为hyip投资 hyip
jQuery("li:contains('hyip')").text();
//内容为空的li的后一个li内容 结果为理财
jQuery("li:empty+li").text();
//包含a标签的li的内容 结果为投资
jQuery("li:has(a)").text();
5、可见性过滤器
  • :hidden    匹配不可见元素
  • :visible     匹配可见元素
举例:
<ul>
    <li>可见</li>
    <li style="display:none;">不可见</li>
</ul>
//不可见的li的内容 结果为不可见
jQuery("li:hidden").text();
//可见的li的内容 结果为可见
jQuery("li:visible").text();
6、属性过滤器
  • [attribute=value]                 匹配属性是给定值的元素
  • [attribute^=value]               匹配属性是以给定值开始的元素
  • [attribute$=value]              匹配属性是以给定值结束的元素
  • [attribute*=value]               匹配属性包含给定值的元素
举例:
<input type="text" name="hyipinvest" value="hyip投资" />
<input type="text" name="investhyip" value="投资hyip" />
<input type="text" name="google" value="HYIP" />
//name为hyipinvest的值 结果为hyip投资
alert(jQuery("input[name='hyipinvest']").val());
//name以hyip开始的值 结果为hyip投资
alert(jQuery("input[name^='hyip']").val());
//name以hyip结束的值 结果为投资hyip
alert(jQuery("input[name$='hyip']").val());
//name包含oo的值 结果为HYIP
alert(jQuery("input[name*='oo']").val());
jQuery选择器就总结到这里,这些基本上都是在学习过程中遇到的,还有极少部分没有总结出来。经过一段时间实践,相信大家就能够熟练的使用jQuery选择器了。

2013年5月1日星期三

ROC曲线简介

一个典型的ROC曲线如下图所示:



基本概念



     一个分类模型(分类器)是一个将一个实例映射到一个特定类的过程。分类器的结果可以是一个实数(连续输出),这些分类器中类的边界必须通过一个阈值检测,举例来说,通过血压来检测一个人是否有高血压,或者它可以作为一个离散的标签表明的类。 让我们来考虑一个两类预测问题(双分类器),其结果要么是真(p)要么是假(n)。在双分类器中有4类可能的输出。如果输出的预测是p而真实的结果也是p,那么这就叫做真阳性(TP);然而如果真实的结果是n,则这就叫做假阳性(FP)。相反的来说,一个真阴性发生在预测结果和实际结果都为n的时候,而假阴性是当预测输出是n而实际值是p的时候。
为了得到一个现实世界中的恰当的例子,考虑一个检测一个人是否得一种病的测试。一个假阳性就是一个人被测试是有这种病的,但实际却没有的情况。一个假阴性就是一个人被测试是健康的,但实际却是得病的情况。 其多种情况可由以下矩阵表示:
真实值
pn全部
预测
输出
p'
阳性

阳性
P'
n'
阴性

阴性
N'
全部PN

ROC空间


要生成一个ROC曲线,只需要真阳性率(TPR)和假阳性率(FPR)。TPR决定了一个分类器或者一个诊断测试在所有阳性样本中能正确区分的阳性案例的性能。而FPR是决定了在所有阴性的样本中有多少假阳性的判断。 ROC空间将FPR和TPR定义为xy轴,这样就描述了真阳性(获利)和假阳性(成本)之间的博弈。而TPR就可以定义为灵敏度,而FPR就定义为(1-特异度),因此ROC曲线有时候也叫做"灵敏度和1-特异度"图像。每一个预测结果在ROC空间中以一个点代表。
最好的可能预测方式是一个在左上角的点,在ROC空间坐标轴(0,1)点,这个代表着100%灵敏(没有假阴性)和100%特异(没有假阳性)。而(0,1)点被称为完美分类器。一个完全随机预测会得到一条从左下到右上对角线(也叫无识别率线)上的一个点。一个最直观的随机预测的作决定的例子就是抛硬币。
这条斜线将ROC空间划分为两个区域,在这条线的以上的点代表了一个好的分类结果,而在这条线以下的点代表了差的分类结果。
让我们来看四个100个阳性和100个阴性的案例:
ABCC'
TP=63FP=2891
FN=37TN=72109
100100200
TP=77FP=77154
FN=23TN=2346
100100200
TP=24FP=88112
FN=76TN=1288
100100200
TP=76FP=1288
FN=24TN=88112
100100200
TPR = 0.63TPR = 0.77TPR = 0.24TPR = 0.76
FPR = 0.28FPR = 0.77FPR = 0.88FPR = 0.12
ACC = 0.68ACC = 0.50ACC = 0.18ACC = 0.82
图中给出了上面4个结果的ROC空间分布。A方式的结果是A,B,C中最好的一个。B的结果是一种随机猜测线(那条斜线),在表中我们可以看到B的精确度是50%。然而当将C作一个镜像后,C的结果甚至要比A还要好。这个作镜像的方法就是简单的不管C预测了什么,就做其预测的反面。离左上角越近的预测,其结果越好。或者说,离随机猜测线越远,则预测的结果越好,如果其点是在右下方的,那么只需作一个镜像即可。

ROC空间中的线



离散分类器,如决策树,产生的是离散的数值或者一个双标签。应用到实例中,这样的分类器最后只会在ROC空间产生单一的点。而一些其他的分类器,如朴素贝叶斯分类器,逻辑回归或者人工神经网络,产生的是实例属于某一类的可能性,对于这些方法,一个阈值就决定了ROC空间中点的位置。举例来说,如果可能值低于或者等于0.8这个阈值就将其认为是阳性的类,而其他的值被认为是阴性类。这样就可以通过画每一个阈值的ROC点来生成一个生成一条曲线。MedCalc是较好的ROC曲线分析软件。

2013年4月30日星期二

简单分析新浪微博上自己的粉丝数与互粉好友粉丝数的关系

    以前好像在某个日志看到过有关于社交网络的有趣数据,其中一个就是你的好友的好友数量普遍都比你自己的好友数量多。这两天正好在看可视化方面的书籍,突然想到可以画个简单的图来看看是不是这样。下面就是我的具体做法了。
    我选择的社交网站是新浪微博,这个选择完全是因为我个人的原因。由于上学期做过相关的爬虫,对新浪微博的数据获取有一定的经验。我选取的实验样本就是我的互粉好友,共计68个人。
    对这68个好友,我分别获取到他们的粉丝数量和他们所有互粉好友粉丝的数量,然后计算出互粉好友粉丝数量的平均值,这样就得到了作图需要的数据源。具体结果如下图,

    通过R语言就可以使用这个数据生成图形了,我做出的第一个图是每个人的两个数据对比柱状图。图片如下:
    从该图可以明显看出,几乎所有的用户的好友粉丝数都多于自己的粉丝数。上面19个人的数据中,只有2个人不符合这一说法。
    为了从总体上刻画出这一问题,我又作了第二张图。


    这张图可以清楚地反应出用户的粉丝数主要几种在50到250这个区间,而用户好友粉丝数的平均值主要分布在250到450这个区间。
    下面展示最后一张图。这是一张二者的密度图。
    


    从这张图可以得到如第二图同样的结果,同样非常直观。
    今天的工作到这里就结束了,这里画图只用了R中最基础的画图函数。等以后学习了高级的画图包之后再看看能不能重画这些图。

    具体代码的链接如下:https://github.com/doumengyu/FansCountComparison

【转载】 ggplot2绘图入门系列之五:时间序列(完)

ggplot2包也能对时间序列数据绘图,但在处理上需要有些注意的地方。下面我们以上证指数为例进行作图,首先利用quantmod包从yahoo数据源获取从1997年以来的数据,存于变量SSEC中,抽取收盘数字,然后分别提取时间数据和指数数值,绘图结果如下图。
library(quantmod)
library(ggplot2)
getSymbols('^SSEC',src='yahoo',from = '1997-01-01')
close <- (Cl(SSEC))
time <- index(close)
value <- as.vector(close)
p <- ggplot(data.frame(time,value),aes(time,value))
p + geom_line()

我们希望能够在图中加入一些其它的说明元素,以丰富视图中所包含的信息。这些信息包括用不同的颜色区块来表示“江核心”和“胡核心”的执政时期,以及对中国证券市场的若干大事件进行标注。最后的代码和结果如下。
yrng <- range(value)
xrng <- range(time)
data <- data.frame(start=as.Date(c('1997-01-01','2003-01-01')),end=as.Date(c('2002-12-30','2012-01-20')),core=c('jiang','hu'))
timepoint <- as.Date(c('1999-07-02','2001-07-26','2005-04-29','2008-01-10','2010-03-31'))
events <- c('证券法实施','国有股减持','股权分置改革','次贷危机爆发','融资融券试点')
data2 <- data.frame(timepoint,events,stock=value[time %in% timepoint])
p + geom_line()
  + geom_rect(aes(NULL,NULL,xmin = start, xmax = end, fill = core),ymin = yrng[1],ymax=yrng[2],data = data)
  + scale_fill_manual(values = alpha(c('blue','red'),0.2))
  + geom_text(aes(timepoint, stock, label = events),data = data2,vjust = -2,size = 5)
  + geom_point(aes(timepoint, stock),data = data2,size = 5,colour = alpha('red',0.5))

【转载】 ggplot2绘图入门系列之四:再说散点图

前文中已初步介绍了散点图的绘制方法,本文介绍一些细节方面的参数设置。

1 色彩和形状的控制
数据特征不仅可以用坐标来表示,也可以用不同的色彩或形状来表示。仍以mpg数据集为例,所用到的变量有cty(城市中行驶距离),hwy(高速路行驶距离),displ(排量大小),year(生产年份)
library(ggplot2)
p <- ggplot(mpg, aes(cty, hwy))
p1 <- p + geom_point(aes(colour = factor(year),shape = factor(year), size = displ), alpha = 0.6, position = 'jitter')
print(p1)
我们将1999年生产车型用红色圆形表示,2008年用兰色三角形表示,排量用图形的大小表示,并且设置了透明度和jitter以避免样本点之间的重叠。可观察到2008年生产的大排量车型较多,从而油耗较高,单位油耗行驶距离较短。

2 坐标的控制
上图右上角数据点较为稀疏,这种情况下可用对数变换。为了演示ggplot2对图形坐标的控制,我们对X轴和Y轴均进行对数变换,然后对X轴的坐标显示加以限制,只显示X轴数据的均值,以及一倍标准差的坐标。

cty.mean=with(mpg,mean(cty))
cty.sd=with(mpg,sd(cty))
p1 + scale_x_continuous(trans='log',breaks=c(cty.mean-cty.sd,cty.mean,cty.mean+cty.sd), labels=c("high", "mean", "low")) + scale_y_continuous(trans='log')


3 文字说明
利用geom_text函数可添加文字说明以增强图形的可读性

p <- ggplot(mtcars, aes(x=wt, y=mpg,colour=factor(cyl),label=rownames(mtcars))) 
p + geom_text(hjust=0,vjust=-1,alpha=0.8)+ geom_point(size=3,aes(shape=factor(cyl)))


4 矩阵散点图
ggplot2包中也提供了矩阵散点图函数

plotmatrix(USArrests)+geom_smooth()

【转载】ggplot2绘图入门系列之三:位置调整与条形图

位置调整(Position adjustments)是针对同一图层内元素的位置进行微调的方法。它包括五种设置,分别是stack、dodge、fill、identity、jitter。

我们用条形图来展示其用法,仍使用mpg数据集,其中用到的变量是class,即生产汽车的类型,以及year生产年份。下面的条形图是将各类型的汽车数量进行汇集,并以年份作为分组变量。我们首先载入扩展包,然后用频数表对数据进行大致的了解,最后绘制了四种条形图。
library(ggplot2)
with(mpg,table(class,year))
p <- ggplot(data=mpg,aes(x=class,fill=factor(year)))
p + geom_bar(position='dodge')
p + geom_bar(position='stack')
p + geom_bar(position='fill')
p + geom_bar(position='identity',alpha=0.3)
 





可以看到dodge方式是将不同年份的数据并列放置;stack方式是将不同年份数据堆叠放置,这也是geom_bar的默认处理方式;fill方式和stack类似,但Y轴不再是计数,而是以百分比显示;identity方式是不做任何改变直接显示出来,所以需要设置透明度才能看得清楚。

geom_bar是绘制条状几何对象,所以也可以用不经汇集的原始数据进行绘图。下面我们用2001到2010年间的美国GDP增长率举个例子。

y=c(1.1,1.8,2.5,3.6,3.1,2.7,1.9,-0.1,-3.5,3.0)
x=2001:2010
data=data.frame(x,y)
p=ggplot(data,aes(x,y,fill=y))
p+geom_bar(stat="identity")+ 
    geom_abline(intercept = 0, slope = 0,size=1,colour='gray')+
    geom_text(aes(label=y),hjust=0.5, vjust=-0.5 )+
    scale_y_continuous(limits=c(-3.8,4.2))+
    labs(x='年份', y='GDP增长率%')+
    opts(title = "美国GDP增长率")