PowerPoint is huge on a second monitor

If you are running Windows 10 and you have a high-DPI monitor such as in a Surface Pro 3, and connect to a second monitor using a Mini-DisplayPort adapter, then open PowerPoint, its very likely that you will find this:

PowerPoint DPI problems Surface Pro 3, Windows 10, Office 365

If you haven’t seem the problem personally, it might be difficult to guess from the picture what is going on. The problem is that PowerPoint’s Ribbon is huge given that it is running in a 21″ monitor and not in a tablet anymore.

The problem doesn’t seem to occur with Word or Excel when they are transposed from the Surface screen to the external monitor. It seems to be exclusively related to PowerPoint.

Hopefully, there is a solution for this problem. If you have Office 365, open the file

C:Program FilesMicrosoft Office 15rootoffice15powerpnt.exe.manifest

Using a text editor. Then, look for word True/PM in the following block:

And change it to:

Now save and open PowerPoint. PowerPoint should not auto-scale properly when you transpose its window from the Surface Pro 3 screen and to external monitor, and vice-versa:

PowerPoint Windows 10 Surface Pro 3 - normal DPI


Decision Trees in C#


Decision trees are simple predictive models which map input attributes to a target value using simple conditional rules. Trees are commonly used in problems whose solutions must be readily understandable or explainable by humans, such as in computer-aided diagnostics and credit analysis.


Decision Trees give a direct and intuitive way for obtaining the classification of a new instance from a set of simple rules. Because of this characteristic, decision trees find wide use in situations in which the interpretation of the obtained results and of the reasoning process is crucial, such as in computer-aided diagnostics (CAD) and in financial credit analysis. Consumer credit analysis is an interesting example because, in many countries, one can not simply reject credit without giving a justification, justification of which is trivial to extract from a decision tree.

The tree on the right has been generated using the Context Free software based on the grammar shared by davdrn.

Learning decision trees

Decision trees can be simply drawn by hand based on any prior knowledge the author may have. However, their real power becomes apparent when trees are learned automatically, through some learning algorithm.

The most notable and classics examples to decision tree learning are the algorithms ID3 (Quinlan, 1986) and the C4.5 (Quinlan, 1993). Both are examples of greedy algorithms, performing local optimum decisions in the hope of producing a most general tree. Such algorithms are based on the principle of the Occam’s razor, favoring simpler or smaller trees in the hope that such smaller trees could retain more generalization power. This preference is formalized through the specification of an hypothesis ordering criteria such as the information gain. The information gain measures the, as the name implies, gain of information in using each of the attributes as a next factor to consider during decision. The information gain can be defined as:



However, the information gain has a bias towards attributes with a high number of possible values (Mitchell, 1997). A way to overcome this bias is to select new selection attributes based on alternative criteria, such as the gain ratio (Quinlan, 1986), defined as:



In the GainRatio, the SplitInformation term attenuates the importance given to attributes with many, uniformly distributed, possible values.

Iterative Dichotomizer 3 (ID3)

The algorithm presented below is a slightly different version of the original ID3 algorithm as presented by Quinlan. The modifications are to support multiple output labels. In each recursion of the algorithm, the attribute which bests classifiers the set of instances (or examples, or input-output pairs, or data) is selected according to some selection criteria, such as the InfoGain or the GainRatio.

  • ID3(instances, target_attribute, attributes)
    • Create a new root node to the tree.
    • If all instances have the target_attribute belonging to the same class c,
      • Return the tree with single root node with label c.
    • If attributes is empty, then
      • Return the tree with single root node with the most common label of the target_attribute in instances.
    • Else
      • A ← the attribute in attributes which best classifies instances
      • root decision attribute ← A
      • Foreach possible value vi of A,
        • Add a new ramification below root, corresponding to the test A = vi
        • Let instancesvi be the subset of instances with the value vi for A
        • If instancesvi is empty then
          • Below this ramification, add a new leaf node with the most common value of target_attribute in instances.
        • Else below this ramification, add the subtree given by the recursion:
          ID3(instancesvi, target_attribute, attributes – { A })
    • End
  • Return root

Difficulties and disadvantages of decision tree learning

Despite relying on the Occam’s Razor to guide the learning, neither ID3 or C4.5 algorithms are not guaranteed to produce the smaller or more general tree possible. This happens because their learning is based solely on heuristics and not in truly optimality criteria. The following example, from (Esmeir & Markovitch, 2007) illustrates the learning of the concept xor (exclusive or) by the ID3 algorithm. In this example, A3 and A4 are irrelevant attributes, having absolutely no influence on the target answer. However, yet being irrelevant, ID3 will select one of them to belong to the tree. In fact, ID3 will select the irrelevant attribute A4 to be the root of the learned tree.

A1 A2 A3 A4 label
1 0 0 1 +
0 1 0 0 +
0 0 0 0
1 1 0 0
0 1 1 1 +
0 0 1 1
1 0 1 1 +

One complication of decision tree learning is that the problem to find the smaller consistent tree (in the sense of classifying correctly all training samples) is known to be NP-complete (Hyafil & Rivest, 1976). Moreover, the separating decision surface generated by such trees are always formed by parallel cuts alongside the attribute space axis, which could be a severely suboptimal solution (Bishop, 2007, p. 666). The example given by Bishop illustrates well this problem: for example, to separate classes whose optimum decision margin are on 45 degrees from one of the axis, it will be needed a high number of parallel cuts in comparison with a single cut on the diagonal such as could be given by any linear decision machine. Another disadvantage of traditional decision tree learning algorithms is that most methods require only a constant learning time, and, as such, do not allow for trading extra training time for a better solutions. The work of (Esmeir & Markovitch, 2007) is dedicated to overcome such problem.

The following picture shows an example on how learning by decision trees is limited to cuts parallel to the axis, as described by Bishop. The Ying-Yang classification problem is a classical example of a non-linearly separable decision problem. Decision trees, albeit not being linear classifiers, have difficulty classifying this set with simple thresholds.


Top-Left: Ying-Yang non-linear classification problem. Top-Right: Decision surface extracted by a decision tree. Bottom: Decision threshold rules extracted from the tree.

