|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Nebire
Páginas: 1 ... 19 20 [21] 22 23 ... 29
501
« en: Lunes 16 de Junio de 2008, 23:40 »
estás diciendo que te vas a encargar de ir revisando todos los mensajes, a ver cuantas personas respaldan la creacion de cada foro ... ... Pues ole tus webos. Creo que solocodigo tiene las cosas mejor pensadas de lo que ha dicho. sin embargo para facilitar la tarea si podría ser bueno crear en esta misma sección un tema titulado algo así como: 'Quiero que exista un foro dedicado a....' y en el que el proponente expone sus razones el cómo y donde de crear el foro y se abre como una encuesta, en el que necesariamente aprte de preguntar 'te gustaría que hubiera un foro 'tal'' además se indicara 'participaré', no participaré pero leeré', etc... Así al centralizar todos estos mensajes solocodigo podría acceder a ello sin tener que 'leer todos los mensajes y contar los interesados'...
502
« en: Lunes 16 de Junio de 2008, 23:14 »
Yo me decantaría por colores marrones, desde el color de la arena hasta el color 'tabaco' oscuro. En cualuqier caso sería bueno contar con varios colores donde elegir y desde perfil de usuario decidir el que quieres, de modo que una vez seleccionado uno cuando te loguees sea ese elegido el que aparezca en el aspecto del foro, por supuesto lógicamente de entrada habría uno por defecto.
Naturalmente si solocodigo se lo quiere trabajar un poco más...
503
« en: Lunes 16 de Junio de 2008, 22:55 »
Lo que hacel el 'txthota_keyup...' es que al pulsar la tecla se ejecuta una función, dicha función en todos esos ejemplos es la de seleccionar el contenido que hay dentro de él... así si se quiere borrar el usuario ya sólo tiene que pulsar la tecla 'suprimir' (por ejemplo), l oque supone un atajo. ´
Es un mecanismo de selección, algo así como si al aproximarnos a una puerta esta detecta nuestra presencia y se abre sin necesidad de actuar con la mano directamente sobre el mecanismo de apertura. De giaul modo cuando gana el foco de atención (en los controles que tiene gotfocus) o cuando se pulsa dentro del objeto, se selecciona utomáticamente todo el texto que contiene.
504
« en: Lunes 16 de Junio de 2008, 22:30 »
Yo solo te he indicado lo que veo en el cóodigo.
Sobre mastermind, no he dicho nada, tú eres quien habla de ello.
Si en vez de decir vaguedades fueras claro .... entonces se te podría orientar mejor, pero con vaguedades y generalidades no se puede hacer nada.
505
« en: Sábado 14 de Junio de 2008, 16:31 »
Estás intentando hacer ¿asignaciones? o declaraciones en una miss ma línea de forma múltiple. si es lo 1º en VB.6 eso no es la forma sino a través de un bucle For k= 1 to 4 txtn(k).text =left$(strn, len(val(txtnumero))) next
Como vez txtn es ahora una matriz de controles si no deseas que sea así deberás hacer la asignación manualmente uno a uno, por ejemplo txtn1.text =left$(strn, len(val(txtnumero))) txtn2.text=txtn1.text ... ...
Si en cambio lo que pretendías hacer no eran asginaciones múltiples sino declaraciones múltiples, eso si es posible pero en la misma línea no puede ir otro tipo de 'tratamiento' todo esto es válido: dim s,b,c,d,e 'todas son variants dim f,g,h,i,j as integer ' excepto j las demás son variants dim t as integer, s as string, v as single
entonces en la línea: señala que tipo de instrucción es si son declaraciones precédelas de un 'dim' y especifica el tipo de declaración para cada una. Si son controles ya estan declaradas en el formulario y entonces parecer que intentas hacer asignaciones, debes hacerlo uno a uno o hacer una matriz con ellos y asignarles el valor como se indica más arriba. Si son declaraciones y la última además (o a todas) se le asigna un valor, primero debes declarala, y luego asignarles el valor. En vb6.0 no se permite asignar valor directamente en la declaración, todas las variables se asignan a su valor por defecto al ser creadas.
506
« en: Viernes 13 de Junio de 2008, 04:51 »
Ya he hecho un par de esquemas, mañana veré si le doy un retoque. El fin de semana veré si instalo el escáner y subo una de las imágenes y la comento, también he empezado a hacer una clase para ese primer diagrama...
Ahora la duda que tengo es si interesara más hacerlo todo en forma de manual que no a golpe de mensaje, pués la verdad que cuando maduras los conceptos queda más nítido que cuando lo vas 'soltando' sobre la marcha...
507
« en: Viernes 13 de Junio de 2008, 04:41 »
Si cuando instalas el S.O. tienes conectado algo al USB. ya no lo toma (al menos el XP) como una unidad extraíble, sino que la incorpora como si fuera hardware nativo. Posteriormente un extracció no segura hace que el 'se pierda'.
La solución que yo encontré y que a mi me funcionó fue conectar a dicho USB otro USB de expansión con diferentes tomas adicionales al que conecté el pendrive, eso al parecer le obligó al plug and play a ponerse las pilas y reconocer el hardware conectado al terminal, luego retiré de modo seguro la extensión y al conectar el pendrive, nuevamente al extremo que acaba de ser desconectado la extensión ya lo reconoció como unidad extraíble.
Lo que ignoro es si ese es tambie´n tu caso, es decir cuando instalaste el S.O. tenías algo conectado al USB ???, sí sí, intenta lo que te he descrito...
También es posible que dependa del equipo, esto es ¿ que tiene el BIOS indicado hacer respecto al 'plug&play'. ?
508
« en: Viernes 13 de Junio de 2008, 03:51 »
jajaja... que malo eres con tu primo, de verdad que podías haber elegido sino otra rama si al menos otro tipo de negocio, quizás un producto antiplagas a base de vinagre y limón, que se yo...
Además si os asociais es seguro que sacareis más rendimiento pero no en la forma Windowsero & Avelino si no que el negocio sea común pero manteniedo tanto los nombres de los productos como el lugar de fabricación y envasado qye teneis ahora. Que la gente no se dé cuenta que estais asociados, así cuando alguien se vaya de tu (vuestro) fertilizante al de Avelino en realidad se va de tu fertilizante a tu fertilizante y al revés cuando alguien se pase del fertilizante de Avelino al tuyo sin saberlo sigue estando en vuestro negocio, 2 productos diferentes, 2 'fábricas' diferentes pero una misma corporación con 2 sociedades aparentemente distintas y sin nada que ver entre si.
Además para mantener las apariencias podeis seguir manteniendo el paripé de que os llevais mal.
Y esto te lo digo porque a la larga posiblemente tu eres el que tenga más que perder llegado el momento en que a tu amigo 'el rana' le desaparezca la concesión y varíen significativamente las condiciones en que lleve su negocio de reciclaje. Por eso tienes una postura inmejorable para negociar ahora con tu primo una copropiedad de ambos negocios, si en el futuro tu fertilizante no se compensa por el tema del reciclaje ya tu primo no podrá desbancarte porque seguiríais siendo socios.
Es inteligente derrotar a tu enemigo, pero es más inteligente hacer que tu enemigo sea tu amigo y te ayude.
Bueno no se si podrás transmitirlo al blog ese.... así que conste aquí.
509
« en: Viernes 13 de Junio de 2008, 03:28 »
Llevo programando por mi cuenta desde hace ya bastantes años. ..
Llevo empezados varios proyectos que están a medio acabar, todos bastante originales, .... todo por amor al arte, porque no trabajo programando desde hace años. ...
Y... no termino ninguno. jajajja... es cierto Yo tengo lo menos un centenar de proyectos que nunca termino, normalmente por falta de tiempo. Uno en especial versaba sobre predicción de resultados de loterías, no fuí realista en su momento y el volumen de datos que arrojó fue intratable, pués me generó más de 40Gb. cuando los discos duros tenían entre 200 y 500Mb. con lo que tuve que recurrir a fuertes técnicas de compresión y al fin lo pude apilar en varios CDs, aunque hube de esperar casi 3 años. Luego empezaba una etapa de escrutinio (más bien de selección), encontré otro problema el tiempo que demoraba en analizar una fase duraba 1 semana y se componía de 120, es decir necesitaba más de 2 años 24 horas al día de dedicación exclusiva para terminarlo, así lo dejé por un tiempo (en realidad unos años).... lo retomé por el año 2002 y bueno ya había progresado todo tanto los discos duros que ya los había entre 20 y 60Gb. la memoria que ya se manejaba entre 32 y 256 Mb. y los procesadores que ya funcionaban entre 1'3 y 1'7 Gh. entonces el calculo me demoró sólo 2 semanas, la última etapa requería aun más potencia de análisis por l que a fecha de hoy todavía es intratable aunque recientemente lo retomé para portarlo a VS 2008, este es sin duda el proyecto que más tiempo tengo sin terminar pués va camino de 15 años... y lo peor es que posiblemente al final no sirva absolutamente para nada. No obstante no cuentes los proyectos sin terminar, sino los que terminaste. Yo me he dado cuenta que los que realmente no termino son proyectos que hago exclusivamente para mi, supongo que caemos en la confianza, de 'bah... ya lo terminaré en otro momento que ahora me corre prisa esto otro' y en casa del herrero...
510
« en: Viernes 13 de Junio de 2008, 02:52 »
Espero que mi opinión no le lleve a nadie a enfrentamientos de tipo personal.
Tal como yo veo a Chávez, creo que es un ignorante magalómano, un déspota y mafioso.
Creo firmemente que ha urdido planes con las FARC con el propósito de 'expandir' su propaganda a Colombia y especialmente en contra de Uribe.
Creo firmemente que éste hombre sufre el síndrome de Eróstrato, cometió un golpe de estado a principios de los 90, y a fecha de hoy después de ese 'referéndum' para autoproclamarse poco menos que 'Dios' estoy conencido que mira el modo en que pueda eludir la propia ley que dice que debe abandonar el gobierno finalizado el plazo máximo.... pero no creo que se vaya así sin más, cuando lo haga si es que lo hace lo hará con el mayor ruido posible.
Para mi es el ejemplo ciego que trato de no usar, cuando uno piensa en un venezolano. Obviamente existe el error (especialmente entre personas menos cultas) de establecer la correlación de que ciertas personalidades son representativos de las personas de su país y a menudo me encuentro teniendo que defender a los venezolanos de la visión que la gente por esa causa establecen a un venezolano achacándole las personalidad de Chávez, que quizás compartan muchos pero que no puede hacerse extensiva.
Chávez es un corrupto, que lava la cara ante la mayoría pobre con gestos absurdos que no corresponden a polítcos. Las labores de arreglar la casa a una ancianita correponden en todo caso a los ciudadanos de su comunidad, pero todo dictador que se precie usa ese socorrido recurso de querer parecer humano preocupándose por minucias y dejando de lado los grandes problemas que son los que de verdad debe solucionar dado el cargo que ocupa. Es como si un médico en un hospital con todo el trabajo y todas las urgencias se distrayera curando el arañazo que un camarero se ha hecho con la uña dedicándole toda una mañana.
Lo peor de un líder corrupto no es que él lo sea sino que es simiente abonando todo el 'campo' entre aquellos que debajo de él lo toman como ejemplo a seguir, es decir Venezuela padecerá las secuelas hasta que logre desembarazarse la estirpe de corruptela que bajo Chávez van tomando pulso. Cuando un corrupto deja el poder para siempre, pasan al menos 20 años hasta que todo su legado de ciorruptela sucumbe.
Chávez está ejerciendo el mismo absolutismo que los 'jeques' de los países árabes: sus países rebosantes de petróleo, sus jeques rebosantes de riquezas, los hijos de los jeques con los vehículos más caros y una colección de hasta 30-50, sus inmediatos posedores de tierras y negocios, pero mientras el pueblo es pobre y se le acuña la idea de que la culpa es de otros, de otras culturas, de occidente...
p.d.: eso por no mencionar que incita al odio entre gentes que compartimos hasta la sangre... aunque seamos de distintos países.
511
« en: Viernes 13 de Junio de 2008, 02:02 »
Hola.
No está bien solicitar que se expliquen las funciones que están perfectamente documentadas. Con ello sólo demuestras tu vagancia para pulsar F1 y leer o para abrir una ventana de internet y buscar dicha función.
Cuando necesites informarte de una función que sea porque esté poco documentada o porque sea realmente compleja de entender.
El foro está para ayudar a solucionar problemas, no para hacer lo que tú debes hacer por tí mismo. Documentarte sobre una función como Mid$ es una tarea asequible a cualquiera que tenga 2 dedos de frente por muy novato que se sea.
Usa el foro con cierta responsabilidad y menos vagancia.
512
« en: Jueves 12 de Junio de 2008, 16:33 »
Faltan detalles para señalarte la solución más óptima, por ejemplo ¿ cual es el origen de los datos ?.... se introducen manualmente ?, ¿se toman desde un fichero? , ¿ son el resultado de un cálculo...?. Si se introducen manualmente, ances de aceptar el dato se valida con la condición que quieres que cumpla si lo pasa se añade y si no no. si se introducen desde fichero, se filtran a medida que se leen. Si proceden de un cálculo, se guardan en una matriz y luego en un bucle 'FOR ... NEXT' se examina todo el bucle. Cuando ya estén filtrados se vuelcan al listbox o combobox. Si sólo son dos columnas y especialmente si son de diferente tamaño y no guardan relación entre si, los controles listbox ó combobox son los recomendados. Dicho de otro modo, lo acorde es que los datos se vayan filtrando a medida que se vayan obteniendo, sin embargo podría darse el caso de que quieras ver el 'resultado' de lo que sea que estés haciendo, antes y después (sólo es práctico para este caso). En cuyo caso entonces se deberá trabajar directamente sobre el listbox/combobox. Cuando se necesita recorrer estos objetos para eliminar elementos (listbox1.remove()) debe iniciarse el bucle desde el final hacia el primero. Imagina un bloque de pisos de 10 alturas, deseamos eliminar el ubicado como 3º porque cumple una condición, lógicamente luego comprobaremos el 4º, pero si elimino el piso 3º, los que están encima bajan todos una posición, así el 4º pasa a ser el 3º, puesto que estamos usando un bucle se apuntaría luego al 4º que sería el que antes era el 5º, pués el 4º de antes es ahora el 3º..... Si a pesar de ello quieres hacer la cuenta hacia delante, no debes usar un bucle 'for ... next' sino un bucle 'do ... loop' de tal modo que cuando eliminas un elemento, el puntero no se aumenta, esto exige entonces tener 2 punteros uno de avance y otro de eliminados, cuya suma siempre se usa para verificar la condición de final del bucle cuando sumen el total de elementos previos, es decir si 'n' era el total de elementos 'a' el puntero de avance y 'e' la cuenta de eliminados la condición final sería: 'while (a + e) <> n ' ó usando until: 'until (a + e ) = n' . en cualquier caso el bucle 'do ... loop' así formado es más complejo que un simple 'for ...next' con cuenta regresiva. No olvides inicializar 'a' y 'e' a los valoes acordes teniendo en cuenta el indice 0 del listbox. Si usas matrices y señalaste que la matriz se iniciaba en el índice 1 y conviertes la función para usarla con índice 0 siempre hay que tener en cuenta esto y acordarse de hacer los 'reajustes' necesarios. Si usas matrices, puedes o bien añadir los elementos a una 2ª matriz, o volcarlos ya directamente al listbox. Pero como digo el método más provechoso se elige conforme al origen de procedencia de los datos. Si las matrices son pequeñas (pongamos 1000 elementos, incluso 10000) no tiene ninguna repercusión en el rendimiento que se vuelque entre 2 matrices antes de ir a parar al listbox o que se vuelque desde el listbox a una matriz y luego al listbox, salvo que la operación se repita muy a menudo (si sólo se ejecuta 1 vez no importa) ... Para resolver los numeros consecutivos , debes comparar el ultimo elemento con el anterior (usando el bucle for con cuenta regresiva). Un número es consecutivo de otro si sumándole 1 es igual a aquel, pero como usas tanto positivos como negativos primero debes saber que sumar si -1 o +1, además parece que al hablar de consecutivos (según tu ejemplo) los positivos son ascendentes y los negativos descendentes, no se si eso es realmente lo que quieres hacer es decir cual de estos casos es válido: 1,2,3,4,5 .... 9,8,7,6,5 ... -3,-4,-5,-6 ... -8,-7,-6,-5, ya que según el caso no será necesario sumar -1 sino sólo +1; 6+1=7 ; -5 +1=-4 ... Ten en cuenta que al hacer cuenta regresiva se supone que primero aparecerá 9 luego 8 y luego 7 cuando el orden real es 7,8,9 por tanto la lógica de decisión debe ser: si el (valor del puesto del 8) +1 <> del (valor del puesto del 9) luego eliminar puesto del valor del 9 fin si ahora asigna como 2º término el valor del 1º
El código para eliminar los 0 consecutivos no superiores a x , podría ser éste: ' nota: repeticiones es el valor x de límite de consecutivos. public sub Eliminar_Ceros(repeticiones as integer) dim ceros as integer dim nuevaCuenta as boolean for k =listbox1.listcount -1 to 0 step -1 if listbox1.list(k) = 0 then if nuevacuenta=false then nuevacuenta=true end if ceros=ceros +1 else if ceros <= repeticiones then call Eliminar_Items(k,repeticiones) end if ceros=0 nuevaCuenta=false end if next end sub private sub Eliminar_Items(IndiceFin as integer, NumeroItems as integer) for k= (indicefin + repeticiones) to (IndiceFin +1) step -1 listbox1.remove(k) next end sub
Revisa que funciones bien y corrige algún gazapo que se me haya escapado... el otro es ejercicio para ti....
513
« en: Jueves 12 de Junio de 2008, 00:31 »
Un curso solo aprovecha a los 4 que se apunten. Un tutorial aprovecha a mucha más gente de la que tu puedas imaginar. Años después tu tutorial puede seguir dando vueltas por el mundo e incluso haber sido traducido a otros idiomas.
Como ya se te indicó, si realmente quieres ayudar a la gente, haz un tutorial paso a paso y refiere un foro o chat donde se te puedan dirigir preguntas.
... y si no tienes tiempo para nada, simplemente pasa de cuando en cuando por el foro y contesta las dudas de la gente que se pasa por el foro de videojuegos...
514
« en: Martes 10 de Junio de 2008, 15:06 »
Algunos programas registran el último archivo al que accedieron para en la próxima sesión 'recordarlos' a consecuencia de ello escriben en el registro y si el archivo fué bloqueado no puede ser abierto sin ser desbloqueado.
La forma más fácil es abrir la aplicación que bloqueó el archivo y cargar otra imagen distinta (que no necesites), entonces se desbloquea la anterior.
Si no recuerdas qué programa fue (incluso has podido bloquearla tú al tratar de manipularlo anteriormente) simplemente cierra sesión de usuario y vuelve a entrar (no es necesario reiniciar el ordenador), los bloqueos sólo se mantienen entre sesión.
....y un consejo... no puedes tener tus proyectos en una ruta como ?: c:\Mis proyectos\Sistema de Agencia de Transportes\AGENCIA\fotoschofer\C002.jpg
Cuento 13 niveles de profundidad hasta llegar a la imagen y lo encuentro sumamente absurdo, sólo hasta llegar al proyecto hay 7 niveles.
515
« en: Lunes 9 de Junio de 2008, 16:21 »
Haré unos diagramas a mano alzada (soy muy malo dibujando en el ordenador) y lo escanearé (esto es asequible en tiempo), y luego a medida que vaya encontrando tiempo iré explicando, en detalle el diagrama.
El diagrama responde a lo anotado en el anterior mensaje (que por cierto tiene un par de gazapos).
Con el diagrama y lo que tengas aprendido creo que podrías llevar a cabo tu intento.
El diagrama en realidad serán varios, pero que giran en torno al más básico.
516
« en: Domingo 8 de Junio de 2008, 21:22 »
¿Una neurona siempre se ativa?. Es decir, si tuviera una RNA con 1 capa de entrada (3 neuronas), 1 oculta (2 neuronas) y 1 salida. Para que esa neurona de salida bote un resultado es necesario que todas las anteriores (entrada y salida) hallan botado un resultado de 1, es decir si alguna boto resultado de 0 la salida sera 0 No, no... esto no es así. La salida final siempre debe dar un valor. Desde la capa de entrada a la capa oculta se puede acptar o rechazar entradas, pero igualmente deben dar un valor sea 0 , sea 1. Desde la capa oculta a la salida nuevamente pueden ser aceptadas o rechazadas pero siguen dando un valor. entonces ¿ qué ? te preguntarás. La cuestión es que se realiza el recuento de valores con el ponderamiento de pesos, si en los valores hay más '0' que '1' implica que en principio habrá menos posibilidades de que se active ya que aunque pondere, si un valor vale 0 * loquesea será 0. Así cada etapa vuelca su resultado en la siguiente etapa. La cuestión estriba en que el estado interno va cambiando no sólo por las entradas sino por la retroalimentación (que contiene información sobre el resultado anterior). Una sencilla comprobación del resultado podría hacerse asi: llamemos 'escolar' a la salida de la neurona que está aprendiendo (por referencia al niño que está examinándose en la escuela en su período de aprendizaje). Explico esto mejor: imagina una escuela pero imagina que el maestro va a evaluar a toda la escuela de una vez, no alumno a alumno, entonces digamos que cada alumno 'crea' su respuesta y para entregarla al profesor acuerdan hallar la media de la respuesta entre todos (si hay 40 alumnos y 30 dicen que es 0 y 10 que es 1 digamos que 'escolar' la salida será 1 que es lo que el maestro va a escrutar). Esta salida por tanto no es la salida final, esta salida la evaluamos con la salida que llamaremos 'maestro' (en relación a que es el maestro quien evalúa la respuesta del niño después que ese la reporta, sin embargo acordamos que todos los nños cooperan en una única respuesta). Entonces tenemos dos salidas que serán las entradas de la etapa de decisión de aprendizaje (en este ejemplo, solo se provee la parte que evalúa y la señal de retroalimentación, pero no como actúa la retroalimentación con las entradas originales de 'escolar'es). La salida 1ª es la que respuesta que da 'escolar' y la salida 2ª es la respuesta válida que ofrece el 'maestro' digamos que la pregunta debiera dar por resultado '1' es decir maestro=1 y que la salida de escolar fuera=0 (es decir los alumnos han provisto que es 0). Entonces la evaluación de aprendizaje, escrutando el resultado y si no es satisfactorio enviar la señal correspondiente de etroalimentación sería así: 'escrutar si es válido el resultado resultadoError = escolar xor maestro si resultadoError= 1 luego sumamos 1 fallo 'fff' aquí se prepara el valor de maestro para entregarse a los escolares, sería como decirles mirad es aquí donde os equivocasteis en otro caso sumamos 1 acierto 'ttt' aquí se anula respuesta del maestro , pero sigue existiendo retroalimentación fin si ' la señal de retroalimentación puede ser doble , es decir contiene 2 informaciones, la primera [B]señala que si hubo error[/B], la respuesta correcta se une individualmente a cada ponderación de la entrada (se entrega a cada escolar) y el escolar debe ser ponderado de acuerdo a su acierto o fallo. Esta respuesta la hemos gestionado y fabricado en los apartados etiquetados como 'fff' y 'ttt', digamos de modo simplificado que fff será la respuesta que sabe* a que escolares debe castigar y cuales premiar,. ttt puede ser idéntico a fff o puede ser distinto (es decir quizás queramos ponderar de una manera cuando el acierto fue bueno y de otra cuando el acierto fue malo o quizás queramos utlizar la misma ponderación sea cual sea el caso, más aún quizás queramos ponderar sólo cuando hubo fallo y dejarlo tal cual cuando hubo acierto (es deicr si fue bien no tocarlo), bien pués la 2ª señal de retroalimentación debe encargarse de esto, de decidir que se entrega. Con esto se obtiene un control mucho mayor pués podemos probar dieferentas ajustes de forma 'externa' sin retocar código. Está 2ª señal está en cualquier caso influenciada por 'resultadoError' recordemos que es la evaluación qie hizo el maestro. Para empezar y por simplicidad no incluyas esta posibilidad, valora por igual cuando hay error y cuando hay acierto, más adelante vuelvo a esto de una forma más ordenada. * no de forma cualitativa sino cuantitativa
Es decir usamos un xor para identificar si el resultado es bueno o no, porque si la salida de escolar no coincide con la salida de maestro serán los casos 0-1 ó 1-0, como sea que no coincide implica que siempre hay un 1 y como sólo hay un 1 la operación xor arroja un 1, consecuentemente interpretamos como error. Por tanto 'resultadoError' será 1 siempre que 'escolar' y 'maestro' sean distintos. sigamos. Dijimos que 'resultadoError' no es la salida definitiva, la salida definitiva será opuesta al caso de error es decir si 'escolar'= 'maestro', como esto ya lo hemos comprobado con el xor basta con negarlo salidaProvisional= not('resultadoError' ) ' usamos salidaP para abreviar
Esto es una operación NEXOR (not xor), esta operación dice que si escolar=0 y maestro= 0 salidaP=1 , ó si escolar=1 y maestro=1 salidaP=1 Esta salida provisional indica que la salida es aceptable, pero es una salida provisional porque no contiene datos, sólo control, el dato es la salida de 'escolar', por tanto ahora usamos el dato de escolar y la salida verificada, dicho de otro modo esta salida provisional proporcionará la activación final de salida. Esto último quiere decir que si, la neurona debe dar datos debe hacerse finalmente esto: salida= salidaP or 'escolar'
Pero si nuestra neurona no provee un dato sino que es una etapa de capa la salida debe ser su activación o no activación, por tanto aquí el dato se desprecia, y por tanto la salida es en vez de un dato final es una activación, por tanto: Bien, he explicado como verificar el resultado del dato con un xor y sólo parte de como tomar los datos que se usarán para retroalimentar, también he explicado la salida final sea de dato o de activación, fíjate que este mismo esquema de activación se puede usar para las entradas en la retroalimentación una vez que decidas 2 cosas, cómo (qué método) quieres ponderar las entradas y qué tipo de los que te señalé para ponderar quieres usar (esto último de momento podrías obviarlo y devolver siempre el mismo método de ponderación tras cada respuesta, cuando ya lo tengas `programado y veas que el código funciona (aunque la neurona no parezca responder bien, lo puedes añadir como una optimización). puedes guiarte (o no) con un esquema similar a este, guiado por fases y pasos: Fase: 1 ' lo llamarámos diseño físico 1º Representar x entradas. las entradas tienen 2 campos valor y peso. La entrada es un valor externo, el peso se coloca externamente el inicializar, luego se va actualizando internamente, opcionalmente para para el programa salir y en otra coasión no tener que empezar de 0 podrías salvar a disco el estado de los pesos). 2º Decide que función de ponderación vas a usar para unir pesos y valores unificados. 3º Decide el umbral en base al valor y la función final que se espera cumpla la neurona. 4º prueba todos estos pasos para garantizar que no hay errores de código. Fase 2 ' añadimos evaluación y parte de la retoralimentación, de momento sólo enganchada tal cual sin funcionalidad de retroalimentación 1º La salida del paso 3 de la fase anterior ahora es paso oculto, la salida se evalúa con el maestro. generar si hubo fallo o acierto con xor 2º Generar si la salida final de acuerdo asi es de dato o de activación. Será de activación si esta neurona es la parte oculta de otra mayor. 3º generar retroalimentación usando valor del paso 1 ( de esta fase). lo enganchamos a cada entrada, ahora cada entrada hace un or simple, sólo porque necesitamos que el dato quede enganchado, a medida que vamos completando... 4º prueba todos estos pasos para garantizar que no hay errores de código. fase 3 ' añadimos funciones completas retroalimentación. 1º En el paso 3º de la fase anterior pusimos las entradas como un or ente el valor de entrada y el resultado de error, esto queda ahora cambiado a una función más compleja, el or se cambia por un xor. 2º La entrada se une con or a la salida del xor (esto es un dato) 3º la salida del el xor (después de recoger el dato del paso 2), se niega (esto es una activación) 4º Ahora la función de ponderación solo se usa con los datos activados 5º prueba todos estos pasos para garantizar que no hay errores de código. 6º alternativamente desengancha la retroalimentación a la entrada y engánchala a los pesos en vez de al valor. fase 3 1º añade un contador. El contador es una estructura que tiene 2 variables 'pulsos' totales y aciertos o errores, esto se tomaría desde la salida del paso 1º de la fase 2, para crear estadística 2º Esto (la salida final) es un bit de salida (ya habrás decidido si cambiar el tipo de neurona o no) si necesitas más bits de salida crea una matriz, si elegiste un modelo con algunas diferencias quizás debas ignorar ciertos pasos y seguir otras indicaciones. 3º pon a trabajar la neurona y obtén valores, no esperes resultados pronto, posiblemente y en función de la complejidad de lo que hayas hecho podrás obtener resultado a partir de 1000, 10.000 , 100.000 pulsos.... 4º recrea las estadísticas para ver si tu neurona o red mejora. fase optimización 1 ' estas optimizaciones deberían tener un control externo de modo que puedas cambiarlo libremente desde la interfaz de usuario. 1º Es posible que la ponderación la quieras hacer más o menos indirecta, puedes alterar la retroalimentación para que actúe en el peso en vez de en el valor o en ambos con las diferencias oportunas. 2º puedes añadir la señal doble de retoalimentación como te indiqué más arriba, te da más flexibilidad, básicamente lo que hará será discriminar por ejemplo con 4 resultados distintos (2 bits para decidir cual de los 4 se usa) 00= se aplica la misma ponderación tanto si hay fallo como si hay error (como ocurría hasta ahora), 01= se aplica ponderación sólo si hay fallo, no se altera si hay acierto, 10=se aplica ponderación diferente cuando hay fallo que cuando hay acierto, 11=reservado para la siguiente oprimización. 3º prueba todos estos pasos para garantizar que no hay errores de código. 4º pon a trabajar la neurona y obtén valores 5º recrea las estadísticas para ver si tu neurona o red mejora. optimización 2 1º decidir si esta neurona será de un ciclo interno, de 2 o varios, si es de dos o más ciclos los valores de entradas sólo se toman de nuevo al término del ciclo, mientras se siguen usando las mismas entradas. La salida queda temporalmente desactivada, va a parar a una lista (o la estructura que se te antoje)... en el paso 3 se completa la explicación 2º con esta optimización puedes ahora añadir otro contador, si el anterior era un contador de pulsos de la neurona ahora ese puede ser sólo un contador de ciclo interno y añadirse uno fuera del ciclo, ó sólo tener 1 fuera del ciclo interno. con pulso pués entendemos que un valor se arroja al exterior. 3º Con esta optimización podemos añadir una nueva etapa, esta sería una lista de salidas de cada pulso del ciclo interno, lo que serían entradas a una etapa tras finalizar el ciclo, esta etapa sería una copia casi idéntica de la anterior. Cuando el ciclo interno termina, esta lista dispersa su valor a entradas de la siguiente etapa, el maestro (la respuesta real) es por tanto el mismo que se ha usado en todo el ciclo. Esta etapa también debería contar con retroalimentación. 4º prueba todos estos pasos para garantizar que no hay errores de código. 5º pon a trabajar la neurona y obtén valores 6º recrea las estadísticas para ver si tu neurona o red mejora. 7º realiza cambios leves no bruscos en las funciones de ponderación para ver si se mejora la situación. Salva 'fórmulas' de ponderación que veas han sido más prometedoras por si te alejas con sucesivos cambios volver a la más óptima que tenías hasta el momento. 8º Recuerda que tienes entera libertad para añadir, quitar y hacer cambios, lo que cuenta son los resultados. 9º cuando una neurona obtiene resultados digamos que lo que hasta hora era programado(haciendo pequeños cambios) , el estado inerno que has manejado externamente los funciones, etc.. se debe fijar como si fuera una 'ROM' la neurona ya está lista y especializada. Ten en cuenta que una neurona entrenada para una cosa puede ser totalmente inútil para otra, no pretendas que una única neurona lleve a cabo múltiples funciones distintas. fíjate en los sentidos aunque todo provenga de los nervios, el nervio óptico está superespecializado en colores, la piel en cambio no reconoce colores pero ambos puedes reconocer formas aunque de forma distinta y de distancias distintas.
517
« en: Domingo 8 de Junio de 2008, 03:39 »
¿Como se que funcionde transferencia usare para determinada neurona? La función de transferencia se elige en base a las situaciones que deba resolver. ¿Se pueden usar mas de una funcion para una neurona o solo se puede usar una? No existe un límite teórico por el que una salida deba ser realizado de un modo fijo. ¿Cuando usare Harlim, o Hardlims..etc..etc...? Por las características de cada uno, tal como se indica en el primer párrafo. Por ejemplo: El limitador fuerte (hardlim) lleva a 2 únicas salidas, '0 ó '1' lo que esto implica es que una neurona con este limitador divide en 2 categorías según las entradas. Por tanto cualquier patrón en el que se desee fijar 2 divisiones es un destino de esta función. En cambio el limitador fuerte simétrico (hardlims) produce resultados con valores entre '1' y '-1' . Para más detalles el limitador fuerte suele usarse en la red tipo 'perceptrón', el limitador fuerte simétrico en la red tipo 'adaline' , el sigmoidal logarítmico (logsig) suele emplearse en las redes de múltiples capas. Aunque no te lo parezca hay bastante información en la red busca cada tipo para ampliar detalles. Agradeceria si pusieras un ejemplo completo con una o si es posible para ti con mas neuronas. Asi seria mas sencillo para empezar a plantearme problemas e ir poniendo en practica lo que en estos dias e aprendido, Gracias. Y disculpa si es mucho pedir Es mucho pedir, pero sólo por mi escaso tiempo libre. Desafortunadamente estoy desplazado y aquí no tengo ni mis apuntes ni mis libros para siquiera hacer una transcripción rápida. Tengo pensado postear un problema completo y explicado detelladamente, pero reconozco que me llevará más tiempo del que quisiera, tengo bastante trabajo y casi la mitad de mi tiempo libre lo dedico a ojear el foro. Si, como creo tienes prisa por 'meterle mano', te recomiendo que hagas búsquedas intensivas en la red que sin duda debe haber decenas de trabajos compartidos y a un nivel asequible para empezar. p.d.: me extiendo un poco... Diagmos que el preceptrón lo usaremos cuando tengamos claramente 2 divisiones. El adaline es idéntico al perceptrón excepto que se le retira la función de transferencia para permitir una salida contínua, como los errores entonces pueden ser enormes es donde nace la regla Delta. (valor real - valor logrado)... El adaline va bien para funciones básicas, pero no para funciones complejas . Entonces llega la red multicapa, que reúne a los preceptrones y adaline apoyado por un amplio surtido de funciones de transferencia y es entonces cuando se organiza el flujo en capas, el flujo de entrada, el oculto y el de salida. el oculto se llama así sólo porque visto desde fuera 'no se ve' (por ninguna otra razón). A partir de aquí es todo arbitrario y se decide de forma poco más que empírica.
518
« en: Sábado 7 de Junio de 2008, 16:41 »
Sobre funciones AND, OR, XOR AND(*): Devolvera "1" solo si todas las entradas son igual a 1, para todos los demas caso retornara "0". OR(+): Devolvera "1" siempre y cuando haiga un "1" en algunas de las entradas, solo si todas las entradas son "0" devolvera "0". Si. XOR: Devolvera "1" siempre y cuango ambas entradas sean diferentes. Aqui tengo otra duda, ¿el XOR solo sirve para comparar 2 valores o entradas? La primera parte si, la 2ª no. Ya te expliqué que cuando hay más de 2 valores, el resultado se puede totalizar fácilmente sumando los '1' y si es impar da '1' si es par da '0'. Esto no es así porque sí, sino que es la consecuencia directa. Te lo reexplico otra vez con una perspectiva distinta. Imagina una fila de lo que sea... unos son negros y otros blancos ('1' y '0') y sea la fila: '110.100.101' : tomo los 2 primeros y hago un xor con ellos: 1 xor 1=0 ahora tomo el resultado anterior y hago un xor con el siguiente, el 3º: 0 xor 0=0 repito el paso anterior hasta terminar: nº de dígito | resultado anterior | XOR | valor del dígito nº | = | resultado ____________________________________________________________ 4º: 0 xor 1=1 '110. 100.101' 5º 1 xor 0=1 '110.1 00.101' 6º 1 xor 0=1 '110.10 0.101' 7º 1 xor 1=0 '110.100. 101' 8º 0 xor 0=0 '110.100.1 01' 9º 0 xor 1=1 '110.100.10 1' Esto mismo puede hacerse con 'and' y 'or', pero la experiencia nos enseña (y las matemáticas lo confirman) que no es necesario evaluar 2 a 2 hasta evaluar el total, sino que cuando hay muchas entradas podremos conocer el resultado de forma abreviada (igual que cuando tenemos 5 filas y 5 columnas no contamos una a una sino que aplicamos una multiplicación para simplificar la operación, porque es equivalente) si todos son 1 y la operación es and el resultado es 1, si la operación es or y al menos uno es '1' el resultado es 1, y si la operación es xor el resultado será 1 siempre que la suma de 1 sea impares. [color] indicando así que la neurona puede estar más o menos activada.[/color] A que te refieres con esto Que una neurona no sólo actua de forma 'si' ó 'no' también puede actuar por grados. El caso más claro para entenderlo: imagina un banco que está evaluando si conceder o no un crédito a una persona, resumir en 'si' o en 'no' es muy arriesgado, entonces a los programas (típicamente una red neuronal en su interior) lo que hace es devolver un valor entre 0 y 100 para dejar que sea el director del banco quien decida en última instancia. Si el valor devuelto es 92% seguramente el director dirá sí, pero qué pasa cuando los valores devueltos son tal como 50% ???. Lo puedes entender. Pero dicho de otro modo, puede todo ser reducido a si o no ?, por supuesto que si, pero ello deja fuera otras evaluaciones, si se ofrece un resultado. La experiencia (por ejemplo de lso banqueros) demostraron que un si o un no rotundo no era eficaz en muchos casos, al preguntar a los programadores sobre el porqué la respuesta es clara, no es una ciencia exacta, no todo es blanco o negro, un hombre millonario que se supone pagar sus créditos puede arruinarse de la noche a la mañana y un pobre también de la noche a la mañana puede 'ganar' una lotería. Por tanto hay problemas cuando se maneja un problema complejo si se trata de reducirlo a si o no, para limitar en lo posible ese problema se establecen escalas, típicamente del 0 al 100 pero igualmente válido del 0 al 5 o del 3 al 7.... cuando se ofrece una salida de este tipo, se entiende que luego existirán etapas posteriores que serán usadas para evaluar ese dato en conjunto con otros posiblemente de otra índole entre las que no se descarta e incluso suele ser el consumidor habitual un ser humano. Un caso más práctico: imagina un red neuronal para reconocer caracteres escritos, éstos a diferencia de los impresos puede ser distintos incluso siendo el mismo carácter cada vez que se escriba, es común que haya caracteres muy parecidos si enseñamos a la neurona que que 1 es 1 puede tener problemas cuando se encuentre i y l incluso con j por tanto ya no puede cir si es 'sí' ó si es 'no'. si el signo puede ser confuindido con 4 lo lógico es que pueda dar valores de 0,1,2,3,4 que se corresponderían con 0%, 25% 50%, 75% y 100%, cuando de valores de 0% y 100% no es problema (lo que no quiere decir que sea correcto), pero que pasa cuando dé 25%, 75% y sobretodo cuando de 50%... en dichos casos probeblemente solicitará la ayuda de 'otro' experto que dirima las dudas. Sucede igual con el '0' y la 'o' mayúscula '0O', más cuando es manuscrita, e incluso entre el '6' y la 'ó' y así con varias más... Por eso aparte de que una neurona haya sido previamente 'instruída' para reconocer caracteres, dado que cada tipo manuscritodifeire mucho entre sí, debe seguir 'aprendiendo' después de su 'escuela' y así cuando no arroje valores discretos puede solicitarse al usuario que le asigne el carácter correcto con lo que ahora se alimenta con un nuevo aprendizaje para, por ejemplo tu tipografía manuscrita. No entiendo esto por favor te agradeceria si me lo explicas nuevamente. PD: Se que 2 en decimal es "0010" en binario y que "5" en decimal es 0101 en binario y que "6" en decimal es "0110" en binario. ¿Quizas no te refieres a eso?
En el caso he aplicado un 'or' porque voy 'sumando' es decir 2d (01 en binario) 'or' 5d (1001 5 en binario) = 6d (1011 6 en binario). Si, es correcta tu interpretación. a)1º (1*1) + 2º(2*1) + 3º(2*1) + 4º(2*1) + 5º(2*1) + 6º(3*1) + 7º(3*1) + 8º(3*1) + 9º(5*1) B)1º (*1) + 2º(*2) + 3º(*2) + 4º(*2) + 5º(*2) + 6º(*3) + 7º(*3) + 8º(*3*1) * 9º(*1)
Se uso OR y el operador + Se uso AND y el operador * En conclucion para AND se usa el operador "+" y para OR se usa el operador "*". Es correcto ¿?
Hay operaciones lógicas y operaciones aritméticas, las operaciones aritméticas son suma y multiplicación hazlo con 1 y 0 en base decimal, el resultado es el mismo en binario. La suma y productos lógicos equivale a la suma y productos matemáticos de signos donde el '+' sería el 1 y el '-' el '0'. Esto es pura lógica matemática. Tener conicmientos de lógica matemática o de electrónica digital ayuda mucho a entender una red neuronal. Una red neuronal es a fin de cuentas un circuito digital basado en biestables (célula la memoria). Los circuitos digitales se basan íntegramente en lógica matemática (al caso la binaria). aun sigo con algunas dudas, con lo que respecta a la funcion umbral o valor umbral, tengo entendido que para que una neurona se active el valor de la suma de las entradas por los pesos debe ser lo mas proximo a ese valor umbral, que de cierto tiene esto¿?. Esto es cierto pero puede ser malinterpretado. No debe confundirse más próximo al umbral con el valor más alto, se comenta esto a continuación: Es decir para explicar y entender la teoría es válido para la práctica no es necesario... un ejemplo: supongamos que obtengo un valor de 12, en teoría sería prácticamente no activada '0', pero que pasa si ahora yo hago una negación, es decir que ese resultado deba pasar por un filtro posterior que niega el resultado, el resultado sería que el valor arrojado debe ser restado del rango máximo, por tanto sería 100-12=88, sin embargo si hemos de negar todas las salidas, entonces es mejor operar con 'lógica inversa' en las salidas, es decir el valor umbral será el mínimo. Esto contradice de entrada la afirmación de valor máximo, sin embargo es acorde con la consecuencia resultante. Entonces sólo interpretando correctamente el significado de 'umbral' como el más próximo y no como el valor más alto, es cuando se interpreta correctamente. Así diremos que si para cierta activación el umbral máximo es valor 0, expresa que el valor más próximo es el idóneo para activarse e inversamente con el caso opuesto. Y saliendo de la lógica discreta, si decimos que el umbral sería 50 (sobre un rango de 0-99), puede chocar de entrada si pensamos en el valor, así 40 está tan distante como 60, para representarlo en un rango de 'menos' a 'más' lo único que hay que hacer es digujar una gráfica por ejemplo traza una gráfica con forma de '^' el ´vertice es 50, el inicio es 0 el final es 99, ahora puedes recalibrar estos valores en base a su altura, y entonces se entiende el valor más próximo al 'umbral' es el valor más alto. Recalo en esto porque es frecuente que aunque dices correctamente 'el valor más próximo activa al umbral' con el tiempo tiende a olvidarse el detalle y se queda uno con una idea equivocada de que 'el valor más alto activa el umbral'. 1)En una Neurona tanto los pesos como el BIAS se inicializar aleatoriamente. Es frecuente pero no es indipensable, por lo general es así de entrada. Pero puede de entrada contener cierto valor si se sabe cuales han de ser estos. Por ejemplo una neurona que ya ha aprendido a reconocer caracteres ópticos de imprenta, puede ser activada con esos valores para pasar ahora a reconocer mi grafía, es mejor que nada, que empezar de cero. Pero para un caso estricto de inicio y sobretodo cuando no se sabe o conoce bien es aceptable inicializar con valores fijos o aleatorios. 2)Es el proceso de ajuste del BIAS y PESOS el cual permite aprender a la Neurona. Exactamente. Lo cual se hace comparando la salida con el valor correcto. Es como el proceso de estudio de un escolar: le hacemos una pregunta, el da una respuesta, luego el profesos revisa la respuesta, lo que significa que lee la respuesta del niño y la compara con la respuesta correcta, si está mál indica porqué está mal, lo que equivale a 'esperar' que el niño tome esos datos para retroalimentar su conocimiento y poderlo usar para futuras cuestiones. 3)Cuando se ajusta un peso, se trata de llevar el valor del mismo al valor del BIAS. Esto es un ajuste fino, si resultara ala primera nuestras neuronas aprenderían muy rápido, pero el diseño de las mismas es muy elemental, pero sí, asi es. 4)Para que la neurona se excite se evalua la salida utilizando una funcion Basicamente es así. Que función se aplique siempre dependeráde ciertos factores... estoy aprendiendo o 'trabajando' y sobretodo el enfoque y dedicación, si una neurona se especializa en una cuestión determinada su función será posibllemente más específica. En este ejemplo ya no hay una COnstante de aprendizaje Para un caso generico no puede proveerse cualquier cosa, si al niño se le pregunta '¿ Es la Luna más grande que la Tierra?', la idoneidad de su respuesta debe valorarse con la respuesta de esa pregunta, no con una respuesta cualquiera de otra pregunta, por ejemplo de '¿3 más 6 son 10?' aunque en el caso casulamente den el mismo valor se hace un aprendizaje 'sucio'. Se acepta el hecho de que si se introduce 'basura' a la neurona sale 'basura' de la neurona. No entiendo exactamente que quieres decir con constante de aprendizaje... creo suponer que quieres 'dar nota final' al niño... esto sólo tiene sentido a efectos estadísticos, del mismo modo que al niño el valor de una nota no le reporta conocimiento sino que solo le califica como más o menos apto, tu puedes mientras compruebas la eficiencia de la neurona que diseñes totalizar las preguntas realizadas y las respuestas acertadas, después de 10, después de 100, después de 1000 depueés de 10.000, etc... en función de la complejidad deja de ser 'tonta' a partir de cierto elevado nº de pasos. Compara luego cada 1000 las respuestas afirmativas para ir describiendo una curva de aprendizaje y ver si vas bien o debes hacer 'ajustes manuales' cual mecánico cuando ensambla un conjunto de piezas, que debe apretar cada cosa y calibrarlo bien para que el conjunto opere de la forma más óptima.
519
« en: Sábado 7 de Junio de 2008, 14:44 »
If Not IsNumeric(Chr(KeyAscii)) Then KeyAscii = 0 End If En la 2ª parte le está diciendo que si 'KeyAscii' no es un número, se le asigne el valor 0. Son 3 funciones anidadas dentro de un condicional. Se debe analizar siempre por el de más adentro: chr(nº) = dame el carácter que corresponde a este nº isnumeric(caracter) = es un número el caracter ? not isnumeric() = NO es un número el caracter ? por tanto: if ..... then = SI (no(es un número(el caracter nº(KeyAscii)))) LUEGO
520
« en: Sábado 7 de Junio de 2008, 14:28 »
Me gustaria que el programa no habilite el primer puerto encontrado sino que me muestre a mi los puertos válidos y me de la posibilidad de escojer el puerto que yo desee. El código te da una matriz con los puertos 'capaces' , ya te indico que podrías ponerlos en una lista (control listbox o control combobox) y una vez que arranque el programa (o en un formulario aparte) pulsar un botón para activar el puerto que se elija. Yo te he puesto el 1º como un indicativo de que ya está ahí la respuesta, la 'saca' está llena cualquiera en su interior puedes elegirlo. Bueno compañero, el resto debes hacerlo tú empleando tus conocimientos y esforzándote. De otro modo sería una tarea. Yo ya te he ayudado el resto corre de tu cuenta. Debes entender que no se puede dar todo mascado, tu debes ser el que se involucre en obtener el resultado, los que respondemos solo hacemos de guía y aunque a veces se den partes de código completo o casi completo y más o menos funcional se hace sólo por que a veces es más sencillo mostrar un código que explicar y redactar que algo se hace de esta o aquella manera si alfinal no estás seguro de que se vaya a entender bien. En el resto debes poner el esfuerzo de tu parte...
521
« en: Jueves 5 de Junio de 2008, 15:43 »
Bueno eso lo puedes hacer recorriendo todos los puertos y detectando cual te da error para descartarlo, a partir de ello tomas una lista. No obstante tampoco es necesario disponer de la lista si sólo vas a ocupar uno, sin embargo siempre será interesante poder conocer las opciones disponibles... Un posible código podría ser algo como lo siguiente. Nota que hay cosas sin asignar (por ejemplo Settings) y que hay otras que se pueden suprimir (por ejemplo asignación y reasignación del objeto error), además no lo he probado es un código rápido y pudiera necesitar corregirse, en cualquier caso deberás adaptarlo a tus necesidades. en principio lo pruebas y paso a paso (tecla f8) para comprobar que funciona correctamente y ya lo modificarás como te parezca conveniente. 'en un módulo coloca esta línea: Public puertos() As Integer ' en el formulario pondrías esto, que responde a un botón, tu posiblemente deberías ponerlo en el load del formulario o en el main de un módulo si arrancas desde módulo. Private Sub Command1_Click() Call Examinar_Puertos End Sub ' las siguientes funciones las puedes colocar indistintamente en el formulario o en un módulo, irían mejor en un módulo, separado del código de manejo de los controles, pero si lo cambias a un módulo, está 1ª rutina debes hacerla de pribate a public, para que la llamada: 'call Examinar_Puertos' pueda localizarla. Private Function Examinar_Puertos() puertos = Detectar_Puertos ' contiene la matriz de los 16 puertos con valores true-false (1-0) puertos = filtrar_Puertos ' filtramos para obtener sólo los true If puertos(0) <> 0 Then ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas ' o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente MSComm1.PortOpen = True 'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware ' otras acciones Else MsgBox "No se encontraron puertos disponibles" End If End Function ' intenta 'ver' que puertos hay disponibles Private Function Detectar_Puertos() As Integer() Dim puertosExistentes(1 To 16) As Integer Dim nError As Long Dim PrevioError As ErrObject Set PrevioError = Err ' guardamos el error previo (si se desea, si no, se puede obviar) Err.Number = 0 ' reseteamos cualquier posible error previo... On Local Error GoTo ErrorPuerto ' si se encuentra un errror salta a la etiqueta indicada For k = 1 To 16 MSComm1.CommPort = k ' aquí esperamos recibir un error 'MSComm1.PortOpen = False If nError = 0 Then MSComm1.PortOpen = True ' aquí esperamos recibir un error If nError = 0 Then puertosExistentes(k) = 1 ' es ok no generó error MSComm1.PortOpen = False ' si no se pudo abrir dará error de no está abierto Else nError = 0 ' reseteamos error para detedtarlo en el próximo ciclo End If Else nError = 0 ' reseteamos error para detedtarlo en el próximo ciclo End If Next Err = PrevioError ' si asignamos el error previo a la entrada, se lo devolvemos Detectar_Puertos = puertosExistentes Exit Function ErrorPuerto: nError = Err.Number ' errores 8002, 8005, 8012 ' no está disponible... MsgBox ".se detectó otro error en el puerto " & k & " el mensaje devuelto fue: " & Err.Description & vbCrLf & _ " ... al cerrar este mensaje se continúa explorando.", vbExclamation, "Explorando puertos ..." Resume Next ' no salgo, contínuo con la sigte. línea que dió error End Function ' filtra la matriz de puertos ahora sólo contendrá los disponibles. ' su contenido ahora es el nº de puerto Private Function filtrar_Puertos() As Integer() Dim p() As Integer Dim x As Integer ' contador de puertos 'válidos' ReDim p(0 To 0) ' p(0) se usa para saber cuantos se encontraron... asegura no devolve una matriz vacía For k = 1 To 16 If puertos(k) = 1 Then x = x + 1 ReDim Preserve p(0 To x) p(x) = k End If Next p(0) = x filtrar_Puertos = p End Function
522
« en: Miércoles 4 de Junio de 2008, 15:46 »
si tengo una neurona que recibira 9 entradas:
Neurona recibe 9 entradas = {1,0,0,1,1,0,0,1,1} Si e entendido bien, la salida sera 1 porque la cantidad de entradas con el valor de 1 es impar Efectivamente. Pero entonces porque en el mi post anterior (hago referencia al post inicial) se tenian solo dos entradas y ambas tenian el valor de "1", sin ser impar el numero de "1" esta daba como resultado la salida "1" Veamos, que se haga un 'or' o que se haga un 'and' depende de como se diseñe la neurona, depende de como se quiera hacer. Debes tener en mente que no existe una única neurona, sino tantos modelos como se quiera hacer, el modelo que se te haya presentado con toda seguridad habrá sido un modelo para empezar a entender el funcionamiento interno de una neurona, lo cual no implica que deba ser así exactamente. La funcion AND solo se usa o aplica cuando hay 2 entradas? -La funcion XOR solo se usa o aplica cuando hay mas de 2 entradas? -Cuando se usa la funcion OR ? No. La función 'and' como su traducción indica se usa cuando se requiere que todas estén a 1 independientemente de las entradas a usar, así en tu ejemplo de 9 entradas si se usa un 'and' sólo dará '1' cuando se dé este caso: '111.111.111' (los puntos son sólo para la comodidad de leer o contar) La función 'or' es menos 'exigente' dará '1' siempre que al menos uno de ellos sea '1'. es decir dará 1 en todos los casos, excepto ('000.000.000') que todos sean 0. Creo que no has acabado de comprender el funcionamiento de las neuronas, sino sólo de la neurona que te han presentado, debes intentar hacerlo universal no quedarte sólo en como lo hace una neurona. Piensa que hay diferentes tipos de neuronas, por ejemplo gaussinanas, sigmoidales, de 'función escalón'... pero una vez más no debes quedarte ahí son 'modelos' de categorizar ni definitivas ni completas. Guste o no sigue siendo un campo a explorar. Personalmente yo era muy crítico en lo que algunos llamaban red neuronal 'artificial' por tal y como yo lo entiendo sin embargo a día de hoy esto está resuelto en una subclasificación: 'aprendizaje supervisado' y 'aprendizaje no supervisado'. Cuando el aprendizaje es superviado el motor de inferencia es construído pensando específicamente en el objetivo que se prentende conseguir, entonces el diseño para aplicar un 'or', 'and' etc... depende de esto, no es que se aplique universalmente un 'or' o un 'and'. (p.d.: bueno se usa universalmente pero para obtener metas fijas dadas unas condicones del mismo modo que se usa universalmente una multiplicación para hallar loe elementos dada una tabla de 'x' columnas por 'y' filas. Evidentemente la suma y la multiplicación se usan universalmente pero para sus objetivos específicos). Más abajo se explica cuando y cómo se usa realmente a modo 'grosso' un 'or' un 'and' y un 'xor' de modo general... sigue leyendo aunque me ha salido un tocho de mensaje, pero con 4 palabras quizás te siguieran quedando 20 preguntas. De hecho no todas las entradas se valoran igual, generalmente se ofrece una ponderación por peso (confiar más en.. en el ejemplo ya lo hemos hecho de entrada que no es el caso típico salvo especialización), en lo que se entiende como una 'lógica borrosa'. Esto es fácil de entender con un ejemplo, que se aprovecha para explicar la mitad eel funcionamiento de una neurona: Supongamos que tenemos 9 amigos, cada uno de ellos debe responder a una pregunta que yo les he formulado , pactemos de entrada que la pregunta para todos ellos es la misma: " Existe la murrala de China ?". Independientemente de la veracidad de la respuesta, (lo importante aquí ahora es entender el mecanismo de como yo valoro las respuestas) yo no daré el mismo crédito a cada uno de mis amigos. Es lógico conocer que uno suele ser un ttotal fracaso en conocimientos, entonces a ese por ejemplo puntuaré su repuesta de este modo (lo que dé (si o no) por 1, es decir no me fío nada de su respuesta porque no me fío de sus conocimiento, ahora valoro a otros 4 amigos en la forma 2 por el valor que cada uno de ello me dé, digamos que confío en ellos pero no puedo predecir si realmente dominan el tema geográfico, luego a otros 3 amigos los valor así 3 por el valor que me den y al último que me fío mucho de él le doy 5 puntos por su respuesta, es decir si me dice si será 5*1=5 si me dice no será: 5 * 0=0, luego sumo todos los pesos... y establezco una 'frontera' para evaluar como 1 ó 0 el resultado. La ' función de activación' no tiene porqué ser discreta, puede ser mostrada en valores contínuos así en el caso anterior el rango podría ir desde todos no: =0 hasta todos sí= 1º (1*1) + 2º(2*1) + 3º(2*1) + 4º(2*1) + 5º(2*1) + 6º(3*1) + 7º(3*1) + 8º(3*1) + 9º(5*1)= 23 indicando así que la neurona puede estar más o menos activada. En el caso he aplicado un 'or' porque voy 'sumando' es decir 2d (01 en binario) 'or' 5d (1001 5 en binario) = 6d (1011 6 en binario). ahora te pongo otro ejemplo: Imagina el mismo ejemplo, anterior muy similar excepto en la apreciación del último, ahora el último su creídito no vale '5' sino la mitad de todos los anteriores es decir el 50% entonces lo expresaría así (posicion(valor)) modo de operar resultando: sí= 1º (*1) + 2º(*2) + 3º(*2) + 4º(*2) + 5º(*2) + 6º(*3) + 7º(*3) + 8º(*3*1) * 9º(*1) p.d: nota que éste último está multiplicando ('and') por la suma total de los anteriores.. ahora si lo examinas estoy haciendo un 'or' entre los 8 primeros y el resultado de esto lo pondero con el 9º es decir hago un 'and' por tanto si el último es 0, todo el resultado será 0 porque el 'and' exige que ambos términos sean '1' (el primer término son la suma de los 8 primeros) en cambio si el 9º es '1' el valor de salida es la suma que arrojó los 8 primeros, que nuevamente será 0 si toda su suma es '0' . Entonces se podría decir para explicarlo más fácilmente ´con la pregunta reformulada así: a los 8 primeros "¿ Existe la murralla de china?" y al 9º le pregunto: "¿Es cierto lo que dicen los 8 primeros?". Entonces como puedes ver no es que use un 'or' ni un 'and' sino que en función de lo que se quiera se programa (formula) como ves incluso uniendo operadores y como ves no necesariamente con valores discretos. Pero claro para empezar a entender una neurona lo más lógico es empezar por la neurona más simple, lo que se suele explicar con una de 2 entradas, posiblemente elló induzca a un 'vicio' a causa de las 2 entradas, lo único que suele ser fijo es que devuelve una única salida, es por eso que se concibió una etapa 'oculta' cuando las entradas comunican los valores a un sinfín de 'intermedios', por ello se englobó todo el conjunto como neurona obviando esa parte interna, pués finalmente toda esa parte debe devolver una única salida. Dicho esto debes entender que es lógico que haya neuronas especializadas. Fíjate que hemos descrito el proceso de salida de una neurona (aunque sin aprendizaje) en el ejemplo de la pregunta (he presentado luego el ejemplo de la 9º de otro modo porque al final volvemos a ello y espero que se entienda como opera). Entonces para comprender como funciona una neurona (partiendo de loqeu ya he explicado) todo lo que se requiere es utilizar 'memoria' es decir retroalimentar. Eso es lo que voy a explicar ahora... y es donde ese 9º se utilizaría... Supón que basándonoes en el ejemplo primero nos diron una respuesta de 11 y que consideramos falsa '0' entonces retroalimentamos hacia atrás la respuesta eso nos permitirá poco a poco reconocer los mentirosos, los que no tienen ni idea de China y por tanto se iría filtrando la veracidad, es aquí donde entra a formar parte la función XOR.... espero que lo entiendas... Si ya hemos hecho 10 preguntas y se nos ha dado 4 ciertas (valores >=13 sobre el total de23 que fijamos como máximo) y 6 malas, nuestra retroalimentación consistirá en basarlo con aprendizaje supervisado, es decir la muralla de china existe por tanto introducimos una entrada oculta desde la salida si a la pregunta de la muralla nos dieron 0 cuando debió ser 1 devuelvo un 1 a las entradas ahora esa entrada se une a cada entrada de los amigos, vuelvo a formular la misma pregunta: puesto que obtuvimos un 11 debemos afirmar que algunos respondieron bien entonces nuestra 1 retroalimentando deberá desactivar la salida de los amigos que dieron 0 a una respuesta que sabíamos que era 1, al desactivar a esos amigos significa que su respuesta se contará, entonces para saber que amuigos respondieron valor distinto de '1' (recuerda que les dimos valores contínuos) utilizamos 'XOR' pongamos el caso destripado: 101.000.101 esto es el primero cuyo valor era 1 nos da 1, el 2º nos da 0 el 31 nos da 1 el 4º,5º y 6º nos dan 0 el 7º nos da 1 el 8º nos da 0 y el 9º nos da 1 que sumado todos sus valores nos daba 11. Por lo tanto sólo consideramos las respuéstas de 1,3,7 y9 el xor nos ha permitido filtrar de quien valoramos entonces ahora el rango máximo y mínimo de valores será: de 0 a 1ª(1*1) + 3º(2*1) + 7º(3*1) + 5º(5*1)=11, naturalmente en la siguiente respuesta por tanto nos da un si rotundo, pero eso no significa un éxito total, ya que sólo hemos formulado una pregunta y después de todo nuestro amigos son más inteligentes que nuestro 'diseño', de hecho le dimos de entrada un valor ponderado a nuestros amigos, por eso obtuvimos ya así de rápido un resultado pleno, esto en la práctica puede ser así o no, sin embargo en sucesivas iteraciones el resultado se irá filtrando más exhaustivamente. El ejemplo no lo debes tomar al pie de la letra, ya que lo que pretende es ayudar a entender las fases del mecanismo de las neuronas: como las entradas se pueden disponer para ser valoradas, como se prepara una respuesta, como se retroalimenta con 'aprendizaje supervisado', como se activan y desactivan internamente para generar una salida. De hecho para que nuestro aprendizaje sea eficaz y el ejemplo fuera totalmente válido, el ponderamiento que nosotros hemos fijado desde el principio (valor 1 al primer, 2 a los 4 siguientes.... 5 al último) es el auténtico objetivo que tiene encomendado la retroalimentación, es decir es la retroalimentación quien debiera fijar esos valores valorar más al más 'creíble' y eficaz y menos a los demás... De entrada sino hay razones para confiar más en uno que en otro (caso de la programación) de entrada todos valdrían 1 (salvo que tengamos información específica de un diseño al que se orienta y que podamos aprovechar), nuestro modo de cuantificar será con 'or'. Con 'xor' para valorar y con 'and' en la retroalimentación para 'activar/desactivar' . Esto luego en la práctica puede complicarse todo lo que se quiera.... Sucede que como somos inteligentes ya de entrada conocemos como son nuestros amigos, desde la primera pregunta ya hemos valorado y ponderado a cada uno y por eso ya tenemos un cierto 'juicio' interpretativo inicial que hace que nuestro ejemplo pudiera malinfluenciar si no se entiende su objetivo. En fin espero haberme expresado con la claridad suficiente para que se entienda. En otro momento si quieres comentamos las células de memoria para entender eso de la 'retroalimentación' . p.d. final: el segundo ejemplo en el que el 9º amigo se valoraba con el mismo valor que a los 8 restantes, sería forma de de generar la retroalimentación para el aprendizaje supervisado, es decir este noveno podría haber sido un 10º oculto al que se le suministra la respuesta real para retroalimentar el aprendizaje... Supongo que algún detalle más se me quedará en el aire... este párrafo tiene condensado el mecanismo de la neurona, quizás haga algún dibujo que ayude a entenderlo bien: De entrada sino hay razones para confiar más en uno que en otro (caso de la programación) de entrada todos valdrían 1 (salvo que tengamos información específica de un diseño al que se orienta y que podamos aprovechar), nuestro modo de cuantificar será con 'or'. Con 'xor' para valorar y con 'and' en la retroalimentación para 'activar/desactivar' . Esto luego en la práctica puede complicarse todo lo que se quiera....
523
« en: Miércoles 4 de Junio de 2008, 01:14 »
por fin e logrado comprender el funcionamiento de una Neurona Pués me alegro por ti... Que pasaria si son 5 o mas entradas como sabria yo, cuantas deberian ser 1 para que mi salida sea 1 No estoy seguro de que si lo que dices es lo que me parece entender que preguntas, pero ya me dirás... Si hay 'n' entradas y hay 'x' valores a 1, la salida será 1, si 'x' es impar (función XOR), por tanto basta contar los '1' y ver si es impar o par para dar 1 ó 0. Salida= (x mod 2) Si no he interpretado bien tu pregunta intenta formularla de otro modo. p. d.: A los nuevos se les limita el uso de links para evitar las malaintencines de los 'trolls'.
524
« en: Miércoles 4 de Junio de 2008, 00:50 »
En principio un textbox irá bien... pero ponle el 'background' de color negro y la fuente en negrita y de color blanco a un tamaño generoso (por lo menos 14-18). Se supone que es el dato relevante dentro del formulario, entonces dale el realce que precisa... debe destacar del resto, incluso alignement=center y borderstyle=0 La variable si no la declaras es un variant, por defecto, es decir es a la vez un string, un integer, un long,etc.... por lo que el tipo de dato no debería preocuparte. Luego creo que deberías cambiar el intérvalo del timer. Ignoro cual es la idea final. pero imagina un datro que cambia 1000 veces por sg. ... alguien será capaz de leerlo ????... sólo si el valor no cambai a esa velocidad, yo te recomendaría por tanto que colocaras algún tipo de 'scroll' para poder modificar el intérvalo, entre ese valor de 1 y 1000 (salvo que deba transmitir el dato para otro objeto un valor de 1sg es más que sufiiente, y un label que refleje el valor actual. Sin embargo yo te aconsejo modificarlo para usar el evento oncomm si el pic envía info directamente o el 'sondeo' si debes solicitarlo tú directamente... el método conocido como sondeo suele usarse en la forma: ' le envías los datos MSComm1.Output = "lo que sea que envías ' ' esperamos respuesta con los datos del puerto serie. Do DoEvents miBuffer$ = miBuffer$ & MSComm1.Input Loop Until InStr(miBuffer$, "lo que espero recibir") ' ó until len(miBuffer$)=2 ' ahora validas los datos
El otro método es usar el evento onComm del propio control: Private Sub MSComm1_OnComm() ' te pongo las referencias de las constantes para que no tengas que conocerlas de memoria, las aquí usadas deberían ser por ejemplo las de error y las de 'onCom'... para aprovechando el evento con select case... Dim errorCom As ErrorConstants Dim eventoCom As CommEventConstants Dim tipoCom As InputModeConstants ' modo binario ó modo texto Dim controlCom As HandshakeConstants Dim onCom As OnCommConstants ' Select Case MSComm1.CommEvent ' detectar errores Case comEventTxFull ' el buffer está lleno Case comReadError ' error al leer el puerto ' ... ' ... Case comGetNotSupported MsgBox "La propiedad es de sólo lectura..." Case comPortNotOpen MsgBox "El puerto no se ha podido abrir..." ' ... ' detectar evento esperado Case comEvRing ' el indicador de llamadas ha cambiado Case comPortOpen ' el puerto está abierto MsgBox "Se ha abierto el puerto exitosamente." End Select
Creo que con esto y haciendo las pruebas que creas pertienente acabarás por darle el toque final....
525
« en: Lunes 2 de Junio de 2008, 13:41 »
Bueno, verás normalmente se consideran 3 'flujos' sobre una red neuronal,
el flujo de entrada: el grupo de neuronas que recibe los datos el flujo de neuronas 'ocultas': el grupo de neuronas que trabaja a la sombra. El flujo de salida: el grupo de neuronas que devuelve la salida de datos.
Esto es sólo una idea de esquema no es absolutamente necesario que sea así para que sea una red neuronal. De hecho en un ejemplo completo que he iniciado (está en preparación puede llevarme entre 1 y 2 semanas a ratos libres) esta división no aparece tal cual, hay una parte oculta, pero las neuronas de salida son las mismas que las de entrada.
Entonces a lo que me refiero anteriormente (con las dudas que expones) es que se utilizan las mismas neuronas para el control de si mismas, entonces la lógica puede prestarse a confusión no quedando muy claro los datos manejados de las reglas de inferencia.
Respecto del ejemplo que solicitas, me he puesto a ello, pero dado que que con detalles parciales puede ser muy complejo, resulta en cambio que con un ejemplo completo puede ser asequible a todo el mundo, además el proyecto lo estoy haciendo en VB 2008 con lo que creo que podrá llegar a un público mucho mayor (nuestro amigo del ajedrez, que no ha vuelto a reportarse, podría echarle un vistazo, en su momento claro...).
Una somera descripción de lo que hará el programa de ejemplo sería esta: dado un habitat cerrado (una superficie cuadrada), introducimos x neuronas en dicho habitat, posicionándolas aleatoriamente. el hábitat es una zona cuadrada ( de 500x500 píxels) que tiene 'barreras' a modo de paredes que no se pueden franquear, existe una meta que es donde deben llegar las neuronas. De entrada cada neurona es 'excitada' con una dirección de avance (sube, baja, derecha e izquierda) de modo aleatorio, detectarán las colisiones (será casi su única cualidad) cuando detecte una barrera, el límite del hábitat o la meta, es cuando obtiene 'experiencia' y se produce una retroalimentación. La retroalimentación entre miembros se produce cada ciertos intérvalos de tiempo, las neuronas avanzan sólo una casilla cada vez, su estado de experiencia sólo puede alterarse cuando encuentra una colisión o cuando se comunica con las otras neuronas. Cada neurona en realidad se compone de bloques elementales que al caso los he llamado flagelos (el interrés de hacerlo así está en que nos será fácil después hacer cambios), estos son la capa 'oculta' vuelcan su experiencia en si mismas y en uno designado como líder, que es quien se comunica directamente con el resto de neuronas (del líder del resto de neuronas). el objetivo es que los 'flagelos' que se mueven con un conjunto de reglas muy restringido y que al principio lo hacen aleatoriamente, vayan abandonando ese 'alimento' para alimentarse de la experiencia anterior y de la propia de sus congéneres para tratar de encontrar la zona designada como meta. Un cusdrado de cierto tamaño colocado dentro del hábitat. Como el caso recuerda mucho a los espermas buscando el óuvlo al proyecto lo he llamado esper_móvil ( de esperma móvil)... cuando lo tenga avanzado lo iré posteando y comentando.
P.D.: porqué no cambias el título al hilo para que refleje sentido y no una vaguedad ... (pregunta número uno, no es un título apropiado para nada).
Páginas: 1 ... 19 20 [21] 22 23 ... 29
|
|
|