Compartir tecnología

Día 23 del campamento de registro de aprendizaje de 25 días de Shengsi El algoritmo del vecino más cercano K implementa la agrupación de vinos tintos

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

¿Puedes ganar premios aprendiendo IA? 30 minutos al día, 25 días para abrir el segundo meridiano AI Rendu (qq.com)

El algoritmo del vecino más cercano K implementa la agrupación de vinos tintos

Este experimento presenta principalmente el uso de MindSpore para realizar experimentos KNN en algunos conjuntos de datos de vino.

1. Propósito experimental

  • Comprender los conceptos básicos de KNN;
  • Aprenda a realizar experimentos KNN utilizando MindSpore.

2. Introducción al principio del algoritmo del vecino más cercano K

K-Nearest-Neighbor (KNN) es un método estadístico no paramétrico para clasificación y regresión, propuesto originalmente por Cover y Hart en 1968 (Cubierta y otros, 1967 ), es uno de los algoritmos más básicos del aprendizaje automático. Se basa en la idea anterior: para determinar la categoría de una muestra, puede calcular su distancia de todas las muestras de entrenamiento, luego encontrar las k muestras más cercanas a la muestra, contar las categorías de estas muestras y votar la que tiene. más votos Esa clase es el resultado de la clasificación. Tres elementos básicos de KNN:

  • Valor K, la clasificación de una muestra está determinada por el "voto mayoritario" de K vecinos. Cuanto menor sea el valor de K, más fácil será verse afectado por el ruido. Por el contrario, los límites entre categorías se volverán borrosos.

  • La medida de distancia refleja la similitud entre dos muestras en el espacio de características. Cuanto menor es la distancia, más similares son las muestras. Las más utilizadas incluyen la distancia Lp (cuando p = 2, es la distancia euclidiana), la distancia de Manhattan, la distancia de Hamming, etc.

  • Reglas de decisión de clasificación, generalmente votación por mayoría o votación por mayoría basada en la ponderación de la distancia (las ponderaciones son inversamente proporcionales a la distancia).

Los métodos estadísticos no paramétricos se refieren a métodos estadísticos que no se basan en formas paramétricas (como el supuesto de distribución normal en las estadísticas tradicionales, etc.), es decir, no hacen supuestos estrictos sobre la distribución de datos. En comparación con los métodos estadísticos paramétricos (como la regresión lineal, la prueba t, etc.), los métodos estadísticos no paramétricos son más flexibles porque no suponen que los datos sigan un patrón de distribución específico.

Los métodos estadísticos paramétricos se basan en hacer suposiciones y requisitos específicos para la distribución de datos y utilizan ciertos parámetros para describir la forma de distribución de los datos. Estas formas paramétricas pueden simplificar significativamente los modelos y análisis, pero también requieren que estos supuestos y parámetros sean consistentes con los datos reales, lo que puede llevar a conclusiones engañosas cuando no se cumplen los supuestos.
1. Regresión lineal:
Supuesto: Existe una relación lineal entre la variable dependiente (variable de respuesta) y la variable independiente (variable explicativa).
Parámetros: Coeficientes de regresión (pendiente e intercepto), generalmente asumiendo que el término de error tiene media cero, varianza constante (homoscedasticidad) y una distribución normal.
2. Regresión logística:
Supuesto: la variable dependiente (variable categórica) satisface el modelo de regresión logística y el coeficiente de regresión es un valor fijo.
Parámetro: Coeficiente de regresión, utilizado para describir la influencia de las variables independientes sobre las variables dependientes, estimado mediante estimación de máxima verosimilitud.
3. prueba t:
Supuesto: Los datos de la muestra provienen de una población distribuida normalmente.
Parámetros: media y varianza, la prueba t de una muestra asume la media de la población, la prueba t de dos muestras asume la diferencia entre las medias de dos poblaciones.

 

2.1 Problema de clasificación

El proceso del algoritmo de predicción (clasificación) es el siguiente:

