1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 | var extend = require('node.extend');
let MI={
CalcLMI:function(req, res, next){
let clusterdata = req.body.clusterdata
let featureslength = req.body.featureslength
let adjList = req.body.adjList
let dataset = []
for(let i=0;i<clusterdata.length;i++){
for(let m=0;m<clusterdata[i].length;m++){
dataset[clusterdata[i][m]] = CreateVector(clusterdata.length, i)
}
}
let MeanV = CalcMean(dataset)
let MI = []
for(i=0;i<dataset.length;i++){
MI.push (CalcByi(i,2,MeanV,dataset,featureslength, adjList))
}
let resj = JSON.stringify(MI);
res.send(resj);
}
}
function CreateVector(length,lebal){
let a=[]
for(let i=0;i<length;i++){
if(i==lebal)
a.push(1)
else
a.push(0)
}
return a;
}
function CalcMean(vectors){
let result=null;
for (let i=0;i<vectors.length;i++){
if(result==null)
result = extend( [], vectors[i])
else{
for(let m=0;m<vectors[i].length;m++){
result[m]+=vectors[i][m]
}
}
}
for(let m=0;m<result.length;m++){
result[m] = result[m]/vectors.length
}
return result
}
function CalcByi(id,adjnum,Mean,dataset,featureslength, adjList){
let result=0;
let list = getadjlist(adjnum, 1, new Map(), [id], adjList)
list.forEach( (weight,thisid)=>{
result = plusV(result, VmultiN(weight,minusV(dataset[thisid],Mean)))
})
result = multiV( result,minusV(dataset[id],Mean))
//something start
let something = 0
for(let i=0;i<featureslength;i++){
if ( i != id)
something += multiV(minusV(dataset[i],Mean), minusV(dataset[i],Mean))
}
something = something / (featureslength-1)
result = result / something
//something end
//weight norm
let weightsum=0
list.forEach( (weight,thisid)=>{
weightsum += weight
})
result = result / weightsum
return result
}
function getadjlist(adjnum, weight,result, ids, adjList){
if (adjnum==1){
ids.forEach(id=>{
for(let i=0;i<adjList[id].length;i++){
if(!result.has(adjList[id][i])) {
result.set(adjList[id][i],weight)
}
}
})
}else{
ids.forEach(id=>{
for(let i=0;i<adjList[id].length;i++){
if(!result.has(adjList[id][i])) {
result.set(adjList[id][i],weight)
}
}
getadjlist(adjnum-1, weight/2,result, adjList[id], adjList)
})
}
return result
}
function VmultiN(n,v){
let result = extend( [], v)
for(let i=0 ; i < result.length;i++){
result[i]*=n
}
return result
}
function multiV(v1,v2){
let result = 0;
for(let i=0;i<v1.length;i++){
result += v1[i]* v2[i]
}
return result
}
function minusV(v1,v2){
let result = extend( [], v1)
for(let i=0 ; i < result.length;i++){
result[i] = result[i]-v2[i]*1
}
return result
}
function plusV(v1,v2){
if(v1==0){
return v2;
}
let result = extend( [], v1)
for(let i=0 ; i < result.length;i++){
result[i] = result[i]+v2[i]*1
}
return result;
}
module.exports = MI
|