Cuente Scoring de la Fer o un estudio sobre calificación crediticia como parte de la ampliación de los horizontes. Parte 3

Parte tres, en la que Athos precipitó, y el Conde de la Fer es sabio con los algoritmos.


UPD Part One está aquí
UPD parte dos aquí


AntipovSN y MihhaCF


Introducción de los autores:


Buenas tardes Hoy continuamos con la serie de artículos dedicados a la puntuación y al uso de la teoría de grafos en ella. Puede familiarizarse con el primer y segundo artículo aquí y aquí, respectivamente. Recomendamos encarecidamente, de lo contrario, este artículo puede parecer un experimento sin sentido con algoritmos.


Todas las alegorías cómicas, inserciones, etc., están diseñadas para aliviar ligeramente la narrativa y no permitir que caiga en una conferencia aburrida. Pedimos disculpas a todos los que no entienden nuestro humor


El propósito de este artículo: en no más de 30 minutos, describa el algoritmo de construcción del gráfico y calcule el puntaje de puntuación para NPO "One for All".


Términos y definiciones:


  • Algoritmo de búsqueda de profundidad primero (DFS) : la estrategia de búsqueda de profundidad, como su nombre lo indica, es ir "más profundo" en el gráfico lo más lejos posible. El algoritmo de búsqueda se describe de forma recursiva: clasificamos todos los bordes que provienen del vértice en cuestión. Si el borde conduce a un vértice que no se consideró anteriormente, ejecutamos el algoritmo desde este vértice no examinado, y luego regresamos y seguimos clasificando los bordes. El retorno ocurre si no hay bordes en el vértice en consideración que conducen al vértice no examinado. Si, después de completar el algoritmo, no se consideraron todos los vértices, entonces es necesario ejecutar el algoritmo desde uno de los vértices no examinados
  • Recursión : llamar a una función (procedimiento) desde ella misma, directamente (recursión simple) o mediante otras funciones (recursión compleja o indirecta)

En nuestro primer artículo ( aquí ), determinamos el modelo gráfico con el que experimentaremos y le proporcionamos una breve descripción.


En nuestro segundo artículo ( aquí ), describimos las estructuras básicas de datos que se pueden usar para almacenar un gráfico y describimos con más detalle el modelo de gráfico y cómo trabajar con él.


Es hora de sacar la espada de su vaina y comenzar a apuñalar a todos, más precisamente, crear un algoritmo para calcular el puntaje de puntuación para NPO "One for All".


Vamos!


El algoritmo se ejecutará en Python . Como dicen, ¡jala la serpiente de la espada!


El gráfico se almacenará en el diccionario de la siguiente manera:


graph = { 'Odin_za_vseh' : {'goody': 10, 'rank': 4, 'fund':4, 'relations':{'Bonasye':3, 'Trevi': 1, 'Gusak':2,'Suchka':5, 'Roshfor':1, 'Cardi':1}}, 'Cardi' : {'goody': -8, 'rank': 9, 'fund':8, 'relations':{'Korol':2,'Odin_za_vseh':3,'Gvardia':5, 'Roshfor':5 }}, 'Roshfor' : {'goody': -7, 'rank': 7, 'fund':5,'relations':{'Cardi':1, 'Suchka': 3,'Odin_za_vseh':2, 'Bonasye':5 }}, 'Suchka' : {'goody': -10, 'rank': 4, 'fund':4, 'relations':{'Odin_za_vseh':5,'Roshfor':3 }}, 'Gvardia' : {'goody': -5, 'rank': 3, 'fund':4, 'relations':{'Cardi':1,'Gusak':1 }}, 'Gusak' : {'goody': -7, 'rank': 4, 'fund':4, 'relations':{'Gvardia':5,'Odin_za_vseh':2 }}, 'Trevi' : {'goody': 7, 'rank': 5, 'fund':5, 'relations':{'Odin_za_vseh':4,'Mushketery':5 }}, 'Bonasye': {'goody': -2, 'rank': 2, 'fund':3, 'relations':{'Odin_za_vseh':1,'Roshfor':1,'Konsta':2 }}, 'Konsta' : {'goody': 10, 'rank': 5, 'fund':3, 'relations':{'Koroleva':2,'Bonasye':1 }}, 'Mushketery' : {'goody': 7, 'rank': 5, 'fund':4, 'relations':{'Korol':1, 'Trevi':1}}, 'Koroleva' : {'goody': 6, 'rank': 8, 'fund':7, 'relations':{'Korol':2,'Konsta':5, 'EnglishMan':3 }}, 'Korol' : {'goody': 5, 'rank': 10, 'fund':10, 'relations':{'Cardi':3, 'Koroleva':5,'Mushketery':5 }}, 'EnglishMan' : {'goody': 5, 'rank': 8, 'fund':10, 'relations':{'Koroleva':2}} } 

'goody' - calificación del nodo - bueno o malo y el grado de "prioridad" del nodo. Por ejemplo, el Cardenal es un héroe negativo de la película, por lo que su calificación es negativa. El Cardenal es uno de los enemigos clave de nuestros héroes, pero no el más importante (así lo decidimos).
'rank' : puntuación del nodo en la tabla de clasificación
'fondo' - viabilidad de nodo
'relaciones' : con quién está conectado y cuánto puede influir en el nodo conectado con él