(1) Encuentre las k muestras más cercanas a la muestra de prueba x_test en el conjunto de muestras de entrenamiento y guárdelas en el conjunto N;

(2)统计集合N中每一类样本的个数𝐶𝑖,𝑖=1,2,3,...,𝑐;

(3)最终的分类结果为argmax𝐶𝑖 (最大的对应的𝐶𝑖)那个类。

En el proceso de implementación anterior, el valor de k es particularmente importante. Se puede determinar en función de las características del problema y de los datos. En la implementación específica, se puede considerar el peso de la muestra, es decir, cada muestra tiene un peso de votación diferente. Este método se denomina algoritmo de k vecino más cercano ponderado, que es una variante del algoritmo de k vecino más cercano.

2.2 Problema de regresión

假设离测试样本最近的k个训练样本的标签值为𝑦𝑖,则对样本的回归预测输出值为:

Ese es el valor medio de la etiqueta de todos los vecinos.

La función de predicción de regresión con ponderaciones muestrales es:

其中𝑤𝑖为第个𝑖样本的权重。

2.3 Definición de distancia

KNN算法的实现依赖于样本之间的距离,其中最常用的距离函数就是欧氏距离(欧几里得距离)。ℝ𝑛空间中的两点𝑥和𝑦,它们之间的欧氏距离定义为:

Cabe señalar que cuando se utiliza la distancia euclidiana, cada componente del vector de características debe normalizarse para reducir la interferencia causada por los diferentes rangos de escala de los valores de las características. De lo contrario, los componentes de características con valores pequeños serán reemplazados por características con valores grandes. Los valores característicos están sumergidos.

Otros métodos de cálculo de distancia incluyen la distancia de Mahalanobis, la distancia de Bhattacharyya, etc.

3. Entorno experimental

Conocimientos preliminares:

  • Competente en el uso de Python.
  • Tener ciertos conocimientos de la teoría del aprendizaje automático, como KNN, aprendizaje no supervisado, distancia euclidiana, etc.

ambiente de laboratorio:

  • MindSpore 2.0 (la versión de MindSpore se actualizará periódicamente y esta guía también se actualizará periódicamente para que coincida con la versión);
  • Este caso es compatible con sistemas win_x86 y Linux, y puede ejecutarse en CPU/GPU/Ascend.
  • Si está ejecutando este experimento localmente, consulte el "Manual del experimento de configuración del entorno MindSpore" para instalar MindSpore localmente.

4. Procesamiento de datos

4.1 Preparación de datos

El conjunto de datos de Wine es uno de los conjuntos de datos más famosos para el reconocimiento de patrones. El sitio web oficial del conjunto de datos de Wine:Conjunto de datos sobre el vino . Los datos son el resultado de un análisis químico de vinos de la misma región de Italia pero de tres variedades diferentes. El conjunto de datos analiza las cantidades de 13 ingredientes contenidos en cada uno de tres vinos.Estos 13 atributos son

  1. Alcohol
  2. Ácido málico, ácido málico
  3. Gris ceniza
  4. Alcalinidad de las cenizas, alcalinidad de las cenizas.
  5. Magnesio
  6. Fenoles totales, fenoles totales.
  7. Flavonoides, flavonoides
  8. Fenoles no flavonoides, fenoles no flavonoides
  9. Proantocianinas, proantocianidinas
  10. Intensidad del color, intensidad del color.
  11. Matiz
  12. OD280/OD315 de vinos diluidos, OD280/OD315 de vinos diluidos
  13. Prolina, prolina
LlaveValorLlaveValor
Características del conjunto de datos:MultivarianteNúmero de instancias:178
Características del atributo:Entero, realNúmero de atributos:13
Tareas asociadas:Clasificación¿Valores faltantes?No
  1. %%capture captured_output
  2. # 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
  3. !pip uninstall mindspore -y
  4. !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
  1. # 查看当前 mindspore 版本
  2. !pip show mindspore
