Слияние кода завершено, страница обновится автоматически
#!/usr/bin/env bin
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from scipy.spatial import distance
'''
* Обработка аномальных значений расстояния Махаланобиса
* Автор: my_name_is_BUG
* Ссылки:
'''
def mahalanob(X, e):
"""
parm X:(m x n) — матрица спектров (строки — образцы, столбцы — спектр)
parm e:(настраиваемый параметр) коэффициент веса стандартного отклонения расстояния Махалонобиса
return:
Xt : матрица спектров после предварительной обработки и фильтрации по расстоянию Махалонобиса
MahalaD: расстояние Махалонобиса для образцов
"""
data = X.copy() # Избегаем проблем с копированием данных
if isinstance(data, pd.DataFrame):
data = data.values
# Вычисляем среднее значение спектра для всех образцов
data_mean = np.mean(data, axis=0)
means = np.tile(data_mean, data.shape[0]).reshape((data.shape[0], data.shape[1]), order='C')
# Вычисляем расстояние Махалонобиса между каждым образцом и средним спектром
CenterX = data - means
M = np.dot(CenterX.T, CenterX) / (data.shape[0] - 1)
Minv = np.linalg.inv(M)
MahalaD = list(distance.mahalanobis(data[i, :], data_mean, Minv) for i in range(data.shape[0]))
# Проводим фильтрацию
MahalaDm = np.mean(MahalaD, axis=0)
Dstd = np.std(MahalaD, axis=0)
Xt = []
for i in range(data.shape[0]):
if MahalaD[i] < (MahalaDm + e * Dstd):
Xt.append(i)
return Xt, MahalaD
if __name__ == "__main__":
from pandas import DataFrame
clomuns = ['水分 %']
data = pd.read_excel( r"G:\PAPER\data\2020.2019_apple_data.xlsx")
colmuns_ = data.columns.values
X = np.abs(data.drop(clomuns, axis=1))
y = data.loc[:,'品种'].values
X_ = X.values()
print(X_.shape)
col, ma = mahalanob(X_, 3.8)
print(col)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )