57 const std::size_t M = L.
rows(), R = L.
cols();
58 if (N.size() != R)
throw InputError(
"pfqn_pam: L and N disagree on the class count");
59 if (!Z.empty() && Z.size() != R)
throw InputError(
"pfqn_pam: Z has the wrong length");
73 for (std::size_t s = 0; s < R; ++s) {
75 for (std::size_t i = 0; i < M; ++i) tot += L(i, s);
77 for (std::size_t i = 0; i < M; ++i) E(i, s) = L(i, s) / tot;
80 for (std::size_t i = 0; i < M; ++i)
81 for (std::size_t s = 0; s < R; ++s) Q(i, s) = E(i, s) * N[s];
84 for (std::size_t i = 0; i < R; ++i) {
86 for (std::size_t j = 0; j < R; ++j) {
88 std::vector<T> Rj(M, zero);
90 for (std::size_t k = 0; k < M; ++k) {
92 for (std::size_t c = 0; c < R; ++c) {
94 if (c == i) q -= E(k, c);
95 if (c == j) q -= E(k, c);
98 Rj[k] = L(k, j) * T(one + agg);
101 const T nj = (i == j) ? T(N[j] - one) : N[j];
102 const T zj = Z.empty() ? zero : Z[j];
103 const T den = T(rtot + zj);
104 const T Xj = (nj > zero && den > zero) ? T(nj / den) : zero;
105 for (std::size_t k = 0; k < M; ++k) Qmi(k, j) = Xj * Rj[k];
108 for (std::size_t k = 0; k < M; ++k) {
110 for (std::size_t c = 0; c < R; ++c) agg += Qmi(k, c);
111 r.
RN(k, i) = L(k, i) * T(one + agg);
114 const T zi = Z.empty() ? zero : Z[i];
115 if (N[i] > zero && T(rtot + zi) > zero) r.
XN[i] = N[i] / T(rtot + zi);
118 for (std::size_t s = 0; s < R; ++s) {
121 for (std::size_t k = 0; k < M; ++k) {
123 for (std::size_t c = 0; c < R; ++c) agg += Q(k, c) - (c == s ? E(k, c) : zero);
124 r.
RN(k, s) = L(k, s) * T(one + agg);
127 const T zs = Z.empty() ? zero : Z[s];
128 if (N[s] > zero && T(rtot + zs) > zero) r.
XN[s] = N[s] / T(rtot + zs);
134 std::vector<T> U(M, zero);
135 for (std::size_t k = 0; k < M; ++k)
136 for (std::size_t c = 0; c < R; ++c) U[k] += L(k, c) * r.
XN[c];
137 for (std::size_t s = 0; s < R; ++s) {
140 for (std::size_t k = 0; k < M; ++k) {
141 if (L(k, s) == zero)
continue;
142 if (!any || U[k] > best) {
147 if (any && best > one) r.
XN[s] = r.
XN[s] / best;
151 for (std::size_t k = 0; k < M; ++k)
152 for (std::size_t s = 0; s < R; ++s) {
153 r.
QN(k, s) = r.
XN[s] * r.
RN(k, s);
154 r.
UN(k, s) = r.
XN[s] * L(k, s);
AmvaResult< T > pfqn_pam(const Matrix< T > &L, const std::vector< T > &N, const std::vector< T > &Z, PamVariant variant=PamVariant::Basic)
Hsieh-Lam Proportional Approximation Methods (PAMB / PAMI / PAMT).