Name: mindspore
Version: 2.2.14
Summary: MindSpore is a new open source deep learning training/inference framework that could be used for mobile, edge and cloud scenarios.
Home-page: https://www.mindspore.cn
Author: The MindSpore Authors
Author-email: [email protected]
License: Apache 2.0
Location: /home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages
Requires: asttokens, astunparse, numpy, packaging, pillow, protobuf, psutil, scipy
Required-by: 
  1. from download import download
  2. # 下载红酒数据集
  3. url = "https://ascend-professional-construction-dataset.obs.cn-north-4.myhuaweicloud.com:443/MachineLearning/wine.zip"
  4. path = download(url, "./", kind="zip", replace=True)
Downloading data from https://ascend-professional-construction-dataset.obs.cn-north-4.myhuaweicloud.com:443/MachineLearning/wine.zip (4 kB)

file_sizes: 100%|██████████████████████████| 4.09k/4.09k [00:00<00:00, 2.51MB/s]
Extracting zip file...
Successfully downloaded / unzipped to ./

4.2 Lectura y procesamiento de datos

Importar módulo MindSpore y módulo auxiliar

Antes de generar datos, importe las bibliotecas de Python necesarias.

La biblioteca del sistema operativo se utiliza actualmente. Para facilitar la comprensión, explicaremos otras bibliotecas requeridas cuando se utilicen específicamente.

Se pueden buscar descripciones detalladas del módulo MindSpore en la página API de MindSpore.

Puede configurar la información requerida para la operación a través de context.set_context, como el modo de operación, información de backend, hardware y otra información.

Importe el módulo de contexto y configure la información necesaria para su funcionamiento.

  1. %matplotlib inline
  2. import os
  3. import csv
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import mindspore as ms
  7. from mindspore import nn, ops
  8. ms.set_context(device_target="CPU")
Referirse acontexto_establecido_mente ,dispositivo_objetivo (cadena): representa el dispositivo de destino que se ejecutará y admite 'Ascend', 'GPU' y 'CPU'. Si este parámetro no está configurado, se utiliza el dispositivo backend correspondiente al paquete MindSpore. Esto también se puede configurar en Ascend en el entorno experimental.

Leer conjunto de datos de vinowine.datay ver algunos datos.
  1. with open('wine.data') as csv_file:
  2. data = list(csv.reader(csv_file, delimiter=','))
  3. print(data[56:62]+data[130:133])
[['1', '14.22', '1.7', '2.3', '16.3', '118', '3.2', '3', '.26', '2.03', '6.38', '.94', '3.31', '970'], ['1', '13.29', '1.97', '2.68', '16.8', '102', '3', '3.23', '.31', '1.66', '6', '1.07', '2.84', '1270'], ['1', '13.72', '1.43', '2.5', '16.7', '108', '3.4', '3.67', '.19', '2.04', '6.8', '.89', '2.87', '1285'], ['2', '12.37', '.94', '1.36', '10.6', '88', '1.98', '.57', '.28', '.42', '1.95', '1.05', '1.82', '520'], ['2', '12.33', '1.1', '2.28', '16', '101', '2.05', '1.09', '.63', '.41', '3.27', '1.25', '1.67', '680'], ['2', '12.64', '1.36', '2.02', '16.8', '100', '2.02', '1.41', '.53', '.62', '5.75', '.98', '1.59', '450'], ['3', '12.86', '1.35', '2.32', '18', '122', '1.51', '1.25', '.21', '.94', '4.1', '.76', '1.29', '630'], ['3', '12.88', '2.99', '2.4', '20', '104', '1.3', '1.22', '.24', '.83', '5.4', '.74', '1.42', '530'], ['3', '12.81', '2.31', '2.4', '24', '98', '1.15', '1.09', '.27', '.83', '5.7', '.66', '1.36', '560']]
取三类样本(共178条),将数据集的13个属性作为自变量𝑋。将数据集的3个类别作为因变量𝑌。
  1. X = np.array([[float(x) for x in s[1:]] for s in data[:178]], np.float32)
  2. Y = np.array([s[0] for s in data[:178]], np.int32)