However, despite all of those shortcomings, decision trees plays major roles as base of many successful algorithms. One interesting application and of notorious success is given in the field of object detection in images. The first real-time face detecting algorithm (Viola & Jones, 2001) is based on a degenerated decision tree (also known as a cascade). The body recognition and segmentation algorithm used by the Xbox 360 gaming platform used to process depth images generated by its companion sensor Kinect is equally based on the use of decision trees (Shotton, et al., 2011). As well is the case of the FAST algorithm for interest point detection in images (Rosten & Drummond, 2006).

I should also make the note that both the Viola-Jones and the FAST algorithms are available in the Accord.NET Framework for immediate use (the Viola-Jones (HaarObjectDetector) has also been recently updated to support multiple threads, so feel free to take a look and experiment with it!).

In sum, its possible to say that great part of the applicability of decision trees came from the simple fact that they are extremely fast to evaluate. One of the reasons for this feature is being easily translated to sets of conditional instructions in a conventional computer program. The decision trees now available in the Accord.NET Framework make full use of this fact and enables the user to actually compile the decision trees to native code on-the-fly, augmenting even more its performance during classification.

Source code

The code presented in this section is actually part of the Accord.NET Framework. The Accord.NET Framework is a framework extension to the already very popular AForge.NET Framework, adding and providing new algorithms and techniques for machine learning, computer vision and even more.

The Accord.MachineLearning.DecisionTree namespace is comprised of the following classes:

  • DecisionTree, the main class representing a decision tree, with methods such as Compute to compute the tree classification given an input vector;
  • DecisionNode, the node class for the decision tree, which may or may not have children nodes contained under a collection of children represented by a DecisionBranchNodeCollection;
  • DecisionVariable, a class to specify the nature of each variable processable by the tree, such as if the variable is continuous, discrete, which are their expected or valid ranges;
  • DecisionBranchNodeCollection, a class to contain children nodes together with information about which attribute of the data should be compared with the child nodes during reasoning.


Whose relationships can be seen in the following class diagram:

class diagram

The learning algorithms available are either the ID3 algorithm discussed above, or its improved version C4.5 (which can handle continuous variables, but at this time does not yet support pruning), both proposed and published by Ross Quinlan.


Despite the bit complicated look, usage is rather simple as it will be shown in the next section.

Using the code

Consider, for example, the famous Play Tennis example by Tom Mitchell (1998):

In the aforementioned example, one would like to infer if a person would play tennis or not based solely on four input variables. Those variables are all categorical, meaning that there is no order between the possible values for the variable (i.e. there is no order relationship between Sunny and Rain, one is not bigger nor smaller than the other, but are just distinct). Moreover, the rows, or instances presented above represent days on which the behavior of the person has been registered and annotated, pretty much building our set of observation instances for learning.

In order to try to learn a decision tree, we will first convert this problem to a more simpler representation. Since all variables are categories, it does not matter if they are represented as strings, or numbers, since both are just symbols for the event they represent. Since numbers are more easily representable than text string, we will convert the problem to use a discrete alphabet through the use of a codebook.

A codebook effectively transforms any distinct possible value for a variable into an integer symbol. For example, “Sunny” could as well be represented by the integer label 0, “Overcast” by “1”, Rain by “2”, and the same goes by for the other variables. So:

Now we should specify our decision tree. We will be trying to build a tree to predict the last column, entitled “PlayTennis”. For this, we will be using the “Outlook”, “Temperature”, “Humidity” and “Wind” as predictors (variables which will we will use for our decision). Since those are categorical, we must specify, at the moment of creation of our tree, the characteristics of each of those variables. So:

Let’s now proceed and create our DecisionTree:

Now we have created our decision tree. Unfortunately, it is not really very useful, since we haven’t taught it the problem we are trying to predict. So now we must instantiate a learning algorithm to make it useful. For this task, in which we have only categorical variables, the simplest choice is to use the ID3 algorithm by Quinlan. Let’s do it:

At this point, the tree has been created. In order to ask the tree to classify new samples, we can use:

Please note that, in case any of the steps in this post doesn’t work out, it might be because the most up-to-date version in the Accord.NET Framework may have undergone some changes. In this case, please refer to the official documentation at the Accord.NET website.

Going further, a suitable representation of the learned tree could be given by the following diagram:


However, more than just a diagram, we can also go and generate a .NET Expression Tree describing our decision tree. Expression trees represent code in the form of a tree of expressions, which can then be read, modified or compiled. By compiling the DecisionTree‘s expression, we are able to generate code on-the-fly and let the JIT compile it down to native code at runtime, greatly improving the performance of our decision tree:

And here is the resulting C# code obtained by compiling the expression into a lambda function, dumping the function into an dynamic assembly, opening and inspecting this assembly using ILSpy:


Decision trees are useful tools when the problem to be solved needs to be quickly interpreted and understood by humans. Another suitable use is when the decision needs to be fast. However, decision trees, at least those trained by simple training algorithms such as ID3 and C4.5 can perform quite poorly depending on the problem. As it happens with all machine learning techniques, it is futile to believe there is a one true classifier which would act perfectly on all possible imaginable scenarios. As always, it is important to know our tools and know in which situation each technique would work better.


  • Bishop, C. M., 2007. Pattern Recognition and Machine Learning (Information Science and Statistics). 1st ed. 2006. Corr. 2nd printing ed. s.l.:Springer
  • Fayyad, U. M. & Irani, K. B., 1992. On the Handling of Continuous-Valued Attributes in Decision Tree Generation. Machine Learning, January, 8(1), pp. 87-102.
  • Quinlan, J. R., 1986. Induction of decision trees. Machine Learning, 1(1), pp. 81-106.
  • Quinlan, J. R., 1993. C4.5: Programs for Machine Learning (Morgan Kaufmann Series in Machine Learning). 1 ed. s.l.:Morgan Kaufmann.
  • Shotton, J. et al., 2011. Real-Time Human Pose Recognition in Parts from Single Depth Images. s.l., s.n.
  • Viola, P. & Jones, M., 2001. Robust Real-time Object Detection. s.l., s.n.
  • Mitchell, T. M., 1997. Decision Tree Learning. In:: Machine Learning (McGraw-Hill Series in Computer Science). s.l.:McGraw Hill.
  • Mitchell, T. M., 1997. Machine Learning (McGraw-Hill Series in Computer Science). Boston(MA): WCB/McGraw-Hill.
  • Esmeir, S. & Markovitch, S., 2007. Anytime Learning of Decision Trees. J. Mach. Learn. Res., May, Volume 8, pp. 891-933.
  • Hyafil, L. & Rivest, R. L., 1976. Constructing Optimal Binary Decision Trees is NP-complete. Information Processing Letters, 5(1), pp. 15-17.

