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
|
import numpy
cimport numpy
def mixw_kmeans_iter(numpy.ndarray[numpy.float64_t, ndim=1] lmw not None,
numpy.ndarray[numpy.float64_t, ndim=1] cb not None):
cdef numpy.ndarray[numpy.float64_t, ndim=1] cbacc = numpy.zeros(len(cb))
cdef numpy.ndarray[numpy.float64_t, ndim=1] cbcnt = numpy.zeros(len(cb))
cdef numpy.ndarray[numpy.float64_t, ndim=1] dist = numpy.zeros(len(cb))
cdef numpy.float64_t tdist = 0.0, m, mdist
cdef Py_ssize_t i, k, cw
for i in range(lmw.shape[0]):
m = lmw[i]
mdist = 1e+50
cw = 0
for k in range(dist.shape[0]):
dist[k] = cb[k] - m
dist[k] *= dist[k]
if dist[k] < mdist:
mdist = dist[k]
cw = k
tdist += mdist
cbacc[cw] += m
cbcnt[cw] += 1
cb[:] = cbacc / cbcnt
return tdist
def map_mixw_cb(numpy.ndarray[numpy.float64_t, ndim=3] mixw not None,
numpy.ndarray[numpy.float64_t, ndim=1] cb not None,
numpy.float64_t zero=0.0):
cdef numpy.ndarray[numpy.uint8_t, ndim=3] mwmap \
= numpy.zeros((mixw.shape[0], mixw.shape[1], mixw.shape[2]), 'uint8')
cdef numpy.ndarray[numpy.float64_t, ndim=3] lmw
cdef Py_ssize_t s, f, g, i, cw
cdef numpy.float64_t x, mdist, dist
lmw = numpy.log(mixw)
for s in range(lmw.shape[0]):
for f in range(lmw.shape[1]):
for g in range(lmw.shape[2]):
x = mixw[s,f,g]
if x <= zero:
mwmap[s,f,g] = len(cb)
else:
cw = 0
mdist = 1e+50
for i in range(len(cb)):
dist = cb[i] - lmw[s,f,g]
dist *= dist
if dist < mdist:
mdist = dist
cw = i
mwmap[s,f,g] = cw
return mwmap
def mixw_freq(numpy.ndarray[numpy.uint8_t, ndim=3] mwmap):
cdef numpy.ndarray[numpy.int32_t, ndim=1] hist \
= numpy.zeros(mwmap.max() + 1, 'int32')
cdef Py_ssize_t i, j, k, cw
for i in range(mwmap.shape[0]):
for j in range(mwmap.shape[1]):
for k in range(mwmap.shape[2]):
cw = mwmap[i,j,k]
hist[cw] += 1
return hist
|