File: qmwx.pyx

package info (click to toggle)
sphinxtrain 5.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 32,572 kB
  • sloc: ansic: 94,052; perl: 8,939; python: 6,702; cpp: 2,044; makefile: 6
file content (66 lines) | stat: -rw-r--r-- 2,352 bytes parent folder | download | duplicates (7)
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