Tome dos atributos de la muestra para una visualización bidimensional y podrá ver la distribución y separabilidad de la muestra en los dos atributos.
  1. attrs = ['Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols',
  2. 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue',
  3. 'OD280/OD315 of diluted wines', 'Proline']
  4. plt.figure(figsize=(10, 8))
  5. for i in range(0, 4):
  6. plt.subplot(2, 2, i+1)
  7. a1, a2 = 2 * i, 2 * i + 1
  8. plt.scatter(X[:59, a1], X[:59, a2], label='1')
  9. plt.scatter(X[59:130, a1], X[59:130, a2], label='2')
  10. plt.scatter(X[130:, a1], X[130:, a2], label='3')
  11. plt.xlabel(attrs[a1])
  12. plt.ylabel(attrs[a2])
  13. plt.legend()
  14. plt.show()

A partir del código, se estima que las primeras 59 muestras pueden pertenecer a la categoría 1, de 59 a 130 pueden pertenecer a la categoría 2 y las muestras restantes pueden pertenecer a la categoría 3.

Desde la visualización gráfica, los dos efectos de clasificación de atributos en la esquina superior izquierda y la esquina inferior derecha del gráfico son relativamente buenos, especialmente los límites entre las categorías 1 y 2 son relativamente obvios.

El conjunto de datos se divide en un conjunto de entrenamiento (muestras de categorías conocidas) y un conjunto de validación (muestras a verificar) a las 128:50:
  1. train_idx = np.random.choice(178, 128, replace=False)
  2. test_idx = np.array(list(set(range(178)) - set(train_idx)))
  3. X_train, Y_train = X[train_idx], Y[train_idx]
  4. X_test, Y_test = X[test_idx], Y[test_idx]

Obtener test_idx = np.array(list(set(range(178)) - set(train_idx)))
1. range(178) genera una secuencia de números enteros del 0 al 177.
2. set(range(178)) convierte esta secuencia de números enteros en un conjunto. Un conjunto es una estructura de datos que no permite elementos repetidos y admite operaciones de conjuntos eficientes (como unión, intersección, diferencia, etc.).
3. set(train_idx) convierte la lista de índice del conjunto de entrenamiento train_idx seleccionada aleatoriamente en un conjunto.
4. set(range(178)) - set(train_idx) calcula la operación de conjunto de diferencias del conjunto y obtiene los elementos que están en set(range(178)) pero no en set(train_idx), que son los índices del equipo de prueba. Esta es una operación establecida que puede calcular rápida y eficientemente los elementos de diferencia.
5. list(...) convierte el resultado de la operación de diferencia nuevamente en una lista.
6. np.array(...) convierte esta lista en una matriz numpy para indexar con matrices numpy X e Y

 

5. Construcción del modelo: calcular la distancia.

Aprovecha lo que ofrece MindSporetile, square, ReduceSum, sqrt, TopKy otros operadores, calculan simultáneamente la distancia entre la muestra de entrada x y otras muestras claramente clasificadas X_train mediante operaciones matriciales, y calculan los k vecinos más cercanos superiores

  1. class KnnNet(nn.Cell):
  2. def __init__(self, k):
  3. super(KnnNet, self).__init__()
  4. self.k = k
  5. def construct(self, x, X_train):
  6. #平铺输入x以匹配X_train中的样本数
  7. x_tile = ops.tile(x, (128, 1))
  8. square_diff = ops.square(x_tile - X_train)
  9. square_dist = ops.sum(square_diff, 1)
  10. dist = ops.sqrt(square_dist)
  11. #-dist表示值越大,样本就越接近
  12. values, indices = ops.topk(-dist, self.k)
  13. return indices
  14. def knn(knn_net, x, X_train, Y_train):
  15. x, X_train = ms.Tensor(x), ms.Tensor(X_train)
  16. indices = knn_net(x, X_train)
  17. topk_cls = [0]*len(indices.asnumpy())
  18. for idx in indices.asnumpy():
  19. topk_cls[Y_train[idx]] += 1
  20. cls = np.argmax(topk_cls)
  21. return cls