Hasta ahora, todo es simple, pero un lector atento ya podría notar algunas de las características, sí, ya surgen cuestiones de contenido. Tratemos de predecirlos y responderlos. ¡El derecho de la primera inyección es nuestro!


  1. Creo que no vale la pena explicar qué usamos para el nombre de la clave del diccionario de primer nivel. Sin embargo, ya has adivinado perfectamente que algunos nombres han sufrido cambios debido a nuestra percepción del trabajo.


  2. ¿De dónde provienen estos parámetros ('goody', 'rank', etc.), por qué son y de dónde provienen sus calificaciones?
    En orden:


    • En la vida real, estos parámetros caracterizarán una empresa de nodo particular. Para todos los que realizarán la evaluación y dependiendo del tipo de esta evaluación, estos parámetros serán diferentes. Por ejemplo, dichos parámetros para evaluar la calificación de un prestatario pueden ser: rotación, cantidad de cuentas por pagar / por cobrar, orden de ejecución, etc.
    • ¿Por qué exactamente? El autor lo ve así))) estos parámetros reflejan la esencia de lo que el Conde describe, en nuestra opinión
    • La evaluación es, como dicen ahora, experta. En la vida real, esta estimación se obtendrá a través de la minería. Escribiremos más sobre esto en el próximo artículo.

  3. ¿Por qué algunos nodos tienen enlaces recíprocos diferentes (por ejemplo, Odin_za_vseh - Bonasye = 3 y Bonasye - Odin_za_vseh = 1)? Esto se debe a que Odin_za_vseh tiene un efecto mucho mayor en Bonasye que viceversa. Y esto es importante de entender. Al puntuar Odin_za_vseh, tendremos que considerar el efecto de Bonasye en Odin_za_vseh.


  4. ¿Qué es un puntaje de bonos y cómo se calcula?


    • La evaluación de la comunicación es una medida de la influencia de un nodo en otro
    • Cada conexión en nuestro gráfico es bidireccional, pero al mismo tiempo, la evaluación de la comunicación en diferentes direcciones puede variar.
    • El puntaje de comunicación es un valor de 1 a 5 (de 1 a 5 solo por ejemplo). No puede haber una conexión negativa, porque el nodo está conectado a otro y evaluamos cuánto afecta a este nodo o no está conectado. En este caso, por supuesto, la conexión con un nodo poco confiable será en última instancia negativa para el nodo que estamos evaluando, porque Este nodo poco confiable tendrá una calificación interna negativa.
    • Una evaluación interna de un nodo es un valor agregado que consiste en los parámetros internos de un nodo. En nuestro ejemplo, esto es 'goody', 'rank', 'fund'. La calificación interna puede ser negativa.

  5. ¿Cómo se considerará una bola de puntuación?


    • Cada empresa que utilizará este enfoque puede establecer su cálculo de puntaje de puntuación en función de sus requisitos y su experiencia comercial.
    • En nuestro caso, elegimos una forma simple e intrincada:
      • Puntaje de puntaje = Puntaje interno del nodo que estamos evaluando + Suma (Evaluación interna de un nodo secundario de nivel 1 que evalúa el impacto de este nodo en el nodo que se está evaluando) + (Suma (Calificación interna de un nodo secundario de nivel 2 que evalúa el efecto de este nodo en un nodo primario de nivel 1) / 2)
      • Si obtiene un puntaje negativo, entonces no le damos un préstamo
    • El algoritmo presentado a continuación es básico y puede modificarse fácilmente para adaptarse a cualquier técnica de cálculo de puntaje de puntuación.
    • Toda la dificultad estará en la minería "correcta", pero se describirá en el próximo artículo


Y aquí está el algoritmo en sí:


 searched=[] #   def search_outer(name,n): return graph[name]['goody']*graph[name]['rank']*graph[name]['fund']+search(name,n) # search_outer()    ,       #,       search() #name –   ,     #n –   –       def search(name, n, z=1): ball=0 #,      global searched #    if z <= n and name not in searched: #        searched.append(name) for x in graph[name]['relations']: #   ball += graph[x]['goody'] * graph[x]['rank'] * graph[x]['fund'] * graph[x]['relations'][name] / z + search(x,n,z+1) #      #   ,     return ball #, ,     def main(): ball = search_outer ('Odin_za_vseh', 2) print(ball) if __name__ == '__main__': main() 

Para resumir:


  • Estoy seguro de que leer el artículo no tardó más de 30 minutos
  • Calculamos el puntaje de puntuación para NPO One for All. No damos crédito, NPO "One for All" resultó ser esos aventureros con un montón de enemigos. Podemos dar crédito a los empleados estatales, por ejemplo, 'Mushketery'
  • El algoritmo resultó ser simple y bastante efectivo.
  • La complejidad computacional es O (N ** d + 1), donde d es el número de niveles. Visualmente, el algoritmo se muestra en la figura a continuación.

imagen


Gracias a sobolevn y su artículo.


Puede pasar a lo más interesante y difícil: ¡la minería de datos!


PD Con respecto a los enlaces a otros artículos con teoría (en un artículo anterior, hicimos un comentario):


Source: https://habr.com/ru/post/465927/


All Articles