Kernel Principal Component Analysis in C#


Kernel principal component analysis (kernel PCA) is an extension of principal component analysis (PCA) using techniques of kernel methods. Using a kernel, the originally linear operations of PCA are done in a reproducing kernel Hilbert space with a non-linear mapping.

The code presented here is also part of the Accord.NET Framework. The Accord.NET Framework is a framework for developing machine learning, computer vision, computer audition, statistics and math applications. It is based on the already excellent AForge.NET Framework. Please see the starting guide for mode details. The latest version of the framework includes the latest version of this code plus many other statistics and machine learning tools.

Analysis Overview

KPCA is an extension of PCA to non-linear distributions. Instead of directly doing a PCA, the original data points are mapped into a higher-dimensional (possibly infinite-dimensional) feature space defined by a (usually nonlinear) function φ through a mathematical process called the “kernel trick”.

The Kernel trick

The kernel trick is a very interesting technique, able to transform any algorithm that solely depends on the dot product between two vectors. To apply the trick, we replace all dot products in an algorithm with a kernel function. Thus, a linear algorithm can easily be transformed into a non-linear algorithm. This non-linear algorithm is equivalent to the linear algorithm operating in the range space of φ. However, because kernels are used, the φ function is never explicitly computed. This is desirable [8], as the high-dimensional space can have an arbitrary large dimensionality, or can be even infinite-dimensional (such as in the case the chosen kernel function is a Gaussian) and thus infeasible to compute.

Interesting video by Udi Aharoni demonstrating how points that are not linearly separable in a 2D space can almost always be linearly separated in a higher dimensional (3D) space.

Principal Components in Kernel Space

Like in PCA, the overall idea is to perform a transformation that will maximize the variance of the captured variables while minimizing the overall covariance between those variables. Using the kernel trick, the covariance matrix is substituted by the Kernel matrix and the analysis is carried analogously in feature space. An Eigen value decomposition is performed and the eigenvectors are sorted in ascending order of Eigen values, so those vectors may form a basis in feature space that explain most of the variance in the data on its first dimensions.

However, because the principal components are in feature space, we will not be directly performing dimensionality reduction. Suppose that the number of observations m exceeds the input dimensionality n. In linear PCA, we can find at most n nonzero Eigen values. On the other hand, using Kernel PCA we can find up to m nonzero Eigen values because we will be operating on a m x m kernel matrix[2].

A more detailed discussion can be seen in the works of Mika et al. (Kernel PCA and De-Noising in Feature Spaces) and Scholkopf et al. (Nonlinear Component Analysis as a Kernel Eigenvalue Problem). A more accessible explanation of the topic is also available in the work from Ian Fasel.

The pre-image problem

In standard PCA it was possible to revert the transformation, retrieving the original data points and enabling the use of PCA for compression* and denoising. However, as the results provided by kernel PCA live in some high dimensional feature space,  they need not have pre-images in input space. In fact, even if it exists, it also need be not unique.

Thus, in KPCA, it is only possible to obtain an approximate pre-image for a given set of patterns projected on the feature space. This problem can (and has) been tackled by many approaches, some of them of iterative nature, but some closed-form solutions also exists. Typically those solutions make use of the fact that distances in feature space are related to distances in input space. Thus, those solutions try to achieve an optimal transformation that can embed those feature points in input space respecting those distances relationships.

One of the first solutions of this form were proposed by Kwok and Tsang in their paper “The Pre-Image Problem in Kernel Methods". A better approach is also described by Bakir on his thesis “Extensions to Kernel Dependency Estimation”, alongside with a nice comprehensive description on various other methods for handling the pre-image problem.

Note: actually the use of KPCA for compression is a bit limited, since one needs to store the original data set to compute transformations and its approximate reversion.


Code Overview

Below is the main code behind KPCA. This is a direct, naive implementation of the algorithm that may not scale very well for very large datasets. It is implemented on top of the previous standard PCA code and thus on top of the AForge.NET Framework.


The main code behind the reversion of the projection. It is a direct, naive implementation of the closed-form solution algorithm as proposed by Kwok and Tsang. Currently it is completely not optimized, but it gives an better overview of the algorithm on its essential form. The source code available to download may be better optimized in the future.



Using the Code

As with PCA, code usage is simple. First, choose a kernel implementing the IKernel interface then pass it to the KernelPrincipalComponentAnalysis constructor together with the data points.

Then, simply call Compute() to perform the analysis. Once done, data about the analysis will be available through the object properties and transformations on additional data can be computed by calling Transform().


Sample Application

To demonstrate the use of KPCA, I created a simple Windows Forms Application which performs simple statistical analysis and KPCA transformations. It can also perform projection reversion by solving the approximate pre-image problem.

Scholkopf's KPCA Toy Example Kernel principal components detected by the KPCA Two first components detected by the KPCA

On left: Scholkopf Toy Example. Middle: Kernel principal components detected by the KPCA. Right: The two first dimensions obtained by the two first Kernel principal components.


Wikipedia's Example on KPCA Projection using a non-centered Gaussian kernel Reconstruction of the original data

Left: Wikipedia example. Middle: Projection using a non-centered Gaussian kernel. Right: Reconstruction of the original data using all Kernel principal components, showing some denoising ability.

Linear PCA as a special case

Lindsay Smith's PCA example data Linear Principal Component Analysis

Additionally we may check that linear PCA is indeed a special case of kernel PCA by using a linear kernel on the example by Lindsay Smith on his A Tutorial On Principal Component Analysis.


See also



Análise de Poder Discriminativo Através de Curvas ROC


Quando desenvolvemos sistemas, métodos ou testes que envolvem a detecção, diagnósticos ou previsão de resultados, é importante validar seus resultados de forma a quantificar seu poder discriminativo e identificar um procedimento ou método como bom ou não para determinada análise. No entanto, devemos levar em conta que a simples quantificação de acertos num grupo de teste não necessariamente reflete o quão eficiente um sistema é, pois essa quantificacao dependerá fundamentalmente da qualidade e distribuição dos dados neste grupo de teste.


Para exemplificar, tomemos o exemplo de um sistema para detecção de diabetes em pacientes, cuja saída é 1 ou 0 indicando se o paciente possui a condição ou não.  Agora, suponha que ao aplicamos este sistema num grupo de teste contendo 100 pacientes, dos quais já sabemos quais tem diabetes ou não, o sistema acerta 90% dos diagnósticos. Parece muito bom, não?

