<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Нормализация методом Маши
Step1:  Данные для смеси 4 кишечных палочек в реальной пропорции. Выравнивали на референс не из данных.
Step2:  Низкопокрытые образцы
А что, если нам мешают образцы, в которых низкое покрытие? Попробуем их удалить.
Step3:  Как видим, изменилось не много. Так что, оставим их в покое.
Фильтрация по покрытию
Step4:  Переберем персентили [25, 20, 15, 10] и количество плохих образцов от 0 до 3.
<ASSISTANT_TASK:>
Python Code:
def normalize(M):
    M_norm = np.full_like(M, 0)
    for i in range(np.shape(M)[0]):
        rev = 1 - M[i, :]
        if np.dot(M[i, :], M[i, :]) > np.dot(rev, rev):
            M_norm[i, :] = rev
        else:
            M_norm[i, :] = M[i, :]
    return M_norm
Explanation: Нормализация методом Маши:
End of explanation
r = np.genfromtxt("LICHeE_4ecoli_without_ref/matrices/R_all", dtype=int, delimiter=' ')
x = np.genfromtxt("LICHeE_4ecoli_without_ref/matrices/X_all", dtype=int, delimiter=' ')
print("%s sites" % len(r))
Ncut = 5
print("Delete zero and almost zero profiles:")
good_ind = [i for i in range(np.shape(x)[0]) 
            if not ((np.abs(r[i, :] - x[i, :]) <= Ncut).all() or (x[i, :] <= Ncut).all())]
print(len(good_ind), "remained")
x = x[good_ind, :]
r = r[good_ind, :]
f = normalize(np.divide(x, r))
draw_PCA(f)
Explanation: Данные для смеси 4 кишечных палочек в реальной пропорции. Выравнивали на референс не из данных.
End of explanation
print(np.median(r, axis = 0))
r_2 = np.delete(r, [2, 6], axis=1)
x_2 = np.delete(x, [2, 6], axis=1)
f_2 = normalize(np.divide(x_2, r_2))
draw_PCA(f_2)
Explanation: Низкопокрытые образцы
А что, если нам мешают образцы, в которых низкое покрытие? Попробуем их удалить.
End of explanation
def filter_by_coverage(cur_r, bad_percent, bad_samples):
    def filter_row(row):
        num_of_samples = len(row)
        valid = np.sum(np.array(([(min_coverage < row) & (row < max_coverage)])))
        return num_of_samples - valid <= bad_samples
    min_coverage = np.percentile(cur_r, bad_percent, axis=0)
    max_coverage = np.percentile(cur_r, 100-bad_percent, axis=0)
    good_coverage = np.array([filter_row(row) for row in cur_r])
    return good_coverage
Explanation: Как видим, изменилось не много. Так что, оставим их в покое.
Фильтрация по покрытию
End of explanation
f_pca = PCA(n_components=2).fit(f).transform(f)
percentiles = [25, 20, 15, 10]
plt.figure(figsize=(15, 15))
for i in range(4):                                                         
    for j in range(4):
        print(i, j, end="-")
        plt.subplot(4, 4, i * 4 + j + 1)
        draw_PCA(f, filter_by_coverage(r, percentiles[i], j), f_pca)
                                                                                  
plt.tight_layout();
Explanation: Переберем персентили [25, 20, 15, 10] и количество плохих образцов от 0 до 3.
End of explanation
<END_TASK>