khiopsml / kc-electron Goto Github PK
View Code? Open in Web Editor NEWThe Electron application that encapsulates Khiops Covisualization
The Electron application that encapsulates Khiops Covisualization
quand on change le nombre de clusters (avec l'outil de choix optimal), la hiérarchie se met bien à jour dans l'onglet Context mais pas dans l'onglet Axis
Version: 10.2.2
Khiops lib version: 1.4.8
ESSAI1_Coclustering.zip
Il s’agit de 2 jeux de données dont aucun ne s’ouvrait avec l’ancienne version.
Le message affiché était : « The application will use more than 1 Go of memory. The data can’t be loaded”.
Les fichiers de données sont en effet volumineux et quasiment identiques
mais dans le 1er cas le coclustering est de dimensions faibles (5 et 6)
alors que dans le 2nd cas le coclustering est de dimensions élevées (1045 et 594).
Avec la nouvelle version de KCV, le 1er coclustering s’affiche bien mais pas le second.
Il doit donc y avoir une limite à fixer qui porte plus sur la taille du coclustering que sur le volume des données à afficher
(ou peut être les deux).
Voici les lien de téléchargement :
Url 1 : taille importante du fichier de données mais taille réduite des dimensions du coclustering (5 et 6)
Dimensions 2
Name Type Parts Initial parts Values Typicality Description
id_cookie Symbol 5 5 1475486 1
url Symbol 6 6 1819466 1
https://tf.orange.com/f/329ad051b46e4d3f9a80/?dl=1
URL 8 : taille importante du fichier de données et taille élevée des dimensions du coclustering (1045 et 594)
Dimensions 2
Name Type Parts Initial parts Values Typicality Description
id_cookie Symbol 1045 1045 1475486 1
url Symbol 594 594 1819466 1
https://tf.orange.com/f/d39a613af83e404d898f/?dl=1
Il faudrait pour cela avoir une taille limite de coclustering que l’on peut afficher et afficher un coclustering replié sinon.
On pourrait partir sur une valeur limite du produit des dimensions.
Tu disais que jusqu’à 100 par 100 tout était OK. Cela pourrait déjà être un seuil ?
When a cluster name for a categorical variable contains the characters "inf" it is converted as undefined (but not always)
Dans le json d'un coclustering replié, les intervalles d'une variable numérique doivent être décrites par des nombres plutôt que par des String
Format attendu :
{
"cluster": "]12.5;+inf[",
"bounds": [
12.5,
16
]
}
Format actuel
{
"cluster": "]12.5;+inf[",
"bounds": [
"12.5",
"16"
]
}
Marc souhaite repasser à l'envoi de bug par mail pour les autres users.
Vous pouvez continuer à les remplir directement ici ça m'évite de faire du copié / collé
On souhaite remplacer le choix entre les deux options : « Local / Global » par un bouton à cocher/décocher ayant pour libellé « Conditional on context ».
Ce bouton sera coché par défaut.
Quand il sera décoché, il y a de nouveaux calculs à implémenter.
Voir note jointeIndicateur-TousContextes.docx
The "Project" view is useful for KhiopsVizualization but contains limited information with KhiopsCovizualisation.
This "project" view can be suppressed for the moment (it can be reactived if necessary)
-> When opening a file, display the Axis view directly
Une fois que l'on a replié un coclustering via la fonctionnalité Unfold hierarchy, on peut sauvegarder ce repliement avec "Save current hierarchy as". Les clusters repliés sont sauvegardés à l'état de feuilles, cela élague le coclustering.
Les valeurs d'un cluster replié sont à décrire dans un certain ordre.
Dans le fichier json du coclustering initial, les "values" sont ordonnées par effectif décroissant (champ "valueFrequencies").
Exemple : Adult avec variables occupation et education
Extrait du fichier json initial avant repliement. La liste des "valueGroups" est dans un certain ordre. Les deux premiers sont "cluster": "{Prof-specialty, Armed-Forces}" puis "cluster": "{Exec-managerial}".
Dans le cluster "cluster": "{Prof-specialty, Armed-Forces}", la value "Prof-speciality" est avant "Armed-forces" car son effectif 5787 est supérieur à 13.
"dimensionPartitions": [
{
"name": "occupation",
"type": "Categorical",
"valueGroups": [
{
"cluster": "{Prof-specialty, Armed-Forces}",
"values": ["Prof-specialty","Armed-Forces"],
"valueFrequencies": [5787,13],
"valueTypicalities": [1,0.00278259]
},
{
"cluster": "{Exec-managerial}",
"values": ["Exec-managerial"],
"valueFrequencies": [3973],
"valueTypicalities": [1]
},
Dans le fichier json du coclustering replié, si l'on regarde le cluster replié à partir de ces deux clusters, il faudrait que cet ordre soit maintenu c'est à dire que l'on obtienne
"dimensionPartitions": [
{
"name": "occupation",
"type": "Categorical",
"valueGroups": [
{
"cluster": "A7",
"values": [
"Prof-specialty",
"Armed-Forces",
"Exec-managerial"
],
"valueFrequencies": [
5787,
13,
3973
],
"valueTypicalities": [
1,
0.00278259,
1
]
},
On retrouve en premier les "values" du 1er cluster de la liste : Prof-specialty puis Armed-Forces (dans le même ordre que l'ordre du json initial) ; puis la modalité du second cluster "Exec-managerial".
Actuellement l'ordre du json que KhiopsCovizu produit est différent car "Exec-managerial" apparait en premier.
"dimensionPartitions": [
{
"name": "occupation",
"type": "Categorical",
"valueGroups": [
{
"cluster": "A7",
"values": [
"Exec-managerial",
"Prof-specialty",
"Armed-Forces"
],
"valueFrequencies": [
3973,
5787,
13
],
"valueTypicalities": [
1,
1,
0.00278259
]
},
Pour ce qui est de l'ordre des clusters dans le champ ""dimensionHierarchies", l'ordre attendu est le suivant :
Ordre attendu pour les clusters de la variable "occupation" : {2,8,14} pour les feuilles puis {4,12} pour les autres
Ordre actuel dans le fichier json produit par KhiopsCV : {2,4,8,12,14}
Ce joint deux problèmes mineurs pour l’affichage des valeurs extrêmes (correspondant aux -inf et +inf du cas numérique, disponibles dans le champs « bounds » pour chaque cluster de valeurs numériques).
Sinon, j’ai vu que le menu « Report a bug » passe maintenant par une connexion préalable à Github, et non par un envoie de mail comme auparavant. Est-ce désormais la procédure « normale » à suivre ?
Avec le fichier de coclustering ci-joint, il y a un problème dans l’affichage de la valeur inf de la deuxième variable (age décès) qui est indiqué comme undefined, alors qu’elle vaut 0.
Mais bizarrement, tout se passe bien avec la première variable (annee de naissance).
Idem dans le panneau « Selected clusters », et ne fait partout où cette information est visualisée.
La matrice de coclustering semble ne pas se mettre à jour lorsque l'on replie des clusters d'une variable de contexte.
Elle devrait afficher la même chose que quand on se positionne sur la partie.
Exemple sur "Triclustering simple"
Affichage de la matrice par défaut quand on est positionné sur la partie "Versicolor"
Affichage de la matrice quand on replie entièrement la variable de contexte en cliquant sur "C1" : la matrice ne change pas
Affichage de la matrice quand on se positionne sur "C1" : la matrice affiche ce que l'on devrait voir quand on replie la variable au niveau de C1
TriclusteringSimple.zip
Quand je ferme l’outil en ayant choisi la valeur minimum (10%) et que je l’ouvre l’outil à nouveau, la valeur de contraste passe à 50%
Anomalies d'affichage repérées avec la base de données Adult variables education, occupation.
Données externes :
education An example of text
Bachelors This text is standard
HS-grad This one too (;*/|,……)
Masters "By cons, it contains a tab"
Some-college "Here there are
line
breaks…"
11th "Here is more complicated, there are ""double quotes""."
Observations pour la value Masters
1/ quand on sélectionne le cluster terminal "Masters" dans le panneau "Hierarchy", le dernière charactère "b" du texte dans le mot "tab" n'est pas affiché pour la value "Masters"
2/ Différence d'affichage pour la value Masters selon le cluster qui est sélectionné dans la Hierarchy
Si le cluster B9 est sélectionné, le texte de la value Masters s'affiche (sans le "b")
Si le cluster B5 est sélectionné ainsi que la value Masters dans le tableau composition, le message affiché est "No external data".
Cela pourrait être lié à la position de la value dans le tableau Composition : le texte s'affiche pour la 1ère value du tableau mais pas pour les autres ?
Version: 10.2.4
Khiops lib version: 1.4.11
Suite à un repliement, au niveau du rapport json, deux corrections à apporter :
Ci-joint un exemple de coclustering initial sur la base Iris avec 3 variables : Petal Length, Petal Width et Class en Context.
Le repliement effectué est repliement obtenu en utilisant "UnfoldHierarchy" et en passant de 9 clusters à 8 clusters.
On obtient le rapport json Coclustering-Rep8 alors que l'on devrait obtenir Coclustering-Rep8-Cible.
When a cluster is folded in the hierarchy, if the elements displayed in the composition table are folded, the composition table should be updated.
Example with Adult (education, occupation).
The elements of the terminal cluster "Farming-fishing" and "Pruv-house-serv" are displayed in the composition table.
The cluster A15 is folded.
Old version of KCV : the composition table is udpated
Before folding :
After folding
New version of KCV : the composition table is not udpated.
Before folding
For each cell of the coclustering matrix, we can display indicators as Frequency ( F), Mutual information (I) , conditional probabilities (P). In the old version of KCV, some complementary information are given for Frequency and Mutual information indicators.
Add "Expected frequency" indicator
When the indicator "Frequency" (F) is selected, complete the valeur of the indicator with the value of the "Expected frequency" where
EF( cell) = total number of instances in the cell line * total number of instances in the cell column / total number of instances.
Example for a coclustering with 4 cells whose frequency are :
8 | 5
For the cell of frequency = 10, the expected frequency is equal to (10 + 13) * (10 + 8) / (10+13+8+5)
For the cell of frequency = 5, the expected frequency is equal to (13 + 5) * (5 + 8) / (10+13+8+5)
Add "Total mutual information" indicator
When the indicator "Mutual information" (I) is selected, add the value of the Total mutual information which is computed as follows
Total I = sum of the mutual information cell indicator over all the cells
Add a display of the indicators above the coclustering matrix
Example of view with the old version of KCV
The indicators are displayed on a tooltip by moving the mouse over the cells AND above the matrix.
Que ce soit pour une variable numérique ou catégorielle :
Dans le tableau "Composition" (présent uniquement pour variable catégorielle)
Graphique 1
Barre : modifier la hauteur de la barre noire que l'on déplace pour qu'elle soit égale au taux d'information
(actuellement elle monte toujours à 100)
[Vu avec Fabrice et Marc, valable pour les 2 outils Vizu et Covizu ]
Il faudrait permettre à l'utilisateur de refuser le suivi Matomo : remplacer l'unique choix "Ok" par une question "Yes / No"
Si c'est possible, mettre en place un décompte des acceptations et des refus.
Afin que la question ne soit pas posée à chaque ouverture, serait il possible de placer ce choix dans les Settings ?
L'utilisateur répondrait lors de la 1ère connexion "oui/non" puis pourrait le modifier dans les Setting si besoin.
Quand on décrit les parties d'une variable catégorielle impliquée dans un coclustering, il manque une colonne "Size" qui était présente dans l'ancien outil de visu et qui indique le nombre d'éléments de la partie. Il n'est pas donné directement par un champ du fichier json mais il est égal au nombre d'éléments dans le tableau "values".
"valueGroups": [
{
"cluster": "{Prof-specialty, Armed-Forces}",
"values": ["Prof-specialty","Armed-Forces"], -> Size = 2
"valueFrequencies": [5787,13],
"valueTypicalities": [1,0.00278259]
},
{
"cluster": "{Exec-managerial}",
"values": ["Exec-managerial"], -> Size = 1
"valueFrequencies": [3973],
"valueTypicalities": [1]
},
{
"cluster": "{Machine-op-inspct, Transport-moving, Handlers-cleaners}",
"values": ["Machine-op-inspct","Transport-moving","Handlers-cleaners"], -> siez = 3
"valueFrequencies": [1852,1578,1259],
"valueTypicalities": [1,0.913249,0.780641]
},
Rq :
Le cas de la première partie est spécifique : dans l'ancien outil, Size est à 3 pour cette partie alors que dans le nouvel outil il n'y a que deux éléments : Prof-specialty et Armed-Forces.
C'est parce que pour l'instant, on prend en compte différemment le "defaultGroupIndex", je suis en train de regarder si on reste comme cela pour la nouvelle version ou pas.
Voici un ensemble de jeux de données artificielles pour lesquelles on fait varier le nombre de cellules du coclustering et le nombre de cluster pour chaque variable.
Lien de téléchargement : https://tf.orange.com/d/39e5245213324fe0b5cd/
Pour comprendre les limites de l’algo, ce serait intéressant de voir comment le temps de calcul du fichier json d’un coclustering évolue en fonction de la taille du coclustering.
Egalement de voir si le repliement fonctionne avec toutes les tailles de coclustering.
Pour ces jeux de données on a un nombre total d’instances constant (1 million).
Les données sont générées selon un coclustering diagonal : les cellules les plus remplies sont sur la diagonale.
On ajoute un bruit qui permet de remplir un peu les cellules hors de la diagonale.
On fait varier la dimension du coclustering : 50 par 50 à 200 par 200.
Cela donne un nombre de cellules qui varie de 2500 à environ 30 000.
Le nommage des fichiers de coclustering se fait selon le schéma suivant :
N : nombre d’instances
C : nombre de clusters par variable
V : nombre de modalites par cluster de la diagonale
L : longueur du nom des modalites
Ce nombre de cellules correspond au nombre total de cellules dans la grille calculé comme le produit
Du nombre de clusters par ligne et du nombre de cluster par colonne (ce que tu as dans la colonne Number of clusters du tableau tout en bas)
Ici : 7 * 7 = 49
Différent du « Number of clusters » qui est la somme des nombres de clusters ici 7 + 7 = 14
Pour déployer, renseigner la conf :
TRACKER: {
ENABLE: false,
SITE_ID: '',
TRACKER_URL: 'https://matomo.apps.tech.orange/'
}
et ne pas oublier d'afficher la popup de cookie consent :
.cc-floating.cc-theme-classic {
display: none;
}
By default, display Hierarchy, Composition, Dimensions and Co-occurences views for the Axis tab
Affichage d'une info indiquant que le calcul est en cours (save current hierachy as, unfold hierarchy)
Pour certaines bases de données, les temps de calcul associés à "Unfold hierarchy" ou "Save current hierarchy as" peuvent prendre quelques secondes. Serait il possible d'afficher alors une information à l'utilisateur indiquant que le calcul est en cours.
Exemple avec l'ancien outil : affichage d'un sablier
The "external data" functionality doesn't work when text field includes tab or new lines.
For the external data given in the zip, the new version of KCV differs from the old version for "Some-college" external text (only the text of the first line) and "Masters" text (no tab)
ExternalData.zip
The description of the format used for external data files is described here :
The external data files are tab-separated value files. The text type has a special format. This format allows you to display multiple lines in a text field for an item.
All characters are allowed, however three characters have a special role:
• The field separator : “\t” (tab)
• The new line character : “\n” (eol)
• The beginning or end of field indicator : «"» (double-quote)
If a field contains the tab character and/or the new line character, this field must be surrounded by two double-quotes «"». If a field contains the double-quote character, this character must be doubled.
Au niveau du champ ""dimensionHierarchies", l'ordre des clusters est modifié lors d'un repliement.
Le cluster issu du repliement devient un cluster avec le statut de feuille ("isLeaf": true) et il doit être inséré dans le haut de la liste avec les autres clusters qui ont ce statut. Son insertion doit être telle que les clusters qui ont le statut de feuille soient ordonnés par valeur croissante de leur champ "rank".
Exemple pour le repliement de B16 pour la variable education dans le coclustering de la base Adult avec education et occupation.
{
"name": "education",
"type": "Categorical",
"clusters": [
{
"cluster": "{Bachelors}",
"parentCluster": "B5",
"frequency": 5119,
"interest": 0.962215,
"hierarchicalLevel": 1,
"rank": 1,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "{Masters}",
"parentCluster": "B9",
"frequency": 1697,
"interest": 0.911231,
"hierarchicalLevel": 1,
"rank": 3,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "{Prof-school, Doctorate}",
"parentCluster": "B9",
"frequency": 877,
"interest": 0.841216,
"hierarchicalLevel": 1,
"rank": 5,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "{HS-grad}",
"parentCluster": "B6",
"frequency": 10330,
"interest": 1,
"hierarchicalLevel": 1,
"rank": 7,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "{11th, 10th, 9th, ...}",
"parentCluster": "B14",
"frequency": 2878,
"interest": 0.814339,
"hierarchicalLevel": 1,
"rank": 9,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "{7th-8th, 5th-6th, 1st-4th, ...}",
"parentCluster": "B14",
"frequency": 724,
"interest": 0.459961,
"hierarchicalLevel": 1,
"rank": 11,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "{Some-college}",
"parentCluster": "B12",
"frequency": 7219,
"interest": 0.659754,
"hierarchicalLevel": 1,
"rank": 13,
"hierarchicalRank": 18,
"isLeaf": true
},
{
"cluster": "B16",
"parentCluster": "B12",
"frequency": 2423,
"interest": 0.365675,
"hierarchicalLevel": 0.996015,
"rank": 16,
"hierarchicalRank": 17,
"isLeaf": true
},
le cluster replié doit être inséré ici, en dernière position des clusters "isLeaf" : true car ayant le rang le plus élevé parmi ces clusters. Dans le fichier produit actuellement il est à la toute fin de la liste avec les clusters "isLeaf: false
{
"cluster": "B5",
"parentCluster": "B2",
"frequency": 7693,
"interest": 0.937174,
"hierarchicalLevel": 0.789074,
"rank": 2,
"hierarchicalRank": 6,
"isLeaf": false
},
{
"cluster": "B9",
"parentCluster": "B5",
"frequency": 2574,
"interest": 0.887376,
"hierarchicalLevel": 0.932314,
"rank": 4,
"hierarchicalRank": 10,
"isLeaf": false
},
{
"cluster": "B2",
"parentCluster": "",
"frequency": 31267,
"interest": 0.827235,
"hierarchicalLevel": -0.00237915,
"rank": 6,
"hierarchicalRank": 3,
"isLeaf": false
},
{
"cluster": "B6",
"parentCluster": "B4",
"frequency": 13932,
"interest": 0.933583,
"hierarchicalLevel": 0.855416,
"rank": 8,
"hierarchicalRank": 7,
"isLeaf": false
},
{
"cluster": "B14",
"parentCluster": "B6",
"frequency": 3602,
"interest": 0.743109,
"hierarchicalLevel": 0.991215,
"rank": 10,
"hierarchicalRank": 15,
"isLeaf": false
},
{
"cluster": "B4",
"parentCluster": "B2",
"frequency": 23574,
"interest": 0.791358,
"hierarchicalLevel": 0.651432,
"rank": 12,
"hierarchicalRank": 5,
"isLeaf": false
},
{
"cluster": "B12",
"parentCluster": "B4",
"frequency": 9642,
"interest": 0.585853,
"hierarchicalLevel": 0.972126,
"rank": 14,
"hierarchicalRank": 13,
"isLeaf": false
}
]
}
In the old version of KCV, there was two ways to select a cluster from the histogram :
Extract of KCV guide :
"When a cluster is selected in a hierarchy, its corresponding bar is highlighted in the histogram. You can select another cluster directly on the Distribution in two ways:
• by clicking on a bar of the histogram,
• by navigating in the bar chart with arrow keys."
It is technically possible and not too time consuming, it would be interesting to add the second way in the new version of KCV "by navigating in the bar chart with arrow keys"
Il s'agit d'ajouter un graphique représentant le taux d'information d'un coclustering replié par rapport au coclustering optimal en fonction de son nombre de clusters. Ci-joint la vue obtenue avec l'ancien outil.
Pour le coclustering optimal, le taux d'information vaut 100%. Pour un coclustering replié, le taux d'information est égal à la valeur du champ "HierarchicalLevel" du dernier cluster agrégé lors du repliement. Ce taux est compris entre 0 et 100 et est arrondi avec une décimale. Cas particulier : quand un hierarchicalLevel est négatif, on affiche 0.
Exemple sur Adult2vars
Number of clusters | Information | Fichier json |
---|---|---|
18 | 100 | |
17 | 99,6 | hierarchicalLevel du cluster B16 : "hierarchicalLevel":0.996015 |
16 | 99,2 | hierarchicalLevel du cluster A15 : "hierarchicalLevel": 0.992157 |
15 | 99,1 | hierarchicalLevel du cluster B14 : "hierarchicalLevel": 0.991215 |
... | ... | ... |
2 | 0 (seuillé à zéro) | hierarchicalLevel négatif du cluster B2 : "hierarchicalLevel": -0.00237915 |
1 | 0 | hierarchicalLevel du cluster A1 : "hierarchicalLevel": 0 |
Le type d'encodage utilisé dans les données est décrit par le tag "khiops_encoding" (au même niveau que "tool" à la racine). Si la valeur de ce tag "khiops_encoding" est "colliding_ansi_utf8", il faudrait afficher un warning : "The coclustering model was built using data with both Ansi and Utf8 encodings. The display may be corrupted and not fully correspond to the model." Ce warning doit par exemple s'afficher dans le cas joint.AnsiLatin_Coclustering.khcj
Premier pavé :
Graphique 1
Graphique 2 :
In the "current clusters" table, for a categorical variable, the "size" column should contains the total number of elements in the considererd cluster. For the display, the name of the cluster contains only the name of the 3 first element and "...".
But the true number of element must be displayed in the "size" column.
Example : Nova data.
The first cluster has 152 elements.
Its name is {158,6233,1199,...} : it displays only the three first elements + "..."
The number of elements of the cluster is the size of "valueFrequencies" or "valueTypicalites" in the json file (description of valueGroups).
NovaCoclustering.zip
When using "unfold hierarchy" with a simplified coclustering, it seems that the displayed number of cluster is the initial number of parts and not the number of parts after simplification.
Simplification d'un coclustering:
. simplification du coclustering en se limitant à au total 4 parties, ce qui donne lieu à une matrice 4x4
. la simplification batch semble produire le résultat corectement
. la covisualisation semble correcte
. par contre, la fenêtre "Unfold hierarchy" est buguée
. elle affiche les courbes d'information rate de de Nb of clusters per dimension jusqu'au jusqu'au "initialParts" au lieu de s'arrêter aux "parts",
qui sont issus de la simplification
Correction probable dans l'outil de covisualisation:
. se limiter au "part" (égaux aux "initialParts" au départ) dans la fenêtre de "Unfold hierarchy"
. suggestion de détail de renommage de libellé dans cette fenetre:
. renommer "numberOfCluster" en "Number of clusters" (le nombre de partie couramment affichés)
. renommer "maxNumberOfCluster" en "Max number of clusters" (le nombre total de clusters disponibles (parts),
initialement (parts=initialParts) ou après simplification (parts<=initialParts)
BugSimplifySpliceJunction.zip
Lors de la sauvegarde du fichier json associé à un coclustering replié, le champ "initialParts" doit conserver la valeur qu'il avait dans le fichier json du coclustering d'origine.
ouvrir le fichier
unfold hierarchy : passer à 2x3 clusters ===> "Composition" bien renseigné
unfold hierarchy : revenir à 8x5
manage views : fermer "Composition"
unfold hierarchy : passer à 2x3 clusters
manage views : ouvrir "Composition" ===> No data
(idem pour "Distribution")
Version: 10.2.2
Khiops lib version: 1.4.8
A functionality described in the KCV guide, paragraph "Composition" doesn't work with KCV new version :
"A double -click on a line shows the composition of the cluster containing this item. Accordingly, it modifies the selected cluster in the hierarchy view. "
Example : coclustering for Adult with education and occupation.
cluster initially selected in the hierarchy "A2"
With the old version : when the line "7th-8th ..." line is double-clicked in the composition table then the cluster selected in the hierarchy and in the current cluster table is modified.
Before double-clicking :
After double-clicking :
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.