Não exatamente. O que não levamos em conta foi a distribuição da condição no grupo de teste. Revelamos agora que, no grupo de teste, 90% dos pacientes, na verdade, tinham a condição. O sistema, portanto, poderia simplesmente ter dito “1” a qualquer entrada apresentada, e mesmo assim, ainda conseguiria 90% de acerto já que os restantes 10% eram saudáveis. A esta altura, já não podemos ter a certeza de que o tal sistema seria tão bom assim.


Tabela de Contingência (matriz de confusão)

Para casos como este, outras medidas foram criadas a fim de desconsiderar eventuais desbalanceamentos nos grupos de teste. Antes de entrar nestas medidas, apresento-lhe a chamada tabela de contingência (ou matriz de confusão), que servirá de base para as demais medidas apresentadas. Seu funcionamento é simples: consideramos valores positivos que o sistema julgou positivos como verdadeiros positivos (acerto), valores positivos que o sistema julgou negativos como falso negativo (erro), valores negativos que o sistema julgou como negativos como verdadeiros negativos (acerto), e valores negativos que o sistema julgou positivos como falso positivos (erro).


A seguir, apresentamos algumas medidas dela derivadas.


    A proporção de predições corretas, sem levar em consideração o que é positivo e o que é negativo. Esta medida é altamente suscetivel a desbalanceamentos do conjunto de dados e pode facilmente induzir a uma conclusão errada sobre o desempenho do sistema.


            = (VP + VN) / (P + N)


    A proporção de verdadeiros positivos: a capacidade do sistema em predizer corretamente a condição para casos que realmente a têm.


             = VP / (VP + FN)


    A proporção de verdadeiros negativos: a capacidade do sistema em predizer corretamente a ausência da condição para casos que realmente não a têm.


             = VN / (VN + FP)


    A média aritmética da Sensibilidade e Especificidade. Na prática, a sensibilidade e a especificidade variam em direções opostas. Isto é, geralmente, quando um método é muito sensível a positivos, tende a gerar muitos falso-positivos, e vice-versa. Assim, um método de decisão perfeito (100 % de sensibilidade e 100% especificidade) raramente é alcançado, e um balanço entre ambos deve ser atingido.

    EFF = (SENS + ESPEC) / 2

Preditividade Positiva

Preditividade Negativa

Coeficiente de Correlação de Matthews – ou Coeficiente φ (phi)

    O coeficiente de correlação de Matthews é uma medida de qualidade de duas classificações binárias que pode ser usada mesmo se as classes possuem tamanhos bastante diferentes. Retorna um valor entre −1 e +1, em que um coeficiente de +1 representa uma predicao perfeita, 0 uma predicao aleatoria media, e –1 uma predicao inversa. Esta estatistica é equivalente ao coeficiente phi, e tenta, assim como a eficiência, resumir a qualidade da tabela de contingência em um único valor numérico passivel de ser comparado.

    MCC = φ = (VP*VN – FP*FN) / sqrt((VP + FP)*(VP + FN)*(VN + FP)*(VN + FN))

    Note que, se qualquer uma das somas no denominador for igual a zero, o denominador pode ser considerado 1, resutando num MCC igual a 0 que seria o limite correto para esta situação.


A Curva de Receiver Operating Characteristic (ROC)

A curva ROC (ou curva de ROC) foi desenvolvida por engenheiros elétricos e engenheiros de sistemas de radar durante a Segunda Guerra Mundial para detecter objetos inimigos em campos de batalha, tambem conhecida como teoria de detecção de sinais. A análise ROC tem sido utilizada em medicina, radiologia, psicologia e outras areas por muitas décadas e, mais recentemente, foi introduzida à áreas como aprendizado de máquina e mineracao de dados.


Curvas ROC de diferentes classificadores

Como o resultado de sistemas de classificação em classes geralmente são contínuos, ou seja, produzem um valor situado dentro de um determinado intervalo contínuo, como [0;1], é necessário definir um ponto de corte, ou um limiar de decisão, para se classificar e contabilizar o número de predições positivas e negativas (como diagnósticos verdadeiros e falsos no caso de ocorrência de uma patologia). Como este limiar pode ser selecionado arbitrariamente, a melhor prática para se comparar o desempenho de diversos sistemas é estudar o efeito de seleção de diversos limiares sobre a saída dos dados.

Para cada ponto de corte são calculados valores de sensibilidade e especificidade, que podem então serem dispostos em um gráfico denominado curva ROC, que apresenta no eixo das ordenadas os valores de sensibilidade e nas abscissas o complemento da especificidade, ou seja, o valor (1-especificidade).


Um classificador perfeito corresponderia a uma linha horizontal no topo do gráfico, porém esta dificilmente será alcançada. Na prática, curvas consideradas boas estarão entre a linha diagonal e a linha perfeita, onde quanto maior a distância da linha diagonal, melhor o sistema. A linha diagonal indica uma classificação aleatória, ou seja, um sistema que aleatoriamente seleciona saídas como positivas ou negativas, como jogar uma moeda para cima e esperar cara ou coroa. Definitivamente, não é o tipo de sistema mais confiável possível. No entanto, um sistema cuja curva ROC esteja localizada abaixo da diagonal ainda pode ser convertido num bom sistema – basta inverter suas saídas e então sua curva também será invertida.

Uma medida padrão para a comparacao de sistemas é a área sob a curva (AUC), que pode ser obtida por métodos de integração numérica, como por exemplo, o método dos trapézios. Teoricamente, quanto maior a AUC, melhor o sistema.


Exemplo de como fazer uma curva ROC no Excel.


Calculando a área de uma curva ROC no Microsoft Excel®

    Coloque os pares sensibilidade e (1-especificidade) nas colunas A e B, respectivamente. Caso sejam 10 pontos (de A1 a B10), utilize a seguinte fórmula:


Determinando o melhor ponto de corte

Finalmente, a partir de uma curva ROC, devemos poder selecionar o melhor limiar de corte para obtermos o melhor desempenho possível. Para isto, podemos utilizar como parâmetro de comparação a medida de eficiência apresentada acima ou o valor φ (phi). Assim, podemos obter o limiar que apresente a melhor combinação de valores de especificidade e sensibilidade para o sistema.

