- k個の量的尺度があって、サンプルについてk個の値のセットが観察されているとする
- サンプルはk次元空間の点に対応させることができる
- こちらでやっているように、代数統計的に考えると、k個の尺度の2値分割表()は、軸の集合のべき集合に分解して考えることができる
- そのやり方をk次元の量的データに持ち込むとしたらどうするだろうか
- サンプルの座標は自由度kであるのに対して、個の頂点を持つ正単体の自由度はであるから、ルールが無ければ1対1対応させることはできない
- k尺度が独立であるものとし、また、各尺度の値を0-1に標準化することが許されるならば、1対1対応の点をとることができる
- ひとたび、正単体座標に展開できれば、複数のサンプルのデータも正単体座標の位置として表現することができる
- これがうまい方法かどうかは、さておき、k次元空間にサンプルが分布する「雲」のようなものが、あるルールで次元空間の1点に対応づけることができるようだ
- この次元空間の点には、各軸、軸のペア、軸のトリオ…というように軸が作るべき集合ごとに情報を取り出す方法が存在する
- 軸ペアの場合は、k個の尺度のペアワイズな相関の強さに対応する(だろう)
- ここで、少し考えてみることがある
- 表では、k個の各軸の比率のみが問題となり、その期待値が、となれば、分散はとなって、分散をわざわざ求める必要もない
- 他方、k軸の量的な値セットの分布を取るときには、各軸に分布があり、n次モーメントもとれるし、モーメントを取るだけでは意味をなさないような分布もあり得る
- すると、べき集合要素が表す「向き」のそれぞれについて分布を考えるときにも、それぞれの「向き」に関する多次モーメントやら、モーメントで表せない分布に依存する何かしら、やらを問題にすることになって、それを問題にすることで、良いことがあるんだろうか…
- というようなことを考えながら、書いたソース(ただのメモ)
- 多分、こちらの市松模様分布の検出とか、多様体学習とか(こちら)につながる話だし
- k次元球上の点の位置で表されるベクトルたちの配置の自由度がであって…でも自由度っていう考え方もあって、というあたりの話(こちら)と、一緒に説明されると予想される話
LogLinearExp<-function(Table,r,Facets){
E<-array(1,r)
address<-which(E==1,arr.ind=TRUE)
FacetList<-list()
margList<-list()
margAddress<-list()
cnt<-1
for(i in Facets){
FacetList[[cnt]]<-as.integer(i)
if(length(FacetList[[cnt]])==1){
margList[[cnt]]<-as.matrix(apply(Table,FacetList[[cnt]],sum))
}else{
margList[[cnt]]<-as.array(apply(Table,FacetList[[cnt]],sum))
}
margAddress[[cnt]]<-which(margList[[cnt]]<Inf,arr.ind=TRUE)
cnt<-cnt+1
}
for(i in 1:length(address[,1])){
for(j in 1:length(FacetList)){
short.address<-address[i,FacetList[[j]]]
if(length(short.address)==1)short.address<-c(short.address,1)
diff<-apply((t(margAddress[[j]])-short.address)^2,2,sum)
marg.address<-which(diff==0)
E[i]<-E[i]*margList[[j]][marg.address]
}
}
E<-E/sum(E)*sum(Table)
E
}
CalcAllMarginals<-function(Table,k){
s<-as.set(1:k)
powset<-set_power(s)
marginals<-list()
cnt<-1
for(i in powset){
elems<-as.integer(i)
if(length(elems)==0){
marginals[[cnt]]<-list(elems=c(),marginals=sum(Table))
}else{
marginals[[cnt]]<-list(elems=elems,marginals=apply(Table,elems,sum))
}
cnt<-cnt+1
}
marginals
}
CategoryVector<-function (nc = 3)
{
df <- nc - 1
d <- df + 1
diagval <- 1:d
diagval <- sqrt((df + 1)/df) * sqrt((df - diagval + 1)/(df -
diagval + 2))
others <- -diagval/(df - (0:(d - 1)))
m <- matrix(rep(others, df + 1), nrow = df + 1, byrow = TRUE)
diag(m) <- diagval
m[upper.tri(m)] <- 0
as.matrix(m[, 1:df])
}
RandomSphere <-
function (df = 3, r = 1, n = 100)
{
rs <- matrix(rnorm(df * n), nrow = n)
rs/sqrt(apply(rs^2, 1, sum)) * r
}
MakeFacets<-function(Faces){
Subs<-outer(Faces,Faces,FUN="set_is_proper_subset")
diag(Subs)<-FALSE
tmp.facets<-abs(sign(apply(Subs,1,sum))-1)
Faces2<-list()
cnt<-1
for(i in 1:length(tmp.facets)){
if(tmp.facets[i]==1){
Faces2[[cnt]]<-Faces[[i]]
cnt<-cnt+1
}
}
tmp<-as.set(Faces2)
}
MakeX2<-function(ns,Facets=NULL){
CV<-list()
for(i in 1:length(ns)){
CV[[i]]<-CategoryVector(ns[i])
}
t<-array(1,ns)
taddress<-which(t>0,arr.ind=TRUE)
R<-prod(ns)
zeros<-c()
CVext<-list()
for(i in 1:length(ns)){
tmp<-matrix(0,length(CV[[i]][1,]),R)
for(j in 1:R){
tmp[,j]<-CV[[i]][taddress[j,i],]
}
CVext[[i]]<-tmp
}
s<-as.set(1:length(ns))
ps<-set_power(s)
X<-NULL
Y<-NULL
cnt<-1
for(i in ps){
z<-1
for(j in Facets){
if(i<=j){
z<-0
}
}
if(set_is_empty(i)){
tmpX<-rep(1,R)
}else{
tmplist<-c()
for(j in i){
tmplist<-c(tmplist,j)
}
tmplist<-sort(tmplist)
N<-length(tmplist)
tmpX<-NULL
if(N==1){
tmpX<-CVext[[tmplist]]
}else{
initX<-CVext[[tmplist[1]]]
vals<-NULL
for(j in 1:R){
tmpvals<-initX[,j]
for(k in 2:N){
tmpvals<-outer(tmpvals,CVext[[tmplist[k]]][,j],FUN="*")
}
tmpvals<-c(tmpvals)
vals<-rbind(vals,tmpvals)
}
tmpX<-t(vals)
}
}
if(is.null(dim(tmpX)))tmpX<-matrix(tmpX,nrow=1)
Y<-rbind(Y,tmpX)
zeros<-c(zeros,rep(z,length(tmpX[,1])))
X[[cnt]]<-tmpX
cnt<-cnt+1
}
list(matrixX=Y,listX=X,zeros=zeros)
}
MakeX3<-function(ns,Facets=NULL){
ret<-MakeX2(ns,Facets)
X<-ret$matrixX
dd<-diag(X%*%t(X))
X2<-diag(1/sqrt(dd))%*%X
list(matrixX=X2,listX=ret$listX,zeros=ret$zeros)
}
IchimatsuK<-function(n,k){
r<-matrix(runif(n*k),n,k)
loop<-TRUE
ok<-0
tmps<-NULL
while(loop){
s<-matrix(sample(c(0,-1),n*k*3,replace=TRUE),ncol=k)
tmps<-rbind(tmps,s[which(apply(s,1,sum)%%2==0),])
if(length(tmps[,1])>=n){
loop<-FALSE
}
}
tmps<-tmps[1:n,]
r*((tmps+0.5)*2)
}
k<-3
Npt<-100000
Ps<-matrix(0.5,Npt,k)
for(i in 2:Npt){
Ps[i,]<-Ps[i-1,]
Ps[i,]<-Ps[i,]+rnorm(k,mean=0,sd=min(abs(c(1-Ps[i,],Ps[i,])))*0.05)
}
library(rgl)
plot3d(Ps[,1:3],xlim=c(0,1),ylim=c(0,1),zlim=c(0,1))
r<-rep(2,k)
R<-prod(r)
Koshi<-function(x){
tmp<-rbind(1-x,x)
ret1<-tmp[,1]
for(i in 2:length(x)){
ret1<-outer(ret1,tmp[,i],FUN="*")
}
ret1
}
Koshi(Ps[1,])
Q<-rep(0,R)
for(i in 1:Npt){
tmp<-c(Koshi(Ps[i,]))
Q<-Q+tmp
}
Q.table<-array(Q,r)
Facets<-list()
XZ<-MakeX3(r,Facets)
XZ$matrixX%*%Q/sum(Q)
plot(XZ$matrixX%*%Q/sum(Q))
CalcAllMarginals(Q.table,k)
k<-3
Ps<-RandomSphere(k,0.25,Npt)+0.5
plot3d(Ps[,1:3],xlim=c(0,1),ylim=c(0,1),zlim=c(0,1))
Q<-rep(0,R)
for(i in 1:Npt){
tmp<-c(Koshi(Ps[i,]))
Q<-Q+tmp
}
Q.table<-array(Q,r)
Facets<-list()
XZ<-MakeX3(r,Facets)
XZ$matrixX%*%Q/sum(Q)
CalcAllMarginals(Q.table,k)
n<-10000
k<-4
IchimatsuOut<-IchimatsuK(n,k)
library(rgl)
plot3d(IchimatsuOut[,1:3])
plot(as.data.frame(IchimatsuOut))
n<-10000
k<-5
IchimatsuOut<-IchimatsuK(n,k)
plot3d(IchimatsuOut[,1:3])
plot(as.data.frame(IchimatsuOut))
r<-rep(2,k)
R<-prod(r)
Ps<-IchimatsuOut
Ps<-Ps-min(Ps)
Ps<-Ps/(max(Ps))
plot3d(Ps[,1:3])
Npt<-n
Q<-rep(0,R)
for(i in 1:Npt){
tmp<-c(Koshi(Ps[i,]))
Q<-Q+tmp
}
Q.table<-array(Q,r)
Facets<-list()
XZ<-MakeX3(r,Facets)
XZ$matrixX%*%Q/sum(Q)
plot(XZ$matrixX%*%Q/sum(Q))
CalcAllMarginals(Q.table,k)