Hatena::ブログ(Diary)

arupaka-_-arupakaの日記

2016-06-02

RでKLダイバージェンス

RでKLダイバージェンス(仮)

0を除かないと発散するので、除くのがポイント

for(i in 1:length(list1)){
list_name<-list1[i]

	v1<-qb[[list_name]]

	a1<-v1[qb$y==1]
	a2<-v1[qb$y==0]

	aa1<-table(a1)
	aa2<-table(a2)

	ll<-unique(c(names(aa1),names(aa2)))	
	aaa1<-NULL
	aaa2<-NULL
	for(i in 1:length(ll)){
		aaa1[i]<-aa1[ll[i]]
		aaa2[i]<-aa2[ll[i]]
	}
	aaa1<-as.vector(aaa1)
	aaa2<-as.vector(aaa2)
	aaa1[is.na(aaa1)]<-0
	aaa2[is.na(aaa2)]<-0

#aaa2[is.na(aaa2)]<-0

#m<-matrix(c(aaa1,aaa2),nrow=2)

	prob<-(aaa1+aaa2)/sum(aaa1+aaa2)
	aaa1<-aaa1[which(prob!=0)]
	aaa2<-aaa2[which(prob!=0)]
	prob<-prob[prob!=0]
	
	entropy1<--sum(log((aaa1^(aaa1/sum(aaa1)))/sum(aaa1)))
	entropy2<--sum(log((aaa2^(aaa2/sum(aaa2)))/sum(aaa2)))
	aaa2b<-aaa2[(aaa1==0 & aaa2==0 )| (aaa1!=0)]
	aaa1b<-aaa1[(aaa1==0 & aaa2==0) | (aaa1!=0)]
	

	v1<-log(((aaa2b/sum(aaa2b))^(aaa2b/sum(aaa2b))))
	v2<-log(((aaa1b/sum(aaa1b))^(aaa2b/sum(aaa2b))))
	info1<- sum(v1-v2)
	
	info2<-KL.empirical(aaa2b,aaa1b)

#chisq.test()
	cat(list_name,"\n")
	str<-chisq.test(aaa1,p=prob)
	cat(str$p.value,"\n")
	cat("ent1",entropy1,"\n")
	cat("ent2",entropy2,"\n")
	cat("info1",info1,"\n")	
	cat("info2",info2,"\n")	

2016-05-30

Rでボックスわけして最頻値

Rでボックスわけして最頻値


mode2<-function(x){
	if(length(x)==1){
		r<-x
	}else{
		qq<-density(x,na.rm=T)
		qq<-approx(qq$x,qq$y,seq(quantile(qq$x,0.01),quantile(max(qq$x),1.0),length.out=1000))

		r<-qq$x[max(qq$y)==qq$y]
	}
	r
}

#exp(log(xb,2))
xx_f<-as.integer((log(xb,2)))

v<-tapply(yb,xx_f,median)
v2<-tapply(yb,xx_f,mode2)
v3<-tapply(yb,xx_f,mean)
v4<-tapply(yb,xx_f,function(x){mean(x,0.8)})
plot(xb,yb,log="xy")
points(2^as.numeric(names(v)),v,col=2)
points(2^as.numeric(names(v2)),v2,col=3)
points(2^as.numeric(names(v3)),v3,col=4)
points(2^as.numeric(names(v4)),v4,col=5)


2016-05-12

pandas pythonでデータをグループわけして記述統計を調べて外部ファイルでソートして出力するワンライナー

pandas pythonでデータをグループわけして記述統計を調べて外部ファイルでソートして出力するワンライナー

  • 並び順の指定なし

入力

  python -c "import pandas as pd;df2=pd.read_csv('a3.txt',names=['st','fee']);print df2.groupby('st').describe().unstack()['fee'];"

出力

count mean std min 25% 50% 75% max

st

イヌ 7 46.428571 19.940387 2 51.5 52 53 62

キツネ 7 26.571429 11.516034 12 17.0 32 33 42

タヌキ 7 6.142857 4.845223 1 3.5 4 9 13

ネコ 7 229.285714 37.200870 145 242.0 242 244 246



  • 並び指定あり
 python -c "import pandas as pd;df=pd.read_csv('a1.txt',names=['id','st'],index_col='st');df2=pd.read_csv('a2.txt',names=['st','fee']);df2b=df2.groupby('st').describe().unstack()['fee'];df2c=df.join(df2b);print df2c;df2c.to_csv('out.csv');"

入力1

並び順指定ファイル

$ cat a1.txt

1,タヌキ

2,キツネ

3,ネコ

4,イヌ

入力2:

データファイル

$ cat a3.txt

イヌ,52

キツネ,32

ネコ,245

タヌキ,3

イヌ,52

キツネ,33

ネコ,242

タヌキ,1

イヌ,53

キツネ,12

ネコ,145

タヌキ,13

イヌ,51

キツネ,22

ネコ,242

タヌキ,13

イヌ,2

キツネ,33

ネコ,246

タヌキ,4

イヌ,53

キツネ,42

ネコ,242

タヌキ,4

イヌ,62

キツネ,12

ネコ,243

タヌキ,5


出力

id count mean std min 25% 50% 75% max

st

タヌキ 1 7 6.142857 4.845223 1 3.5 4 9 13

キツネ 2 7 26.571429 11.516034 12 17.0 32 33 42

ネコ 3 7 229.285714 37.200870 145 242.0 242 244 246

イヌ 4 7 46.428571 19.940387 2 51.5 52 53 62

2016-05-11

2つのファイルを併合するワンライナー(pandas利用)

2つのファイルを併合するワンライナー(pandas利用)

python -c "import pandas as pd;df=pd.read_csv('a1.txt',names=['id','st']);df2=pd.read_csv('a2.txt',names=['st','count']);print pd.merge(df,df2,on='st');"

入力

$ cat a1.txt

1,タヌキ

2,キツネ

3,ネコ

4,イヌ

$ cat a2.txt

イヌ,52

キツネ,32

ネコ,245

タヌキ,3


出力

id st count

0 1 タヌキ 3

1 2 キツネ 32

2 3 ネコ 245

3 4 イヌ 52

2016-03-30

pythonのpandasでデータ解析、カテゴリーごとに和をとる. tapply

groupbyを使う.

2列目を4列目で場合ごとに平均

ll0=df2,4?.groupby(4).mean()$

#そのほか

ll1=df6,4?.groupby(4).mean()$

  ll1=df6,4?.groupby(4).median()$ 

  ll1=df6,4?.groupby(4).describe()$ 

参考:

pandasにsqlでよくやる処理をやらせてみる http://www.mwsoft.jp/programming/numpy/sql_to_pandas.html

gensimの導入

python,

scipy,

numpy

のバージョンチェック

easy_install --upgrade gensim