Determinando o erro padrão no cálculo da área

O erro padrão de uma curva ROC se refere ao desvio padrão assumido ao aplicarmos nosso sistema a uma amostra da população do que se aplicássemos a população inteira. Esta medida parte do fato que, dependendo de quais amostras de uma população tomemos os valores para produzir nossa análise ROC, a área sob a curva poderá variar de acordo com a distribuição particular desta amostra.

O calculo do erro é, em certo ponto, simples, pois parte de apenas três valores conhecidos: a área A sob a curva ROC, o número Na de casos da amostra que apresentam a condição investigada (por exemplo, com diabetes) e o número Nn de casos que não a apresentam (sem).

ERRO = sqrt((A*(1 – A) + (Na– 1)*(Q1 – A²)+(Nn– 1)(Q2 – A²))/(Na * Nn))

em que:

    Q1 = A/(2 – A)
    Q2 = 2*A²/(1 + A)



Na segunda parte da versão em inglês deste artigo está disponível uma implementação de curvas ROC em C#, incluindo código-fonte e aplicativos de demonstração.


Guias Recomendados

Receiver Operating Curves: An Introduction – Excelente página sobre curvas ROC e suas aplicações. Inclui excelentes applets que permitem brincar com as curvas, compreender melhor seu funcionamento e seu significado. Direcionado tanto a quem busca uma rápida introdução ao tema quanto a pesquisadores já familiarizados com a área.



WIKIPEDIA, The Free Encyclopedia, “Receiver Operating Characteristic”, Disponível em: <http://en.wikipedia.org/wiki/Receiver_operating_characteristic> Acesso em: 07 jul. 2009.

SABATTINI, R. M. E.; “Um Programa para o Cálculo da Acurácia, Especificidade e Sensibilidade de Testes Médicos”; Revista Informédica, 2 (12): 19-21, 1995. Disponível em: <http://www.informaticamedica.org.br/informed/sensib.htm> Acesso em: 07 jul. 2009.

ANAESTHESTIST.COM, “Receiver Operating Curves: An Introduction”, Disponível em: <http://www.anaesthetist.com/mnm/stats/roc/Findex.htm> Acesso em: 13 jul. 2009.


Notícias Interessantes

BBC NEWS MAGAZINE, A scanner to detect terrorists; Artigo muito interessante sobre como estatísticas são mal interpretadas quando divulgadas pela mídia. “To find one terrorist in 3000 people, using a screen that works 90% of the time, you’ll end up detaining 300 people, one of whom might be your target”. Escrito por Michael Blastland.

Como Trocar a Bateria da CMOS de Notebooks HP


HP Pavilion DV6000-1 Num post anterior, discutimos sobre o problema de superaquecimento dos notebooks HP dv6000 e descrevemos como recuperamos e atenuamos o problema no nosso HP dv6109us. No entanto, ainda há algo neste assunto que me inqueta.


 Por que o problema sempre demora aproximadamente 1 ano e meio para surgir?


A impressão é que os aparelhos foram programados para dar problema após 13 ou 14 meses de uso. Na internet várias pessoas relatam o aparecimento de problemas na wireless após 13 meses, sendo que um mês depois, o notebook apaga e não liga mais.

Já ouvi histórias de que o superaquecimento primeiro causa falha no chipset nForce, e que por isso o wireless cai primeiro. Em seguida, o as soldas da GPU se dilatam até que uma hora trincam. Mas então, porque elas não trincaram logo nos primeiros meses de uso?

E se não estou enganado, o outro controlador que alegam apresentar problemas fica do outro lado da placa mãe, bem longe da GPU. Como o superaquecimento poderia se espalhar tao longe?

Bom, minha suspeita é a seguinte. O que dura cerca de 1 ano e meio na maioria dos computadores, assim que efetuada a compra, e que todo mundo tem de trocar um dia?


Bateria HP dv6000 descarregada
A bateria da CMOS.



Localização da Bateria CMOS em VerdeE adivinhem? Ela fica do lado do chipset nForce, do lado do WiFi. Meu palpite é que estes dois podem estar relacionados de alguma forma.


Pode ser que não tenha nada a ver, mas de qualquer maneira teremos que trocar nossa bateria pois ela se esgotou. Uma bateria CMOS descarregada num notebook é mais difícil de descobrir, pois o sintoma mais comum deste problema, o reset do relógio do sistema, so ocorrerá se o note estiver fora da energia, sem bateria e desconectado da internet (o Windows ajusta o relógio automaticamente pela internet de vez em quando). O máximo que poderá acontecer é o note atrasar algumas horas durante a noite.


Update: Bom, acho que na verdade pode não ter nada a ver mesmo 😛 Como alerta o visitante Diego, em seu comentário mais abaixo, a wireless não é controlada pelo south bridge nForce (MCP51), mas sim pelo problemático north bridge (cujas soldas trincam devido à fadiga térmica). Uma pena, pois teorias da conspiração são deveras mais legais!

Obs: se for realmente trocar a bateria, faça com o notebook completamente desligado. Retire a bateria (a grande principal, de alimentação) e desconecte o plugue da fonte, se ele estiver conectado.


Substituindo a Bateria De Seu Notebook HP Pavillion dv6000

Se você já substituiu uma bateria de um desktop comum pode achar que a bateria do notebook é diferente das que você está acostumado a trabalhar. Inclusive, há “assistências” que cobram de R$50 à R$90 reais para trocá-la, sem jamais contar ao cliente que uma bateria dessa pode ser comprada em qualquer relojoaria por R$3,70. Esse foi o valor que paguei na Cetra, em Vinhedo, que não é uma relojoaria mas sim uma loja de informática (e bem bacana por sinal).

A bateria é do tipo CR2032 comum, com a diferença que está com um conector colado para ser plugado diretamente na placa mãe.


Para começar, despluguamos a bateria da placa mãe e a descolamos a borrachinha branca que a prendia no lugar. Com um estilete, cortamos a capa mais externa com cuidado para não cortar os fios ou estragar o encape de plástico que circundava a bateria.

Bateria original HP dv6000Bateria original HP dv6000 

A seguir, fizemos um corte no disquinho de plástico para retirá-lo por inteiro.

Bateria original HP dv6000 desmontada 

Com a bateria nova, soldamos os conectores nos polos corretos, com o vermelho positivo indo no lado marcado por um sinal de “mais” na bateria. (soldar os conectores na bateria pode danificá-la, mas nós fizemos assim mesmo).