1. Defina la clase de red KNN: KnnNet
Función __init__: inicializa la red y establece el valor K (es decir, el número de vecinos más cercanos seleccionados).
Función de construcción: calcula la distancia euclidiana entre la muestra de entrada x y cada muestra en el conjunto de entrenamiento X_train, y devuelve el índice de las k muestras (es decir, el vecino más cercano) con la distancia más pequeña.
2. Defina la función KNN: knn
Recibe knn_net (instancia de red KNN), muestra de prueba x, muestra de entrenamiento X_train y etiqueta de entrenamiento Y_train como entrada.
Utilice knn_net para encontrar las k muestras vecinas más cercanas de x, clasificarlas según las etiquetas de estas muestras y devolver el resultado de la clasificación (es decir, la categoría predicha).

 

6. Predicción del modelo

在验证集上验证KNN算法的有效性,取𝑘=5,验证精度接近80%,说明KNN算法在该3分类任务上有效,能根据酒的13种属性判断出酒的品种。

  1. acc = 0
  2. knn_net = KnnNet(5)
  3. for x, y in zip(X_test, Y_test):
  4. pred = knn(knn_net, x, X_train, Y_train)
  5. acc += (pred == y)
  6. print('label: %d, prediction: %s' % (y, pred))
  7. print('Validation accuracy is %f' % (acc/len(Y_test)))

Calcule e imprima la precisión del conjunto de prueba.
Recorra cada muestra en el conjunto de pruebas X_test e Y_test, y use la función knn para clasificar cada muestra.
Las estadísticas predicen la cantidad de muestras correctas, calculan y generan la precisión de la clasificación.

label: 1, prediction: 1
label: 2, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 2
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 2
label: 1, prediction: 2
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 2
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 3
label: 3, prediction: 1
label: 3, prediction: 2
label: 3, prediction: 2
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 2
label: 1, prediction: 3
label: 3, prediction: 1
label: 3, prediction: 3
label: 3, prediction: 1
label: 3, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 1
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
Validation accuracy is 0.660000

No es posible alcanzar el 80% cada vez. Después de intentarlo muchas veces, la precisión finalmente alcanzó el 80%:

label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 3
label: 3, prediction: 3
label: 3, prediction: 2
label: 3, prediction: 3
label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 3
label: 3, prediction: 3
label: 1, prediction: 3
label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 3, prediction: 3
label: 3, prediction: 3
label: 3, prediction: 2
label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 3, prediction: 3
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 1, prediction: 1
label: 2, prediction: 3
label: 2, prediction: 1
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 2
label: 2, prediction: 3
label: 2, prediction: 2
Validation accuracy is 0.820000

Resumen del experimento

Este experimento utiliza MindSpore para implementar el algoritmo KNN para resolver el problema de 3 clasificaciones. Tome los 3 tipos de muestras en el conjunto de datos de vino y divídalos en muestras de categorías conocidas y muestras para verificar. A partir de los resultados de la verificación, podemos ver que el algoritmo KNN es efectivo en esta tarea y puede determinar la variedad de vino en función de. 13 atributos del vino.

Preparación de datos: descargue datos del sitio web oficial del conjunto de datos de Wine o de Huawei Cloud OBS, léalos y procéselos.

Procesamiento de datos: divida el conjunto de datos en variables independientes (13 atributos) y variables dependientes (3 categorías) y visualícelas para observar la distribución de la muestra.

Construcción del modelo: defina la estructura de la red KNN, utilice el operador proporcionado por MindSpore para calcular la distancia entre la muestra de entrada y la muestra de entrenamiento y encuentre los k vecinos más cercanos.

Predicción del modelo: haga predicciones sobre el conjunto de validación y calcule la precisión de la predicción.

Los resultados experimentales muestran que la precisión de clasificación del algoritmo KNN en el conjunto de datos de Wine es cercana al 80% (66%).