A seguir, transferimos o disquinho de plástico (que evita que os polos se toquem) para a bateria nova e verificamos com o multímetro se ela havia sobrevivido ao processo e nao estava em curto, que marcou 3.2v. É normal uma bateria nova marcar mais do que seu valor nominal, que seria de 3v.

Bateria nova HP dv6000 adaptada

Finalmente, encapamos a bateria novamente com fita isolante (de preferência use fita de autofusão), colamos a borracinha branca embaixo novamente e a conectamos à placa mãe, fixando no mesmo lugar de antes.


Com tudo novamente no lugar, voltamos a bateria e conectamos a fonte e ligamos o notebook. Em primeiro lugar, aguardamos o logo da HP aparecer na tela para então apertarmos F10 e entrarmos na BIOS. Ajustamos a hora correta, demos um “reset default settings” e em seguida um “save settings and reboot”. Ao entrar no Windows, verificamos que tudo estava (na medida do possível) em ordem.

Agora, precisávamos verificar se bateria estava realmente aguentando segurar as configurações. Desligamos o notebook completamente, removemos a bateria (a grande) e desconectamos a fonte de energia. Para remover quaisquer resquícios de energia, seguramos o botão power do notebook por cerca de 60 segundos e o deixamos quieto por mais uns 10 minutos sem nenhuma fonte de energia.

Após esperar este tempinho, tudo o que tínhamos a fazer era religar a bateria e a fonte e entrar na BIOS novamente para verificar se o relógio ainda estava regulado – é melhor entrar na BIOS antes de tentar ligar o sistema todo pois o Windows poderia ajustar o relógio automaticamente com um servidor de tempo na internet antes que pudéssemos conferir o resultado. Tudo estava em ordem 🙂

HP dv6000 não liga mais – o que fazer?


HP dv6000

De uma hora pra outra, seu notebook não ligou mais. Talvez ele já estivesse estranho, com o wireless deixando de funcionar. Algumas travadas, tela embaralhada; e algum tempo depois, veja só! Você tenta ligar, as luzes acendem por um tempo, se apagam, e o computador não liga.

Pois é, este é um problema bem conhecido, e de fato, quase todos modelos de notebook da HP que combinam processador AMD e chipset NVIDIA podem (ou irão) apresentá-lo.


A HP identificou um problema de hardware com alguns notebooks HP Pavilion séries dv2000/dv6000 e Compaq Presario séries V3000/V6000 e também lançou um novo BIOS para esses notebooks: versão F.39 para dv2000/dv6000 e versão F.3D para dv6000/V6000.


Conheci o problema depois que dv6109us da minha namorada parou com os mesmos sintomas. Segundo a etiqueta da HP na parte inferior do case, o modelo é o dv6109us, número de produto RN910UA#ABA que é no entanto referido no site da HP como dv6109om por alguma razão que desconheço. Possui um processador Turion 64 e um chipset de video (compartilhado) NVIDIA Go 6150.


Sobre o problema

NVIDIA No entanto, nos informamos melhor sobre este problema entre os HPs com processadores AMD e chipsets NVIDIA um tanto tarde, somente após o primeiro susto. Após um ano e meio de funcionamento, o notebook reiniciou umas duas vezes, e num instante apresentou a tela embaralhada. Depois disso, não ligou mais. O máximo que fazia era acender algumas luzinhas azuis para então morrer de novo, sem mostrar nada na tela.

O problema? O superaquecimento do chipset NVIDIA faz com que algumas de suas soldas trinquem e alguns pinos do chip se desconectem da placa mãe. Por sorte, na maioria dos casos não chega a danificar nenhum circuito.

Após uma breve procura na internet, vimos que não estávamos sozinhos: o problema da combinação HP+AMD+NVIDIA estava diretamente relacionada aos chips nvidia e afetava uma variedade de modelos de notebooks não somente da HP como da Dell, e estaria atingindo até mesmo desktops.

A HP lançou uma atualização de BIOS que tenta amenizar o problema, mas bem, se esta foi uma falha de projeto, não existirá software que o elimine completamente e certamente todos os modelos afetados estão fadados a falhar mais cedo ou mais tarde. É triste, mas é verdade. Além do mais, a solução encontrada pela HP para aliviar o problema não passa de uma gambiarra. É que notebooks desligam suas ventoinhas para economizar energia, e são muito bons no gerenciamento que fazem. As vezes operam com seus fans completamente desligados, e mesmo assim, ficam bem longe de queimar.

Mas para remediar o problema da NVIDIA, do qual a HP certamente não é a culpada, a HP fez a única coisa que estava a seu alcance: manter a ventoinha do processador ligada o tempo todo. Ótimo para os processadores, péssimo para sua bateria. Isso quer dizer que, se antes você achava que sua bateria durava pouco, acostume-se, pois agora ela vai durar muito menos. Mas pelo menos o computador vai funcionar um pouco mais 🙂

Sobre a extensão da garantia

Ao descobrir o problema, a HP extendeu a garantia destes produtos automaticamente em 2 anos e efetuou uma espécie de “recall” dos modelos atingidos. Infelizmente, no nosso caso não éramos elegíveis para o reparo gratuito pois a garantia HP se refere apenas ao país de origem, e nosso notebook era importado. Vale a pena ler o anuncio oficial da HP sobre a extensão da garantia e ligar no call center da HP do Brasil em 0800-709-7751 para mais informações se estiver na dúvida.

Procurando uma "assistência"

Na primeira vez, decidimos procurar uma assistência especializada que fazia este tipo reparo pois não queríamos arriscar perder de uma vez o que ainda tinha conserto. O "técnico" (na verdade deveria ser apenas um atendente muito mal informado, mas vamos lá) nos disse que poderia tentar reparar o componente mas que não havia garantia nenhuma do serviço, pois este era reincidente. Até ai tudo bem. Perguntei se ele poderia atualizar a BIOS para tentar solucionar de vez o problema mas, pelo jeito, o rapaz não sabia do que eu estava falando, já que disse que "não seria possível" e firmou-se em dizer que se eu "perdesse a senha da BIOS o computador não ligaria mais" (?). Ou o cara não queria correr o risco de fazer besteira, ou realmente queria que o problema aparecesse de novo para eu pagar novamente pelo serviço. Bom, deixei lá assim mesmo.

Alguns dias depois, o computador voltou. E funcionando! Por cerca de umas 2h o note realmente funcionou, até apagar de novo e voltar com o mesmo problema.


Bom, não adianta, é como diz o ditado: Se quer algo bem feito, então faça você mesmo!


Parte II: Faça você mesmo >>

HP dv6000 não liga mais – o que fazer? (parte II)


Parte II: Faça você mesmo!

A solução é simples. Se a solda soltou, é só soldar de novo! O problema é que não podemos usar um ferro de solda comum pois estamos lidando com SMDs, ou surface-mount devices, cujos pinos são tão minúsculos que um ferro de solda os grudaria todos juntos.BGA

Além do mais, o chipset é do tipo BGA, que requer uma técnica diferente para ressoldagem, conhecida como "solder reflow". Para fazê-la vamos precisar de um soprador térmico que chegue aos 250~300ºC, mas ja li relatos de pessoas que fizeram com o secador de cabelos, e no youtube tem gente que fez até com pavio. E parece que todos funcionaram. Não sei se tão bem quanto usando um soprador térmico como faremos aqui, mas para quem estiver disposto à arriscar… deve valer a tentativa!


Mas, se tivéssemos dinheiro, certamente compraríamos uma maquininha dessa aqui e aproveitaríamos para abrir uma empresa, pois há pessoas lucrando muito realizando este tipo de reparo nas centenas de notebooks HPs que falharam e ainda falham por aí!


Se você está decidido a tentar consertar seu próprio notebook e continuar lendo este artigo, primeiro leia com atenção o parágrafo abaixo. Continue lendo apenas se concordar com cada palavra escrita.

Antes de começar, leia com atenção:

Tenha em mente que, em nenhuma hipótese o autor desse blog poderá ser responsabilizado por danos diretos ou indiretos, especiais ou incidentais de qualquer natureza resultante ou em conexão com o uso ou execução de informações disponíveis neste site. Assim sendo, o autor não se responsabiliza por qualquer decisão ou medida adotada com base em informação contida neste website, e tampouco por prejuízos daí decorrentes. Como as informações contidas neste site poderão ser atualizadas ou modificadas em qualquer momento e sem prévio aviso, não devem ser interpretadas como definitivas. Lembre-se: você esta sob sua própria conta e risco. E no caso de qualquer problema ou acidente, a responsabilidade é exclusivamente sua. Se não concorda, não siga este material, pois ele não foi feito para ser seguido.

Isto não é um tutorial nem um guia, apenas um relato de como recuperamos nosso aparelho. As informações aqui disponíveis são destinadas exclusivamente para fins educacionais e/ou curiosidade.

E não se esqueça: A HP extendeu a garantia destes produtos automaticamente em 2 anos. Antes de tudo, tente acionar a garantia HP. Caso você tenha certeza de que é elegível para o reparo gratuito, tente ser mais firme quanto a isso na autorizada, ela não pode se negar a realizar o serviço. De uma olhada no anuncio oficial da HP sobre a extensão da garantia e tente ligar no call center da HP do Brasil em 0800-709-7751.

Algumas Precauções

Se mesmo assim decidir continuar, tenha certeza de tomar algumas preucauções. Certifique-se de estar livre de eletricidade estática enquanto manuseia placas de circuito. Se você não tem uma pulseira anti-estática, ao menos toque em uma superfície metálica de vez em quando ou, mais simples ainda, faça o manuseio das peças descalço (obviamente desligue-o da tomada e retire a bateria antes deste passo).

Também lembre de ter uma superfície limpa e com espaço suficiente para se trabalhar adequadamente. Outro requisito muito importante é ler o artigo por completo antes de tentar qualquer coisa, caso você decida consertar seu note você mesmo. Tente pesquisar mais sobre o assunto antes.

Material Necessário

Ao decorrer do reparo, fomos precisando dos seguintes itens:


Então, depois de pesquisar muito na internet, ler alguns fóruns e assistir alguns vídeos no youtube, finalmente criamos coragem e começamos a desmontar nosso notebook!

Parte III: Desmontando >>

HP dv6000 não liga mais – o que fazer? (parte III)


Parte III: Desmontando

Antes de começar, despluguamos a fonte de alimentação e removemos a bateria. Viramos o notebook de forma que a parte inferior estivesse voltada para nós e o apoiamos sob uma superfície macia para evitar arranhões na parte de cima. A luva do próprio notebook serviou perfeitamente para esta função.

Parte Inferior

Começamos retirando os parafusos da parte inferior do notebook. Há dois compartimentos em que não foi necessário retirar os parafusos, pois estes saem junto com as tampas e ficam seguros em suas posições. Em um destes compartimentos está o HD, no outro estão os módulos de memória e o WiFi.

Módulos de MemóriaHard Disk e WiFi

Para retirar o HD, o levantamos pela abinha de plastico e o guardamos longe de peças imantadas (como nossa chave philips). Para retirar as memórias, basta puxar as duas abinhas metálicas de forma a liberar os chips, que se inclinam 45º imediatamente e saem sem esforço. Para retirar o WiFi, desconectamos os cabinhos (o cinza da esquerda, o preto da direita) e retiramos seus parafusos. Como as memórias, o chip se inclina automaticamente e sai com facilidade.

Vista inferior HP dv6109us

Continuamos removendo todos os parafusos da parte inferior, incluindo os dois que estão ao lado do WiFi e o que está embaixo do HD. Na barrinha de plástico dentro do compartimento das memórias está escrito "remove" e há duas setinhas apontando os parafusos hexagonais que também devem ser retirados. Adaptamos uma chave para girá-los, mas um alicate pequeno também serviria.

Parafuso sob HD Drive de DVD

Após retirar o parafuso indicado em verde na imagem acima à direita, é possível retirar o drive de DVD. Ao retirar o drive, existem mais 3 parafusos escondidos na lateral do compartimento que devem ser retirados. Depois de retirarmos todos parafusos, inclusive aqueles que estavam no compartimento da bateria, pudemos virar o notebook para cima para começarmos a abrir e desencaixar a parte superior.


Painel frontal superior

Parte Superior

Começamos desencaixando (apenas desencaixando, não puxando, pois há cabos conectados) o painel frontal onde ficam os botões de power e volume. Em seguida, desencaixamos o teclado, prestando atenção no flat cable que o conectava à placa mãe (indicado em roxo na figura abaixo). Para retirá-lo, é necessário primeiro puxar as duas abinhas cinza escuro do conector para desprendê-lo, e só então puxar, sem fazer força.


Base do teclado


Agora já era possível retirar os cabos que ligam o painel superior apenas puxando-os de seus conectores, indicados em verde na figura acima. Desconectamos também o touchpad (conector pequeno ao lado do conector do teclado) da mesma maneira que fizemos anteriormente, primeiro desprendendo suas travinhas e em seguida desconectando o cabo, sem fazermos força.

Em sequência, retiramos o display e a peça de plástico do case que fica atrás dos parafusos do display. Esta peça prende a base de metal que protege a placa mãe. Retiramos todos os parafusos que prendem essa base de metal e aproveitamos para ir soltando o resto do case superior que, caso realmente tivéssemos tirado todos os parafusos da parte de baixo, estaria apenas encaixado na parte inferior. Foi preciso cuidado ao retirar ao display, pois os fiozinhos cinza e preto, que são a antena do WiFi, estavam presos a base de metal. O melhor foi mantê-los presos e retirar a base e o display juntos de uma vez.

Desparafusando o display Placa mãe ainda presa


Estávamos quase lá! Uma vez removida a base de metal sob o teclado, finalmente chegamos à placa mãe. Removemos o parafuso que segura o cooler, os dois sobre a pecinha de metal e os outros perto do controle remoto. Desencaixamos o suporte do controle remoto e levantamos a placa, que estava presa pelos cabos que vem da fonte de energia e pelo que vem dos plugs de audio. Desconectamos todos e retiramos a placa, tomando cuidado com os conectores que enroscavam na esquerda do case.

Retirando suporte do controle remotoPlaca mãe desencaixada


Pronto! A esta altura a placa mãe estava finalmente solta e pronta para ser manuseada.

Placa mãe HP dv6109us


Parte IV: Ressoldando! >>

HP dv6000 não liga mais – o que fazer? (parte IV)


Parte IV: Ressoldando!

Finalmente, a etapa em que traremos nosso notebook de volta à vida!

Antes de continuar, devo ressaltar novamente: se for seguir este material, tenha certeza de que quer fazer isto. Você pode danificar seu notebook para sempre e a única saída será comprar uma nova placa mãe, que custará em torno de R$1800. Fizemos este procedimento pois a garantia do produto já havia terminado, e como o produto era importado não o podíamos enviar para o recall, que se restringe ao país de origem (no nosso caso, os estados unidos). Este procedimento deve ser adotado apenas em última instância, se você não tiver medo de perder seu notebook ou se não tiver outra alternativa.

Cuidadosamente, retiramos o dissipador de calor da placa, primeiro desconectando o cabinho, depois removendo o parafuso acima da GPU e os outro quatro que guardam a CPU na sequência indicada (há os números 1-2-3-4 escritos perto de cada parafuso, você deve removê-los em ordem para evitar danos à CPU por pressão excessiva em apenas parte do chip). A GPU é o chipset gráfico que está nos causando problemas e está marcada em vermelho na figura da esquerda logo abaixo. Se houver uma borracinha colorida cobrindo a placa, a retire (e guarde) e você verá a palavra "NVIDIA" escrita no topo do circuito. Este quadradinho preto é conhecido como die e é também o núcleo do chip.

Chipset NVIDIA Geforce Go 6150 Processador AMD Turion 64

Continuando, destravamos o processador girando a travinha para a posição "open" e o guardamos num local seguro. Tenha certeza de estar livre de estática se fizer isso! Aproveite para limpar qualquer resquício de pasta térmica que esteja sob os dies do processador e da gpu com o pano macio e o álcool isopropílico (cuidado pois o álcool isopropílico é tóxico – esteja usando luvas e não o inale).

Agora iremos começar a ressoldagem da placa. Para isso, embrulhamos a placa mãe em papel alumínio usando duas voltas (como queremos manter o calor longe da placa, embrulhamos com a parte mais brilhante voltada para o lado de fora). Com a unha, marcamos a posição do chipset gráfico até cortar o papel, que se desprende com certa facilidade. Perto do chip, fixamos o papel junto da placa, mas no restante deixamos um colchão de ar entre ela e o alumínio. O resultado está na foto à seguir:

Pronta para o forno!


Estava chegando a hora de usarmos nosso soprador térmico. Para nossa sorte, no youtube há um video demonstrando essa etapa, detalhando todas as fases do processo. Bom, na verdade o vídeo é um tanto monótono, mas ao menos é bem completo! O ideal seria acompanhar as temperaturas usando um termômetro infravermelho, mas nos viramos sem um apenas seguindo o video.



Obs: Preste atenção nas temperaturas e não despreze as etapas de pré-aquecimento e resfriamento: se você subir a temperatura rápido demais, ou abaixar rápido demais, sua placa mãe ou seus componentes poderão trincar; e ai não terá mais volta! Abaixo está a descrição de cada etapa da ressoldagem:

1) Preheat ou pré-aquecimento, que consiste em gradualmente elevar a temperatura até a zona de pré-aquecimento em que os solventes serão evaporados da pasta de solda;

2) Flux Activation ou ativação do fluxo, que consiste em elevar a solda desidratada até uma temperatura em que ela se torne quimicamente ativada, permitindo que reaja com e remova óxidos e contaminantes da superfície;

3) Actual Reflow ou refluxo proproiamente dito, que consiste em elevar a temperatura até o ponto em que a solda derreta um filete de solda se forme entre o componente e a placa. A temperatura de pico deve ser significantemente superior que o ponto de derretimento da solda para assegurar uma boa liga, mas não tão alta para não danificar os componentes;

4) Cooldown ou resfriamento, que consiste em abaixar a temperatura em velocidade alta o suficiente para formar pequenos grãos que aumentam a resistência da solda mas também baixa o suficiente para evitar danos termomecânicos aos componentes, até que a solda se torne sólida de novo, formando uma boa liga metalúrgica entre os componentes e a placa.


Bom, no nosso caso, acabamos usando uma arminha um pouco mais potente do que o necessário pois era o que tínhamos à mão 🙂

Cozinhando à 300ºC! Solder reflow

Obs: Sim, isto é uma cozinha!


Terminado o processo, e com esperança de tudo ter dado certo, pudemos então tentar arrumar a origem do problema para que ele não ocorresse novamente!


Parte V: Corrigindo >>