精华内容
下载资源
问答
  • yolov3算法优点缺点_优点缺点

    千次阅读 2020-08-11 15:09:31
    yolov3算法优点缺点Naive Bayes: A classification algorithm under a supervised learning group based on Probabilistic logic. This is one of the simplest machine learning algorithms of all. Logistic ...

    yolov3算法优点缺点

    Naive Bayes: A classification algorithm under a supervised learning group based on Probabilistic logic. This is one of the simplest machine learning algorithms of all. Logistic regression is another classification algorithm that models posterior probability by learning input to output mapping and creates a discriminate model.

    朴素贝叶斯(Naive Bayes):一种基于概率逻辑的有监督学习小组下的分类算法。 这是所有最简单的机器学习算法之一。 Logistic回归是另一种分类算法,该算法通过学习输入到输出映射来建模后验概率并创建区分模型。

    • Conditional Probability

      条件概率
    • Independent events Vs. Mutually exclusive events

      独立事件与 互斥活动
    • Bayes theorem with example

      贝叶斯定理与例子
    • Naive Bayes Algorithm

      朴素贝叶斯算法
    • Laplace smoothing

      拉普拉斯平滑
    • Implementation of Naive Bayes Algorithm with Sci-kit learn

      朴素贝叶斯算法与Sci-kit学习的实现
    • Pros & Cons

      优点缺点
    • Summary

      摘要

    Conditional Probability

    条件概率

    Image for post

    Conditional Probability is a measure of the probability of an event occurring given that another event has occurred.

    条件概率是给定另一个事件已发生的情况下事件发生概率的度量。

    Suppose, Ramesh wants to play cricket but he has to do his work, so there are two conditions first one is Ramesh wanna play cricket P(A) and the second one is he has to do his work P(B). So what is the probability that he can play cricket given that he already has a work P(A|B).

    假设拉梅什想打板球,但他必须做他的工作,所以有两个条件,第一个条件是拉梅什想打板球P(A),第二个条件是他必须做自己的工作P(B)。 那么,如果他已经有作品P(A | B),那么他可以打板球的可能性是多少。

    例如(For example,)

    Event A is drawing a Queen first, and Event B is drawing a Queen second.

    事件A首先吸引女王,而事件B其次吸引女王。

    For the first card the chance of drawing a Queen is 4 out of 52 (there are 4 Queens in a deck of 52 cards):

    对于第一张牌,抽出一张女王的几率是52中的4(在52张牌中有4位皇后):

    P(A) = 4/52

    P(A)= 4/52

    But after removing a Queen from the deck the probability of the 2nd card drawn is less likely to be a Queen (only 3 of the 51 cards left are Queens):

    但是,从卡组中移除女王后,第二张被抽出的可能性就不太可能是女王(剩下的51张卡中只有3张是女王):

    P(B|A) = 3/51

    P(B | A)= 3/51

    And so:

    所以:

    P(A⋂B) = P(A) x P(B|A) = (4/52) x (3/51) = 12/2652 = 1/221

    P(A⋂B)= P(A)x P(B | A)=(4/52)x(3/51)= 12/2652 = 1/221

    So the chance of getting 2 Queens is 1 in 221 or about 0.5%

    因此,获得2个皇后的机会是221中的1个或约0.5%

    Independent events Vs. Mutually exclusive events

    独立事件与 互斥活动

    P(A|B) is said to be Independent events if and only if events are occurring without affecting each other. Both events can occur simultaneously.

    当且仅当事件发生而不相互影响时,才将P(A | B)称为独立事件。 这两个事件可以同时发生。

    P(A|B) = P(A)

    P(A | B)= P(A)

    P(B|A)=P(B)

    P(B | A)= P(B)

    Let suppose there are two dies D1 and D2

    假设有两个模具D1和D2

    P(D1 = 6 | D2 = 3) = P(D1 =6)

    P(D1 = 6 | D2 = 3)= P(D1 = 6)

    Then there is no relationship between both two events occurrence. Both of the events are independent of each other.

    这样,两个事件的发生之间就没有关系。 这两个事件彼此独立。

    There is no impact of getting 6 on D1 to getting 3 on D2

    在D1上获得6到D2上获得3的影响没有影响

    Two events are mutually exclusive or disjoint if they cannot both occur at the same time.

    如果两个事件不能同时发生,则它们是互斥或互斥的

    Suppose,

    假设,

    The event is on D1 we wanna get 3 and same on the D1 we can’t get 5 because we already got 3 on D1.

    该事件在D1上我们想要得到3,而在D1上我们同样不能得到5,因为我们已经在D1上得到3。

    P(A|B)=P(B|A)=0

    P(A | B)= P(B | A)= 0

    P(A ∩ B) = P(B ∩ A) = 0

    P(A∩B)= P(B∩A)= 0

    It means both the events are cannot occur simultaneously.

    这意味着两个事件不能同时发生。

    Bayes Theorem with example

    贝叶斯定理与例子

    Image for post
    Bayes Theorem Equations
    贝叶斯定理方程

    With this Image we can clearly see that the above given equation proved through the given steps.

    借助此图像,我们可以清楚地看到上述给定的方程式已通过给定的步骤得到证明。

    Suppose we have 3 machines A1,A2,A3 that produce an item given their probability & defective ratio.

    假设我们有3台机器A1,A2,A3,根据它们的概率和次品率来生产一件物品。

    p(A1) = 0.2

    p(A1)= 0.2

    p(A2) = 0.3

    p(A2)= 0.3

    p(A3) = 0.5

    p(A3)= 0.5

    B is representing defective

    B代表缺陷

    P(B|A1) = 0.05

    P(B | A1)= 0.05

    P(B|A2) = 0.03

    P(B | A2)= 0.03

    p(B|A3) = 0.01

    p(B | A3)= 0.01

    If an item is chosen as random then what is probability to be produced by Machine 3 given that item is defective (A3|B).

    如果将某个项目选择为随机项目,则机器3假定该项目有缺陷(A3 | B),那么该概率是多少。

    P(B) = P (B|A1) P(A1) + P (B|A2) P(A2) +P (B|A3) P(A3)

    P(B)= P(B | A1)P(A1)+ P(B | A2)P(A2)+ P(B | A3)P(A3)

    P(B) = (0.05) (0.2) + (0.03) (0.3) + (0.01) (0.5)

    P(B)=(0.05)(0.2)+(0.03)(0.3)+(0.01)(0.5)

    P(B) = 0.024

    P(B)= 0.024

    Here 24% of the total Output of the factory is defective.

    此处工厂总产量的24%有缺陷。

    P(A3|B) = P(B|A3) P(A3)/P(B)

    P(A3 | B)= P(B | A3)P(A3)/ P(B)

    = (0.01) (0.50) / 0.024

    =(0.01)(0.50)/ 0.024

    = 5/24

    = 5/24

    = 0.21

    = 0.21

    Naive Bayes Algorithm

    朴素贝叶斯算法

    Given a vector x of features n where x is an independent variable

    给定特征n的向量x ,其中x是自变量

    C is classes.

    C是类。

    P( Ck | x1, x2, … xn )

    P(Ck | x1,x2,…xn)

    P( Ck | x) = (P(x | Ck) *P(Ck) ) / P(x)

    P(Ck | x )=(P( x | Ck)* P(Ck))/ P( x )

    Suppose given we are solving classification problem then we have to find two conditional probability P(C1|x) and P(C2|x). Out of these two binary classification probability which is highest we use that as maximum posterior.

    假设给定我们正在解决分类问题,那么我们必须找到两个条件概率P(C1 | x)和P(C2 | x)。 在这两个最高的二元分类概率中,我们将其用作最大后验。

    P(Ck ,x1 , x2, …, xn)=P(x1 , x2, …, xn,Ck )

    P(Ck,x1,x2,...,xn)= P(x1,x2,...,xn,Ck)

    which can be rewritten as follows, using the chain rule for repeated applications of the definition of conditional probability:

    可以使用链式规则将其重写为条件概率定义的重复应用,如下所示:

    P(x1 , x2, …, xn,Ck ) = P(x1 | x2, …, xn, Ck) * P(x2, …, xn, Ck)

    P(x1,x2,...,xn,Ck)= P(x1 | x2,...,xn,Ck)* P(x2,...,xn,Ck)

    = P(x1 | x2, …, xn, Ck) * P(x2, | x3, …, xn, Ck) * P(x3, …, xn, Ck)

    = P(x1 | x2,…,xn,Ck)* P(x2,| x3,…,xn,Ck)* P(x3,…,xn,Ck)

    = ….

    =…。

    = P(x1 | x2, …, xn, Ck) * P(x2, | x3, …, xn, Ck) * P(xn-1, | xn, Ck)* P(xn | Ck)* P(Ck)

    = P(x1 | x2,…,xn,Ck)* P(x2,| x3,…,xn,Ck)* P(xn-1,| xn,Ck)* P(xn | Ck)* P(Ck )

    Assume that all features in x are mutually independent, conditional on the category Ck

    假设x中的所有要素都是相互独立的,且以类别Ck为条件

    P(xi, | xi+1, …, xn, Ck) = P(xi, | Ck).

    P(xi,| xi + 1,…,xn,Ck)= P(xi,| Ck)。

    Thus, the joint model can be expressed as

    因此,联合模型可以表示为

    Image for post

    z is a scaling factor dependent only on x1,……xn that is, a constant if the values of the variables are known

    z是仅取决于x1,…xn的比例因子,即,如果变量的值已知,则为常数

    The discussion so far has derived the independent feature model, that is, the naive Bayes probability model. The naive Bayes classifier combines this model with a decision rule. One common rule is to pick the hypothesis that is most probable; this is known as the maximum a posterior or MAP decision rule. The corresponding classifier, a Bayes classifier, is the function that assigns a class label

    到目前为止,讨论已经得出了独立的特征模型,即朴素的贝叶斯概率模型。 朴素的贝叶斯分类器将此模型与决策规则结合在一起。 一个普遍的规则是选择最可能的假设。 这称为最大后验MAP决策规则。 相应的分类器(贝叶斯分类器)是分配类标签的函数

    Image for post

    Example

    Say you have 1000 fruits which could be either ‘banana’, ‘orange’ or ‘other’. These are the 3 possible classes of the Y variable.

    假设您有1000种水果,可以是“香蕉”,“橙色”或“其他”。 这是Y变量的3种可能的类别。

    We have data for the following X variables, all of which are binary (1 or 0).

    我们具有以下X变量的数据,所有这些变量都是二进制的(1或0)。

    • Long

    • Sweet

    • Yellow

      黄色

    The first few rows of the training dataset look like this:

    训练数据集的前几行如下所示:

    Image for post
    Training dataset
    训练数据集

    For the sake of computing the probabilities, let’s aggregate the training data to form a counts table like this.

    为了计算概率,让我们汇总训练数据以形成这样的计数表。

    Image for post

    So the objective of the classifier is to predict if a given fruit is a ‘Banana’ or ‘Orange’ or ‘Other’ when only the 3 features (long, sweet and yellow) are known.

    因此,分类器的目的是在仅知道3个特征(长,甜和黄色)的情况下预测给定的水果是“香蕉”还是“橙色”或“其他”。

    Let’s say you are given a fruit that is: Long, Sweet and Yellow, can you predict what fruit it is?

    假设您得到的水果是:长,甜和黄色,您能预测它是什么水果吗?

    This is the same of predicting the Y when only the X variables in testing data are known. Let’s solve it by hand using Naive Bayes.

    这与仅知道测试数据中的X变量时预测Y相同。 让我们使用朴素贝叶斯解决它。

    The idea is to compute the 3 probabilities, that is the probability of the fruit being a banana, orange or other. Whichever fruit type gets the highest probability wins.

    这个想法是要计算3个概率,即水果是香蕉,橙子或其他的概率。 无论哪种水果获得最高的概率获胜。

    All the information to calculate these probabilities is present in the above tabulation.

    以上表格中列出了所有计算这些概率的信息。

    Step 1: Compute the ‘Prior’ probabilities for each of the class of fruits.

    步骤1:计算每种水果的“在先”概率。

    That is, the proportion of each fruit class out of all the fruits from the population. You can provide the ‘Priors’ from prior information about the population. Otherwise, it can be computed from the training data.

    也就是说,每种水果类别在人口中所有水果中所占的比例。 您可以从有关人口的先前信息中提供“优先”。 否则,可以根据训练数据进行计算。

    For this case, let’s compute from the training data. Out of 1000 records in training data, you have 500 Bananas, 300 Oranges and 200 Others. So the respective priors are 0.5, 0.3 and 0.2.

    对于这种情况,让我们根据训练数据进行计算。 在训练数据的1000条记录中,您有500个香蕉,300个橙子和200个其他。 因此,各个先验分别为0.5、0.3和0.2。

    P(Y=Banana) = 500 / 1000 = 0.50

    P(Y =香蕉)= 500/1000 = 0.50

    P(Y=Orange) = 300 / 1000 = 0.30

    P(Y =橙色)= 300/1000 = 0.30

    P(Y=Other) = 200 / 1000 = 0.20

    P(Y =其他)= 200/1000 = 0.20

    Step 2: Compute the probability of evidence that goes in the denominator.

    步骤2:计算进入分母的证据概率。

    This is nothing but the product of P of Xs for all X. This is an optional step because the denominator is the same for all the classes and so will not affect the probabilities.

    这不过是所有X的X的P的乘积。这是一个可选步骤,因为所有类的分母都相同,因此不会影响概率。

    P(x1=Long) = 500 / 1000 = 0.50

    P(x1 =长)= 500/1000 = 0.50

    P(x2=Sweet) = 650 / 1000 = 0.65

    P(x2 =甜)= 650/1000 = 0.65

    P(x3=Yellow) = 800 / 1000 = 0.80

    P(x3 =黄色)= 800/1000 = 0.80

    Step 3: Compute the probability of likelihood of evidences that goes in the numerator.

    步骤3:计算分子中证据出现的可能性。

    It is the product of conditional probabilities of the 3 features. If you refer back to the formula, it says P(X1 |Y=k). Here X1 is ‘Long’ and k is ‘Banana’. That means the probability the fruit is ‘Long’ given that it is a Banana. In the above table, you have 500 Bananas. Out of that 400 is long. So, P(Long | Banana) = 400/500 = 0.8.

    它是3个特征的条件概率的乘积。 如果回头看该公式,它将显示P(X1 | Y = k)。 X1是“长”,k是“香蕉”。 这意味着如果该水果是香蕉,则该水果“长”的概率。 在上表中,您有500个香蕉。 在这400个中很长。 因此,P(Long | Banana)= 400/500 = 0.8。

    Here, I have done it for Banana alone.

    在这里,我只为香蕉做过。

    Probability of Likelihood for Banana

    香蕉的可能性

    P(x1=Long | Y=Banana) = 400 / 500 = 0.80

    P(x1 =长| Y =香蕉)= 400/500 = 0.80

    P(x2=Sweet | Y=Banana) = 350 / 500 = 0.70

    P(x2 =甜| Y =香蕉)= 350/500 = 0.70

    P(x3=Yellow | Y=Banana) = 450 / 500 = 0.90

    P(x3 =黄色| Y =香蕉)= 450/500 = 0.90

    So, the overall probability of Likelihood of evidence for Banana = 0.8 * 0.7 * 0.9 = 0.504

    因此,香蕉证据的总体可能性为= 0.8 * 0.7 * 0.9 = 0.504

    Step 4: Substitute all the 3 equations into the Naive Bayes formula, to get the probability that it is a banana.

    步骤4:将所有三个方程式代入朴素贝叶斯公式,以得出它是香蕉的概率。

    Image for post

    Similarly, you can compute the probabilities for ‘Orange’ and ‘Other fruit’. The denominator is the same for all 3 cases, so it’s optional to compute.

    同样,您可以计算“橙色”和“其他水果”的概率。 这三种情况的分母都相同,因此计算是可选的。

    Clearly, Banana gets the highest probability, so that will be our predicted class.

    显然,香蕉获得的概率最高,因此这将是我们的预测类别。

    Laplace Smoothing

    拉普拉斯平滑

    In statistics, Laplace Smoothing is a technique to smooth categorical data. Laplace Smoothing is introduced to solve the problem of zero probability. Laplace smoothing is used to deal with overfitting of models. Suppose in the given dataset if a word is not present at test time then we find out P(C=”Yes”|Textq) =0 or P(C=”No”|Textq).

    在统计数据中,拉普拉斯平滑化是一种平滑分类数据的技术。 引入拉普拉斯平滑法来解决零概率问题。 拉普拉斯(Laplace)平滑用于处理模型的过拟合。 假设在给定的数据集中,如果单词在测试时不存在,那么我们找出P(C =“是” | Textq)= 0或P(C =“否” | Textq)。

    Textq={w1,w2,w3,w4,W}

    Textq = {w1,w2,w3,w4,W}

    In the given training data we have w1,w2,w3 and w4 . But we don’t have W in training data so if we run P(C=”Yes”|Textq) or P(C=”No”|Textq) it we got

    在给定的训练数据中,我们有w1,w2,w3和w4。 但是我们的训练数据中没有W,所以如果我们运行P(C =“是” | Textq)或P(C =“否” | Textq),我们得到

    P(C=”Yes”|Textq) =P(C=”No”|Textq)=0…………..condition (i)

    P(C =“是” | Textq)= P(C =“否” | Textq)= 0…………..条件(i)

    Because P(C=”Yes”|W) and P(C=”No”|W) we don’t have any probability value for this new word. So the value of probability is zero then ultimately our model is overfitting on train data because it can identify and classify the text which is available in the train data.

    因为P(C =“是” | W)和P(C =“否” | W),所以对于这个新单词我们没有任何概率值。 因此,概率值为零,则最终我们的模型对火车数据过度拟合,因为它可以识别和分类火车数据中可用的文本。

    If the given dataset is imbalanced then the data model is underfitting and biased towards the majority class. To overcome this situation we use two different for binary classification and give more weightage to minor class to Balanced dataset.

    如果给定的数据集不平衡,则数据模型不适合并且偏向多数类。 为了克服这种情况,我们对二进制分类使用两种不同的方法,并为“平衡”数据集的次要类赋予更大的权重。

    P(C=”Yes”) we have λ1

    P(C =“是”)我们有λ1

    P(C=”No”) we have λ2 …………………… condition (ii)

    P(C =“否”)我们有λ2……………………条件(ii)

    To deal with this condition (i) and condition (ii) we used Laplace smoothing.

    为了处理条件(i)和条件(ii),我们使用了拉普拉斯平滑。

    By applying this method, prior probability and conditional probability can be written as:

    通过应用此方法,先验概率和条件概率可以写为:

    Image for post

    K denotes the number of different values in y and A denotes the number of different values in aj. Usually lambda in the formula equals to 1.

    K表示y中不同值的数量,而A表示aj中不同值的数量 通常,公式中的lambda等于1。

    Image for post

    By applying Laplace Smoothing, the prior probability and conditional probability in previous example can be written as:

    通过应用拉普拉斯平滑,可以将前面示例中的先验概率和条件概率写为:

    Image for post

    Here λ is a hyper-parameter to deal with Overfitting and Underfitting of models.

    λ是一个超参数,用于处理模型的过拟合和欠拟合。

    When the value of λ Decreasing that time model is Overfitting because it gives less value to the new word or imbalance data.

    当“减少时间”的“λ值”为“过拟合”时,因为它给新单词或不平衡数据赋予的值较小。

    When the value of λ Increasing that time model is Underfitting.

    当“增加该时间”的“λ”值是“拟合不足”时。

    λ is used for tug-of-bar between Overfitting and Underfitting of models.

    λ用于模型的过拟合和欠拟合之间的拔河。

    Implementation of Naive Bayes in Sci-kit learn

    在Sci-kit中实施朴素贝叶斯学习

    Image for post

    Applications of Naive Bayes Algorithm

    朴素贝叶斯算法的应用

    1. Real-time Prediction: As Naive Bayes is super fast, it can be used for making predictions in real time.

      实时预测 :由于朴素贝叶斯非常快,因此可以用于实时预测。

    2. Multi-class Prediction: This algorithm can predict the posterior probability of multiple classes of the target variable.

      多类预测 :该算法可以预测目标变量的多类后验概率。

    3. Text classification/ Spam Filtering/ Sentiment Analysis: Naive Bayes classifiers are mostly used in text classification (due to their better results in multi-class problems and independence rule) have a higher success rate as compared to other algorithms. As a result, it is widely used in Spam filtering (identify spam email) and Sentiment Analysis (in social media analysis, to identify positive and negative customer sentiments)

      文本分类/垃圾邮件过滤/情感分析 :朴素贝叶斯分类器主要用于文本分类(由于它们在多类问题和独立性规则方面的更好结果)与其他算法相比具有较高的成功率。 因此,它被广泛用于垃圾邮件过滤(识别垃圾邮件)和情感分析(在社交媒体分析中,确定正面和负面的客户情绪)

    4. Recommendation System: Naive Bayes Classifier along with algorithms like Collaborative Filtering makes a Recommendation System that uses machine learning and data mining techniques to filter unseen information and predict whether a user would like a given resource or not.

      推荐系统 :朴素贝叶斯分类器与诸如协同过滤之类的算法一起构成了一个推荐系统,该推荐系统使用机器学习和数据挖掘技术来过滤看不见的信息并预测用户是否希望使用给定资源。

    优点缺点 (Pros &Cons)

    Pros:

    优点:

    • It is easy and fast to predict the class of test data sets. It also perform well in multi class prediction

      预测测试数据集的类别既容易又快速。 在多类别预测中也表现出色
    • When assumption of independence holds, a Naive Bayes classifier performs better compared to other models like logistic regression and you need less training data.

      如果保持独立性假设,那么与其他模型(例如逻辑回归)相比,朴素贝叶斯分类器的性能会更好,并且您需要的训练数据也更少。
    • It performs well in case of categorical input variables compared to numerical variable(s). For numerical variables, Gaussian normal distribution is assumed (bell curve, which is a strong assumption).

      与数字变量相比,在分类输入变量的情况下,它表现良好。 对于数值变量,假定为高斯正态分布(钟形曲线,这是一个很强的假设)。

    Cons:

    缺点:

    • If a categorical variable has a category (in test data set), which was not observed in training data set, then the model will assign a 0 (zero) probability and will be unable to make a prediction. This is often known as “Zero Frequency”. To solve this, we can use the smoothing technique. One of the simplest smoothing techniques is called Laplace estimation.

      如果分类变量具有一个类别(在测试数据集中),而该类别在训练数据集中没有被观察到,则该模型将分配0(零)概率,并且将无法进行预测。 这通常被称为“零频率”。 为了解决这个问题,我们可以使用平滑技术。 最简单的平滑技术之一称为拉普拉斯估计。
    • On the other side naive Bayes is also known as a bad estimator, so the probability outputs from predict_proba are not to be taken too seriously.

      另一方面,朴素的贝叶斯也被认为是一个不好的估计量,因此,predict_proba的概率输出不要太当真。
    • Another limitation of Naive Bayes is the assumption of independent predictors. In real life, it is almost impossible that we get a set of predictors which are completely independent.

      朴素贝叶斯的另一个局限性是独立预测变量的假设。 在现实生活中,我们几乎不可能获得一组完全独立的预测变量。

    Summary

    摘要

    In this Blog, you will learn about What is Conditional Probability and Different types of events that are used in Bayes theorem.

    在此博客中,您将了解什么是条件概率和贝叶斯定理中使用的不同类型的事件。

    How Bayes theorem is applied in Naive Bayes Algorithm.

    朴素贝叶斯算法如何应用贝叶斯定理。

    How Naive Bayes algorithm deals with Overfitting and Underfitting.

    朴素贝叶斯算法如何处理过拟合和欠拟合。

    How to Implement algorithm with sci-kit learn.

    如何使用sci-kit学习实现算法。

    What are the application of Naive Bayes Algorithm.

    朴素贝叶斯算法有哪些应用。

    What is Procs & Cons of algorithm.

    什么是算法的过程与缺点。

    翻译自: https://medium.com/@jeevansinghchauhan247/what-everybody-ought-to-know-about-naive-bayes-theorem-51a9673ef226

    yolov3算法优点缺点

    展开全文
  • 机器学习常用算法优点缺点总结

    万次阅读 多人点赞 2016-11-04 14:14:40
    一、 决策树优点 1、决策树易于理解解释,可以可视化分析,容易提取出规则。 2、可以同时处理标称型数值型数据。 3、测试数据集时,运行速度比较快。 4、决策树可以很好的扩展到大型数据库中,同时...

    决策树

    一、  决策树优点

    1、决策树易于理解和解释,可以可视化分析,容易提取出规则。

    2、可以同时处理标称型和数值型数据。

    3、测试数据集时,运行速度比较快。

    4、决策树可以很好的扩展到大型数据库中,同时它的大小独立于数据库大小。

    二、决策树缺点

    1、对缺失数据处理比较困难。

    2、容易出现过拟合问题。

    3、忽略数据集中属性的相互关联。

    4、ID3算法计算信息增益时结果偏向数值比较多的特征。

    三、改进措施

    1、对决策树进行剪枝。可以采用交叉验证法和加入正则化的方法。

    2、使用基于决策树的combination算法,如bagging算法,randomforest算法,可以解决过拟合的问题

    三、应用领域

    企业管理实践,企业投资决策,由于决策树很好的分析能力,在决策过程应用较多。

     

    KNN算法

    一、KNN算法的优点

     

    1、KNN是一种在线技术,新数据可以直接加入数据集而不必进行重新训练

    2、KNN理论简单,容易实现

    二、KNN算法的缺点

    1、对于样本容量大的数据集计算量比较大。

    2、样本不平衡时,预测偏差比较大。如:某一类的样本比较少,而其它类样本比较多。

    3、KNN每一次分类都会重新进行一次全局运算。

    4、k值大小的选择。

    三、KNN算法应用领域

    文本分类、模式识别、聚类分析,多分类领域

    支持向量机(SVM)

    一、  SVM优点

    1、解决小样本下机器学习问题。

    2、解决非线性问题。

    3、无局部极小值问题。(相对于神经网络等算法)

    4、可以很好的处理高维数据集。

    5、泛化能力比较强。

    二、SVM缺点

    1、对于核函数的高维映射解释力不强,尤其是径向基函数。

    2、对缺失数据敏感。

    三、SVM应用领域

    文本分类、图像识别、主要二分类领域

    AdaBoost算法

    一、  AdaBoost算法优点

    1、很好的利用了弱分类器进行级联。

    2、可以将不同的分类算法作为弱分类器。

    3、AdaBoost具有很高的精度。

    4、相对于bagging算法和Random Forest算法,AdaBoost充分考虑的每个分类器的权重。

    二、Adaboost算法缺点

    1、AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定。

    2、数据不平衡导致分类精度下降。

    3、训练比较耗时,每次重新选择当前分类器最好切分点。

    三、AdaBoost应用领域

    模式识别、计算机视觉领域,用于二分类和多分类场景

    朴素贝叶斯算法

    一、  朴素贝叶斯算法优点

    1、对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已。

    2、支持增量式运算。即可以实时的对新增的样本进行训练。

    3、朴素贝叶斯对结果解释容易理解。

    二、朴素贝叶斯缺点

    1、由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。

    三、朴素贝叶斯应用领域

    文本分类、欺诈检测中使用较多

    Logistic回归算法

    一、logistic回归优点

    1、计算代价不高,易于理解和实现

    二、logistic回归缺点

    1、容易产生欠拟合。

    2、分类精度不高。

    三、logistic回归应用领域

    用于二分类领域,可以得出概率值,适用于根据分类概率排名的领域,如搜索排名等。

    Logistic回归的扩展softmax可以应用于多分类领域,如手写字识别等。

    人工神经网络

    一、  神经网络优点

    1、分类准确度高,学习能力极强。

    2、对噪声数据鲁棒性和容错性较强。

    3、有联想能力,能逼近任意非线性关系。

    二、神经网络缺点

    1、神经网络参数较多,权值和阈值。

    2、黑盒过程,不能观察中间结果。

    3、学习过程比较长,有可能陷入局部极小值。

    三、人工神经网络应用领域

    目前深度神经网络已经应用与计算机视觉,自然语言处理,语音识别等领域并取得很好的效果。

     ===============================================================================================

    原文:http://suanfazu.com/t/qian-tan-wo-dui-ji-qi-xue-xi-de-dian-li-jie/305

    机器学习方法非常多,也很成熟。下面我挑几个说。

    1. 首先是SVM。因为我做的文本处理比较多,所以比较熟悉SVM。SVM也叫支持向量机,其把数据映射到多维空间中以点的形式存在,然后找到能够分类的最优超平面,最后根据这个平面来分类。SVM能对训练集之外的数据做很好的预测、泛化错误率低、计算开销小、结果易解释,但其对参数调节和核函数的参数过于敏感。个人感觉SVM是二分类的最好的方法,但也仅限于二分类。如果要使用SVM进行多分类,也是在向量空间中实现多次二分类。
      SVM有一个核心函数SMO,也就是序列最小最优化算法。SMO基本是最快的二次规划优化算法,其核心就是找到最优参数α,计算超平面后进行分类。SMO方法可以将大优化问题分解为多个小优化问题求解,大大简化求解过程。某些条件下,把原始的约束问题通过拉格朗日函数转化为无约束问题,如果原始问题求解棘手,在满足KKT的条件下用求解对偶问题来代替求解原始问题,使得问题求解更加容易。 SVM还有一个重要函数是核函数。核函数的主要作用是将数据从低位空间映射到高维空间。详细的内容我就不说了,因为内容实在太多了。总之,核函数可以很好的解决数据的非线性问题,而无需考虑映射过程。

    2. 第二个是KNN。KNN将测试集的数据特征与训练集的数据进行特征比较,然后算法提取样本集中特征最近邻数据的分类标签,即KNN算法采用测量不同特征值之间的距离的方法进行分类。KNN的思路很简单,就是计算测试数据与类别中心的距离。KNN具有精度高、对异常值不敏感、无数据输入假定、简单有效的特点,但其缺点也很明显,计算复杂度太高。要分类一个数据,却要计算所有数据,这在大数据的环境下是很可怕的事情。而且,当类别存在范围重叠时,KNN分类的精度也不太高。所以,KNN比较适合小量数据且精度要求不高的数据。
      KNN有两个影响分类结果较大的函数,一个是数据归一化,一个是距离计算。如果数据不进行归一化,当多个特征的值域差别很大的时候,最终结果就会受到较大影响;第二个是距离计算。这应该算是KNN的核心了。目前用的最多的距离计算公式是欧几里得距离,也就是我们常用的向量距离计算方法。
      个人感觉,KNN最大的作用是可以随时间序列计算,即样本不能一次性获取只能随着时间一个一个得到的时候,KNN能发挥它的价值。至于其他的特点,它能做的,很多方法都能做;其他能做的它却做不了。

    3. 第三个就是Naive Bayes了。Naive Bayes简称NB(牛X),为啥它牛X呢,因为它是基于Bayes概率的一种分类方法。贝叶斯方法可以追溯到几百年前,具有深厚的概率学基础,可信度非常高。Naive Baye中文名叫朴素贝叶斯,为啥叫“朴素”呢?因为其基于一个给定假设:给定目标值时属性之间相互条件独立。比如我说“我喜欢你”,该假设就会假定“我”、“喜欢”、“你”三者之间毫无关联。仔细想想,这几乎是不可能的。马克思告诉我们:事物之间是有联系的。同一个事物的属性之间就更有联系了。所以,单纯的使用NB算法效率并不高,大都是对该方法进行了一定的改进,以便适应数据的需求。
      NB算法在文本分类中用的非常多,因为文本类别主要取决于关键词,基于词频的文本分类正中NB的下怀。但由于前面提到的假设,该方法对中文的分类效果不好,因为中文顾左右而言他的情况太多,但对直来直去的老美的语言,效果良好。至于核心算法嘛,主要思想全在贝叶斯里面了,没啥可说的。

    4. 第四个是回归。回归有很多,Logistic回归啊、岭回归啊什么的,根据不同的需求可以分出很多种。这里我主要说说Logistic回归。为啥呢?因为Logistic回归主要是用来分类的,而非预测。回归就是将一些数据点用一条直线对这些点进行拟合。而Logistic回归是指根据现有数据对分类边界线建立回归公式,以此进行分类。该方法计算代价不高,易于理解和实现,而且大部分时间用于训练,训练完成后分类很快;但它容易欠拟合,分类精度也不高。主要原因就是Logistic主要是线性拟合,但现实中很多事物都不满足线性的。即便有二次拟合、三次拟合等曲线拟合,也只能满足小部分数据,而无法适应绝大多数数据,所以回归方法本身就具有局限性。但为什么还要在这里提出来呢?因为回归方法虽然大多数都不合适,但一旦合适,效果就非常好。
      Logistic回归其实是基于一种曲线的,“线”这种连续的表示方法有一个很大的问题,就是在表示跳变数据时会产生“阶跃”的现象,说白了就是很难表示数据的突然转折。所以用Logistic回归必须使用一个称为“海维塞德阶跃函数”的Sigmoid函数来表示跳变。通过Sigmoid就可以得到分类的结果。
      为了优化Logistic回归参数,需要使用一种“梯度上升法”的优化方法。该方法的核心是,只要沿着函数的梯度方向搜寻,就可以找到函数的最佳参数。但该方法在每次更新回归系数时都需要遍历整个数据集,对于大数据效果还不理想。所以还需要一个“随机梯度上升算法”对其进行改进。该方法一次仅用一个样本点来更新回归系数,所以效率要高得多。

    5. 第五个是决策树。据我了解,决策树是最简单,也是曾经最常用的分类方法了。决策树基于树理论实现数据分类,个人感觉就是数据结构中的B+树。决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。决策树计算复杂度不高、输出结果易于理解、对中间值缺失不敏感、可以处理不相关特征数据。其比KNN好的是可以了解数据的内在含义。但其缺点是容易产生过度匹配的问题,且构建很耗时。决策树还有一个问题就是,如果不绘制树结构,分类细节很难明白。所以,生成决策树,然后再绘制决策树,最后再分类,才能更好的了解数据的分类过程。
      决策树的核心树的分裂。到底该选择什么来决定树的分叉是决策树构建的基础。最好的方法是利用信息熵实现。熵这个概念很头疼,很容易让人迷糊,简单来说就是信息的复杂程度。信息越多,熵越高。所以决策树的核心是通过计算信息熵划分数据集。

    6. 我还得说一个比较特殊的分类方法:AdaBoost。AdaBoost是boosting算法的代表分类器。boosting基于元算法(集成算法)。即考虑其他方法的结果作为参考意见,也就是对其他算法进行组合的一种方式。说白了,就是在一个数据集上的随机数据使用一个分类训练多次,每次对分类正确的数据赋权值较小,同时增大分类错误的数据的权重,如此反复迭代,直到达到所需的要求。AdaBoost泛化错误率低、易编码、可以应用在大部分分类器上、无参数调整,但对离群点敏感。该方法其实并不是一个独立的方法,而是必须基于元方法进行效率提升。个人认为,所谓的“AdaBoost是最好的分类方法”这句话是错误的,应该是“AdaBoost是比较好的优化方法”才对。

    好了,说了这么多了,我有点晕了,还有一些方法过几天再写。总的来说,机器学习方法是利用现有数据作为经验让机器学习,以便指导以后再次碰到的决策。目前来说,对于大数据分类,还是要借助分布式处理技术和云技术才有可能完成,但一旦训练成功,分类的效率还是很可观的,这就好比人年龄越大看待问题越精准的道理是一样的。这八个月里,从最初的理解到一步步实现;从需求的逻辑推断到实现的方法选择,每天都是辛苦的,但每天也都是紧张刺激的。我每天都在想学了这个以后可以实现什么样的分类,其实想想都是让人兴奋的。当初,我逃避做程序员,主要原因就是我不喜欢做已经知道结果的事情,因为那样的工作没有什么期盼感;而现在,我可以利用数据分析得到我想象不到的事情,这不仅满足了我的好奇感,也让我能在工作中乐在其中。也许,我距离社会的技术需求还有很远的距离,但我对自己充满信心,因为,我不感到枯燥,不感到彷徨,虽然有些力不从心,但态度坚定。

     

     

    ===================================================

    http://blog.csdn.net/vola9527/article/details/43347747

    简述机器学习十大算法的每个算法的核心思想、工作原理、适用情况及优缺点等。

    1)C4.5算法:

    ID3算法是以信息论为基础,以信息熵和信息增益度为衡量标准,从而实现对数据的归纳分类。ID3算法计算每个属性的信息增益,并选取具有最高增益的属性作为给定的测试属性。

    C4.5算法核心思想是ID3算法,是ID3算法的改进,改进方面有:

    1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足;

    2)在树构造过程中进行剪枝

    3)能处理非离散的数据

    4)能处理不完整的数据

     C4.5算法优点:产生的分类规则易于理解,准确率较高。

    缺点:

    1)在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

    2)C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

     

    2)K means 算法

    是一个简单的聚类算法,把n的对象根据他们的属性分为k个分割,k< n。 算法的核心就是要优化失真函数J,使其收敛到局部最小值但不是全局最小值。

    其中N为样本数,K是簇数,rnk b表示n属于第k个簇,uk 是第k个中心点的值。然后求出最优的uk

     

    优点:算法速度很快

    缺点是,分组的数目k是一个输入参数,不合适的k可能返回较差的结果。

     

     

    3)朴素贝叶斯算法:

    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。算法的基础是概率问题,分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。朴素贝叶斯假设是约束性很强的假设,假设特征条件独立,但朴素贝叶斯算法简单,快速,具有较小的出错率。

    在朴素贝叶斯的应用中,主要研究了电子邮件过滤以及文本分类研究。

     

    4)K最近邻分类算法(KNN)

    分类思想比较简单,从训练样本中找出K个与其最相近的样本,然后看这k个样本中哪个类别的样本多,则待判定的值(或说抽样)就属于这个类别。

    缺点:

    1)K值需要预先设定,而不能自适应

    2)当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。

    该算法适用于对样本容量比较大的类域进行自动分类。

     

     

    5)EM最大期望算法

    EM算法是基于模型的聚类方法,是在概率模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量。E步估计隐含变量,M步估计其他参数,交替将极值推向最大。

    EM算法比K-means算法计算复杂,收敛也较慢,不适于大规模数据集和高维数据,但比K-means算法计算结果稳定、准确。EM经常用在机器学习和计算机视觉的数据集聚(Data Clustering)领域。

     

    6)PageRank算法

    是google的页面排序算法,是基于从许多优质的网页链接过来的网页,必定还是优质网页的回归关系,来判定所有网页的重要性。(也就是说,一个人有着越多牛X朋友的人,他是牛X的概率就越大。)

    优点:

    完全独立于查询,只依赖于网页链接结构,可以离线计算。

    缺点:

    1)PageRank算法忽略了网页搜索的时效性。

    2)旧网页排序很高,存在时间长,积累了大量的in-links,拥有最新资讯的新网页排名却很低,因为它们几乎没有in-links。

     

    7)AdaBoost

    Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。

    整个过程如下所示:
    1. 先通过对N个训练样本的学习得到第一个弱分类器;
    2. 将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器;
    3. 将和都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器;
    4. 如此反复,最终得到经过提升的强分类器。

    目前AdaBoost算法广泛的应用于人脸检测、目标识别等领域。

     

    8)Apriori算法

    Apriori算法是一种挖掘关联规则的算法,用于挖掘其内含的、未知的却又实际存在的数据关系,其核心是基于两阶段频集思想的递推算法 。

    Apriori算法分为两个阶段:

    1)寻找频繁项集

    2)由频繁项集找关联规则

    算法缺点:

    1) 在每一步产生侯选项目集时循环产生的组合过多,没有排除不应该参与组合的元素;

    2) 每次计算项集的支持度时,都对数据库中    的全部记录进行了一遍扫描比较,需要很大的I/O负载。

     

    9)SVM支持向量机

    支持向量机是一种基于分类边界的方法。其基本原理是(以二维数据为例):如果训练数据分布在二维平面上的点,它们按照其分类聚集在不同的区域。基于分类边界的分类算法的目标是,通过训练,找到这些分类之间的边界(直线的――称为线性划分,曲线的――称为非线性划分)。对于多维数据(如N维),可以将它们视为N维空间中的点,而分类边界就是N维空间中的面,称为超面(超面比N维空间少一维)。线性分类器使用超平面类型的边界,非线性分类器使用超曲面。

    支持向量机的原理是将低维空间的点映射到高维空间,使它们成为线性可分,再使用线性划分的原理来判断分类边界。在高维空间中是一种线性划分,而在原有的数据空间中,是一种非线性划分。

    SVM在解决小样本、非线性及高维模式识别问题中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

     

     

     

    10)CART分类与回归树

    是一种决策树分类方法,采用基于最小距离的基尼指数估计函数,用来决定由该子数

    据集生成的决策树的拓展形。如果目标变量是标称的,称为分类树;如果目标变量是连续的,称为回归树。分类树是使用树结构算法将数据分成离散类的方法。

    优点

    1)非常灵活,可以允许有部分错分成本,还可指定先验概率分布,可使用自动的成本复杂性剪枝来得到归纳性更强的树。

    2)在面对诸如存在缺失值、变量数多等问题时CART 显得非常稳健。

    展开全文
  • VCDelphi作为开发平台,很重要的一点就是提供了一个"无所不包"的应用框架:VC的MFCDelphi的VCL。MFC是用C++写的,VCL是用Object Pascal写的。当然,我们都知道,C++的使用范围比Object Pascal广得多,移植性也好...

    VC和Delphi作为开发平台,很重要的一点就是提供了一个"无所不包"的应用框架:VC的MFC和Delphi的VCL

    。MFC是用C++写的,VCL是用Object Pascal写的。当然,我们都知道,C++的使用范围比Object Pascal广

    得多,移植性也好得多。这本来是优点,但很有意思的是,正因为如此,微软写MFC时必须考虑最大限度减

    少对语言本身的改动,而把功夫下在源代码级,以便能尽可能支持ANSI等标准,结果导致MFC的封装复杂而

    不直观。(尤其是它对消息的封装,下文还会提到)。太多的宏定义和含义模糊且自动生成、不得改动的注

    释使MFC乃至VC让很多新手望而生畏,不敢"下水"深入学习。而Object Pascal几乎是Inprise"专用"的,不

    必考虑"标准"问题,因此Inprise写VCL时就把全部精力放在了结构与性能上,结果语言与框架的磨合程度

    非常好。VCL框架的结构清晰,VCL代码的可读性非常好。许多人说Delphi比较容易上手,也是这个缘故。

    天下没有白吃的午餐。你要工业标准吗?你要可移植性吗(关于可移植性和兼容性,下文会详细比较)?那

    么请面对MFC的"天书"级代码吧。

    编译和连接:The Need For Speed

    不同的语言带来的另一个不同是,编译和连接的速度的不同,以及执行速度的不同。Delphi的编译和连接

    速度,毫不夸张地说,比VC快几十倍。即使把VC的Incremental Link选项打开,Delphi的编译和连接速度

    仍比VC快好几倍。并不是说微软的编译器不行,这是由C++的复杂性决定的。模板的处理、预处理和宏的展

    开都是很费时的。前文不是提到Object Pascal没有模板、预处理和宏吗?这本来是缺点,但带来的一个好

    处就是编译速度极快。至于编译完的二进制代码,在打开相同的优化选项的情况下,Delphi和VC执行速度

    并没有太大的差别。

    为了克服编译的速度问题,C++编译器一般需要增强的连接器和预处理机制。但是预处理机制仍然存在若干

    问题:1)程序调试的断点行可能和代码行不同;2)没有将最新的代码信息综合进去;3)容易产生错误的

    逻辑;4)因为读错文件头而很容易产生类似"Unexpected End of File"的错误。

    两个编译器有个共同点是都能识别无用的"死"代码,比如一个没有用的函数等等。编译后的程序将不包含

    这些多余的信息。Delphi在这方面作得更加出色。它可以让你在编辑器中可视化地提示出那行代码是"活"

    的、那行代码是"死"的。这样你就能整理出最精简的代码。Delphi在编译后将在左边显示一个小蓝点表示

    这行代码是"活"的。Visual C++做不到这点。

    Delphi编译后可执行文件至少有200K(如果不使用VCL,仅仅使用WinAPI,文件的大小将大大缩小)但是

    Visual C++编程使用MFC编译后的可执行文件通常只有几十K,主要是因为微软已经将系统运行库包含在

    Windows系统了(Borland公司曾经和微软协商这个接口,但是微软利用操作系统的优势不愿意公开)。同

    样道理,使用BDE开发的的数据库程序必须附带3-5M的额外系统文件,也是非常不协调的。

    非常有趣的是,Delphi能够使用由C++ Builder创建的的OBJ文件,但是使用上受很大的局限性。

    最后,Visual C++的编译和连接时的错误信息比Delphi要详细和具体的多。特别是使用ATL开发更加如此。

    应用框架:MFC?有KFC流行吗?

    应用程序框架(Application Frame),有时也称为对象框架。Visual C++采用的框架是MFC。MFC不仅仅是人

    们通常理解的一个类库(同样,Delphi的VCL也不仅仅是一个控件库,尽管它的名字叫"可视控件库")。你如

    果选择了MFC,也就选择了一种程序结构,一种编程风格。MFC早在Windows 3.x的时代就出现了,那时的

    Visual C++还是16位的。经过这些年的不断补充和完善,MFC已经十分成熟。但由于原型出现得比较早,

    MFC相比于VCL落后了一个时代。尽管微软对MFC的更新没有停止,我也经常读到"只要Windows不过时,MFC

    就不会过时"之类观点的文章,但就象Inprise(原Borland)的OWL框架的淡出一样,MFC的淡出也是早晚的事

    。其实MFC是和OWL同一个时代的产物。OWL已经不在了,MFC怎能不"居安思危"呢?如果MFC青春永驻,微软

    的开发人员也不会"私自"开发出基于ATL的WTL呀。当然,WTL的地位不能和MFC比,它并不是微软官方支持

    的框架,封装的功能也相当有限。但至少也反衬出了MFC存在的不足。

    我们以为,最能体现一个应用程序框架的先进性的是它的委托模型,即对Windows消息的封装机制。对

    Windows API的封装就不用说了吧。大同小异,也没什么技术含量。如果高兴,你也可以自己写一个类库来

    封装。但对Windows消息驱动机制的封装就不是那么容易的了。最自然的封装方式是采用虚成员函数。如果

    要响应某个消息就重载相应的虚函数。但出乎我的意料,MFC采用的是"古老"的宏定义方法。用宏定义方法

    的好处是省去了虚函数VTable的系统开销(由于Windows的消息种类很多,开销不算太小)。不过带来的缺点

    就是映射不太直观。对于MFC,则是"太不直观"了。它的消息映射代码虽然是可见的,但"劝君莫碰"。好在

    VC的ClassWizard可以自动生成消息映射代码,使用起来还算方便。但和VCL的委托模型相比,MFC的映射方

    法就显得太落后了。而Delphi的Object Pascal因为没有"标准负担",语言引入了组件、事件处理、属性等

    新特性。由于功夫做在编译器级,生成的源代码就显得十分简洁。似乎VC是"让框架迁就语言",而Delphi

    是"让语言迁就框架"。

    我想举一个对字符串操作的封装的例子来说明MFC和VCL的优缺点。在MFC中,CStringList类有加入、获取

    、删除等功能,但VCL的TStringList类除了上述功能还有排序、从逗号分隔的字串读入、流输入输出等功

    能。但同样的字符串替换功能,VCL的StringReplace要比MFC的CString::Replace慢2-3倍。总的来说,

    VCL的封装比MFC更为高层,更为抽象,但不可避免地带来的问题是某些部分执行效率比MFC略低。这就象低

    级语言(如汇编)的执行效率比高级语言(如Basic)高,但编程效率较低。鱼和熊掌不可兼得嘛。

    VCL比之MFC的另一优点是对异常处理的支持,而一大缺点是对多线程支持差。VCL的大部分都不是针对多线

    程优化的。虽说VCL提供了简化多线程操作的类,但只是工作者线程(worker threads)使用起来比较简单。

    如果线程要和界面打交道的话事情就变得麻烦了,因为除了应用程序的主线程,任何线程不能访问任何可

    视的VCL部件。你不得不使用Synchronize方法等待主线程处理它的消息,然后在主线程中访问VCL部件。而

    MFC就没有这样的限制。

    稳定性与完善程度:VC是老大哥

    VC要比Delphi稳定和完善。VC的发展历史比Delphi长,微软的总体实力比Inprise强。VC的框架MFC经历了

    那么多年的发展和完善,功能非常全面,而且十分稳定,bug很少。其中你可能遇到的bug也更少。而且有

    第三方的专门工具帮助你避开这些bug。如此规模的一个类库,能做到这一点不容易。不要小看了这一点,

    很多专业程序员就是为这个选择VC的。因为尽管VCL比MFC的抽象程度高,封装较为高层,但由此带来的开

    发效率的提高对高手来说毕竟是有限的。而如果你遇到一个怪问题,调试了半天,发现不是你的代码有错

    ,而是VCL的bug,你作何感想?虽说遇到这类问题的可能性很小,但对VCL的形象的影响可不小。Delphi的

    IDE太占资源,启动速度太慢,和某些显卡驱动程序冲突,VCL中有bug,调试器不够健壮,对不稳定的第三

    方控件没有防护措施 …… 问题多多,在这方面Delphi不如VC。希望Inprise能更上一层楼。顺便说一下,

    我们在网上看到有些人极言Delphi的不稳定,说几分钟出现20多次非法操作。Delphi的确不如Visual C++

    稳定,但也不至于如此呀。我估计是那位朋友的Delphi装了某些有问题的第三方控件,导致了Delphi的频

    频出错。不妨卸下那些控件试试?

    可移植性:立足现实,放眼未来

    Inprise正在开发Delphi的Linux版本,代号为Kylix。也许通过Kylix,用VCL构架编写的Windows程序向

    Linux移植成为可能。但这只是可能。因为在目前Inprise的兼容性工作做得并不好。低版本的Delphi不能

    使用高版本的VCL组件,而高版本的Delphi竟然不能使用低版本的VCL组件。真是岂有此理,我们很少看见

    软件有不向下二进制兼容的。如果Windows 98不能运行95的程序,Windows 95不能运行3.x的程序,Win

    3.x不能运行DOS程序,你还会用Windows吗?如果Windows 95的程序必须经过重新编译才能在98下运行,98

    会卖得那么好吗?"同门兄弟"C++Builder和Delphi也不能互相使用对方的组件,甚至同一套VCL库的文件名

    也不一样。所以一个组件有for D1/D2/D3/D4/D5/C1/C3/C4/C5这些不同版本是常有的事,而且随着Delphi

    和C++Builder版本的升级可能还会增加。希望Inprise能先解决同门兄弟的兼容性问题。而微软的VC就没有

    这类问题。MFC1.0的程序也可以毫无障碍地在VC6.0下编译通过。

    集成界面:宏观与微观

    就大处说,VC的集成界面是不如Delphi的。Delphi仅仅一个Object Inspector就可以将VC的一堆Wizards比

    下去,何况它还有Code Explorer、ToDo List等。但从小处,又可以看出Delphi的不成熟。比如"自动完成

    "功能的智能化程度和提示详细程度不如VC,响应速度也没有VC快。

    Visual C++所带的MSDN是一部"开发者的百科全书",信息庞大,查询方便,这方面比Delphi更专业。很多

    帮助项都有源程序示范。

    Delphi的OpenTools是完全面向第三方的开放系统,开发者可以修改很多Borland公司自身的功能,从IDE的

    可扩充性上说Delphi更好。

    调试:细微之处见真功

    Visual C++和Delphi的调试功能都非常强大,同时都具有单步可视化调试、断点跟踪、运行时改变变量、

    鼠标指向可以得到变量值等等功能。对DLL的输入输出也能方便的管理,能够进行源码级别的调试。

    相对而言,Visual C++能够更加方便地看到变量的变化情况,这包括对结构可以展开成数据树,从而了解

    每一个变量的值,每一步调试,变化了的变量会加红,从而使调试更加方便。另外,Visual C++的块内存

    察看比Delphi也要方便。

    当然,Delphi也有很多体贴的细微之处,比如在线程调试的时候,Delphi能够很方便地察看线程的变化,

    Visual C++却必须要弹出一个模式对话框。

    数据库开发:Delphi一枝独秀

    数据库支持是Delphi的强项。这主要体现在Delphi与BDE的无缝集成,以及Delphi提供的那一大堆现成的数

    据库操作控件。这是VC望尘莫及的。目前Delphi支持BDE、ADO、InterBase三种数据库访问方式。所有的方

    式都能拖拉到应用程序中实现可视化操作。正是因为Delphi对数据库类的包装,使得用户操作数据库不像

    在Visual C++中必须从开始到最后都要干预。明显地提高了开发速度。

    Delphi中使用WebBroker控件还能很方便地构造出基于数据库的Web页面,通过HTML管理Web数据库。

    Visual C++访问数据主要通过ADO和OLEDB,很多ActiveX控件也能添加数据库功能。但是没有像Paradox这

    样的桌面数据库,Access相对功能太弱了。也许SQL Server是不错的选择。

    COM:新技术的力量

    COM是组件对象模型的缩写。它是OLE和ActiveX技术的基础,COM定义了一组API和一个二进制标准,让不同

    的编程语言、不同平台的彼此独立的对象相互进行通讯。

    COM是Microsoft制订的行业标准。但Delphi也为COM提供了强大的语言支持。支持接口、variant、宽字符

    串功能。这些对COM的封装确实比C++更方便。比如在C++(没有类框架)进行COM编程时,变体定义为

    oaidl.h文件中的VARIANT结构。要处理变体,必须手工调整oleaut32.dll中VariantXXXX() API函数对其进

    行初始化和管理,如VariantInit()、VariantCopy()、VariantClear()等等。

    Visual C++实现COM编程有一种特殊的方法就是使用ATL。ATL使用Visual C++特有的多重继承来实现COM接

    口。虽然不见得实现COM服务和控制更容易,但是ATL和最新COM技术的接口,基于模板的构造都比Delphi强

    。ATL更有利于建立小巧、快捷的COM组件程序。

    按目前通用的观点,Visual C++应用到COM服务程序更有优势,Delphi应用到COM组件程序更合适。

    昨天,今天,明天

    技术的进步在很多时候是此消彼长的。当初Borland的Turbo C和Borland C++几乎是C/C++程序员唯一的选

    择。微软的Quick C(现在还有人知道这个产品吗?)和Microsoft C/C++从来也没有成为过主流。但Borland

    C++又流行了多少年呢?不久就被新崛起的Microsoft Visual C/C++压下去了。于是Inprise(原Borland)拣

    起了当年Turbo Pascal和Borland Pascal的辉煌(事实上Borland的成名作就是第一个Pascal编译器),全力

    推出了Delphi。Delphi当初推出时被称为VB杀手,但VB现在仍然活得挺好。毕竟微软是靠Basic起家的嘛,

    VB不是那么容易被打败的。Inprise想了想不和VB争了,使用Delphi的IDE和VCL配上C++语言,推出了

    C++Builder,又向Visual C++的市场发起了夹攻。C++Builder似乎是个不错的折衷选择了?再仔细想想!

    C++Builder的优点Delphi都有,但Delphi的优点C++Builder未必有。比如C++Builder的编译速度比VC还慢

    ,哪能和Delphi比?而且因为VCL是Object Pascal写的,C++语言和VCL磨合得并不好。C++Builder的bug比

    Delphi还多,甚至Sample代码中还有错。VCL的部分功能不能使用,要靠嵌入pascal代码访问。C++Builder

    可用的第三方控件远没有Delphi多。

    唉,真是金无足赤。Microsoft和Inprise,谁会笑在最后呢?

    鱼和熊掌:艰难的选择

    选择一个开发工具依赖于很多不同的因素,每个人都能因为某种语言的某个缺陷而放弃学习或使用这种语

    言。任何程序员都希望自己喜欢的工具能达到理想的境界,通过上面不完善的比较,我想大家都有自己的

    看法。我们认为影响大家选择开发语言的因素主要包括:

    1) 哪门语言更容易入门?
    学习一种语言需要投入大量的时间和精力。开发程序的开发成本是值得考虑的现实。一个熟练的Delphi程

    序员和一个熟练的VC程序员工作效率是一样的。但是,成为熟练的程序员必须很快掌握一门语言的技巧。

    不幸的是,目前熟练的Visual C++程序员是十里挑一。相对而言,Delphi更适合初学者。

    2) 哪门语言有更多可继承的代码?
    语言代码的可重用性是加快开发效率明显方面,从早期的过程、函数到现在的组件技术都是朝这个目标在

    奋斗。这两种语言对代码重用的理解是不一样的,Delphi主要通过VCL控件来实现代码重用,Visual C++实

    现起来就比较复杂。

    3) 语言自身的本性。
    就技术(主要指应用框架)来说,Delphi目前领先于Visual C++。但稳定性和健壮性的不足又让我对

    Inprise"想说爱你不容易"。而VC尽管发展到今日已十分完善,但MFC框架已是明日黄花了。如果不使用MFC

    ,目前又没有合适的替代品。根据你的需要和实际情况做选择吧。实际上Visual C++和Delphi也不是简单

    竞争关系。它们在许多领域并不重叠,甚至是互补的。到底怎样取舍,要根据你的项目特性决定。如果你

    开发系统底层的东西,需要极好的兼容性和稳定性,选Visual C++吧。你可以只调用Windows的各种API,

    不用MFC。如果你写传统的Windows桌面应用程序,Visual C++的MFC框架是"正统"的选择;如果界面部分占

    这个应用程序代码比例较大的话,或者Delphi中有相关功能的控件的话,Delphi是事半功倍的选择。如果

    你为企业开发数据库、信息管理系统等高层应用("高层"是相对于"低层/底层"而言的,不是说技术高级或

    低级),而且有比较紧的期限限制,选Delphi比较好。如果你熟悉的语言是Object Pascal,又不打算学复

    杂的C++,那么Delphi几乎是唯一的选择。传统的观点是:Delphi适合编写Internet/Intranet、表格制图

    、数据库操作、高级用户界面等等。Visual C++适合编写设备驱动、COM服务程序、科学计算、控制台

    (console)程序、WinCE的应用和一些小的工具等等。应用范围的不同要求好的程序员同时精通这两门语

    言。

    4) 语言的前景和可扩充性。
    Delphi是Inprise的旗舰产品之一,前景应当还是比较乐观的,而且Inprise已经在向Linux进军了,而微软

    还迟迟没有动作。遗憾的是,Inprise公司Delphi的创始人已经跳槽到微软去主持Visual J++和C#项目了。

    但愿对Inprise冲击不会太大。

    微软的Visual C++的前景又怎样呢?Visual Studio 7.0就要推出了。这一版本将加强网络开发的特性。看

    来微软虽然被判解体,开发实力可是一点没打折扣。

    另外,虽说MFC已稍显落后,但不是说它不值得学。事实上,不学MFC就等于没学VC。利用MFC框架开发程序

    仍然是目前开发桌面应用的主流模式,而且还会保持相当长的时间。微软公司CEO史蒂夫·巴尔默(Steve

    Ballmer)曾说,.NET流行还得等2-3年。那么,MFC至少还有2-3年的生命空间。在技术日新月异的IT界,

    2-3年实在是很长一段时间了。好好把握吧。即使你不使用MFC框架,花点时间看一下MFC的封装机制对你

    熟悉C++的OOP机制和Windows底层功能也是很有好处的。而VCL的源代码是Object Pascal的,对C/C++程序

    员就没有这个"额外"的作用了。

     
    展开全文
  • 激光三角测量 原理、优点和不足

    千次阅读 2020-11-22 21:52:39
    激光测距主要包括干涉、脉冲ToF法和三角测量。本文参考几篇文献,说明激光三角测量的原理。 激光三角测量的原理 激光三角测量的设置与双目立体视觉很像,只是将其中的一个LCD换成了laser。 激.

    目录

    引言

    激光三角测量法的原理

    正入射

    斜入射

    正入射与斜入射的对比

    激光三角测量法测距的特点

    主要误差来源

    激光抖动

    被测物体表面颜色

    激光光斑检测精度

    入射光束的景深限制

    参考文献


    引言

    激光测距是LCT等主动非视距成像的基础,因此熟悉激光测距方法还是很有必要的。激光测距主要包括干涉法、脉冲ToF法和三角测量法。本文参考几篇文献,说明激光三角测量法的原理。

     

    激光三角测量法的原理

    激光三角测量法的设置与双目立体视觉很像,只是将其中的一个LCD换成了laser。

    激光三角测量法是利用光线空间传播过程中的光学反射规律和相似三角形原理,在接收透镜的物空间与像空间构成相似关系,同时利用边角关系计算出待测位移。根据入射激光和待测物体表面法线之间的夹角,可以将激光三角法测量分为正入射和斜入射两种情况:

    正入射:入射光线与待测物体表面法线夹角为0;

    斜入射:入射光线与待测物体表面法线夹角为α>0.

     

    正入射

    原理图如下图所示:

     

    激光器发射的光束正入射到参考平面M处、测量平面N处,并分别在CCD上的M'和N'处成像,夹角等如图所示。

    则根据几何光路,可知:

    进而即可求解得到m.

    在已知参考平面的情况下,通过m即可完成测距。

     

    斜入射

    原理图如下图所示:

    [注:本图有误,N点需上移,暂未更改,下述三角形相似关系和求解原理不变]

    仍有三角形OPN和三角形OP‘N’相似,科得:

    \frac{\frac{m}{\cos \alpha} \sin (\alpha+\beta)}{1+\frac{m}{\cos \alpha} \cos (\alpha+\beta)}=\frac{M^{\prime} N^{\prime} \sin \gamma}{l^{\prime}-M^{\prime} N^{\prime} \cos \gamma}

    进而求解出m.

     

    正入射与斜入射的对比

    正入射:

    • 可以看作是斜入射的一个特例;
    • 具有更好的测量精度和测量稳定性;
    • 但对复杂测量场景容易出现不适用的情况。

     

    斜入射:

    • 对复杂场景更易应用;
    • 激光倾斜入射会导致物体表面激光光斑增大,且能量分布不均匀,导致光斑中心检测难度加大,降低检测精度;
    • 斜入射的光斑位置会随位移m的改变而改变,难以完成对某固定点的测距。

    激光三角测量法测距的特点

    • 非接触式测距,高精度;
    • 大的测量范围,对待测表面要求较低;
    • 结构简单,性价比高;

     

    主要误差来源

    激光抖动

    激光器常常会因为自身或外界原因抖动,尽管抖动角一般只有±1°,但对测量结果影响很大;

    被测物体表面颜色

    不同颜色的被测物体-->不同的反射和散射特定-->探测器CCD接收到不同的光强-->影响精度。

    颜色误差测量结果如下:

    激光光斑检测精度

    激光光斑检测精度会对角度、l等值都会产生影响,从而影响测量精度。

    入射光束的景深限制

    一般的高斯光束聚焦为入射光时,会出现光斑尺寸随测量范围变大而离焦、变大的现象,使系统很难满足高分辨率和大测量范围的要求。

     

     

    参考文献

    [1]孙有春;庞亚军;白振旭;王雨雷;吕志伟; 激光三角测量法应用技术[J]. 激光杂志, : 1–10.

    [2]https://wenku.baidu.com/view/1187afeb551810a6f524868e.html

     

    ==================================================================================================================

    原载于 我的博客

    如有错误,可联系 rxnlos@126.com

    =================================================================================================================

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 函数编程的优点

    千次阅读 2014-03-27 09:49:01
    因为函数编程的每一个符号都是 final 的,没有函数产生过副作用。因为从未在某个地方修改过值,也没有函数修改过在其作用域之外的量并被其他函数使用(如类成员或全局变量)。这意味着函数求值的结果只是其返回值...
  • 文章目录3.1 生产表示1. 确定性规则知识的生产表示2. 不确定性规则知识的产生表示3. 确定性事实性知识的产生表示4....生产通常用于表示事实、规则以及它们的不确定性度量,适合表示事实性知识规则性
  • 【解答思路】:建议大家用2分钟得自我介绍,面试官较喜欢的自我介绍1、有亮点,每一小段都有一个亮点,而不是平铺直叙2、有互动,每一小段都会面试官互动,而不是自说自话,但是切记,这种互动并不需要面试官配合...
  • 一般用三元组(对象,属性,值)或(关系,对象1,对象2)产生的基本形式:P→Q或者IF P THEN Q ,P是产生的前提,也称为前件,它给出了该产生可否使用的先决条件,由事实的逻辑组合来构成;Q 是一组结论或操作...
  • 1.归纳,指的是从许多个别事例中获得一个较具概括性的规则。...2.归纳是从特殊到一般,优点是能体现众多事物的根本规律,且能体现事物的共性。缺点是容易犯不完全归纳的毛病。演绎是从一般到特殊
  • 最优化方法:牛顿迭代法和拟牛顿迭代

    万次阅读 多人点赞 2014-04-27 09:18:18
    http://blog.csdn.net/pipisorry/article/details/24574293牛顿法和拟牛顿(Newton's method & Quasi-Newton Methods)牛顿(Newton's method) 又称为牛顿-拉弗森方法(Newton-Raphson method),单变量下又...
  • 人工智能—— 产生表示

    千次阅读 2019-03-18 16:01:42
    产生的形式描述及语义 — BNF 产生与谓词逻辑中的蕴含的区别 (1)除逻辑蕴含外,产生还包括各种操作、规则、变换、算子、函数等。 (2)蕴含只能表示精确知识,而产生...产生表示优点和局限性 优...
  • 相位激光测距中相位产生原理

    万次阅读 多人点赞 2018-06-28 17:14:13
    相位激光测距原理深入解析
  • 通俗来讲,就是条件判定覆盖的升华! 与判定覆盖、语句覆盖的关系: 满足判定覆盖就一定能够满足语句覆盖,满足条件判定覆盖就一定能够满足判定覆盖,语句覆盖及其条件覆盖,所以,条件判定覆盖是语句覆盖、条件...
  • 产生表示“产生”由美国数学家波斯特(E.POST)在1934年首先提出,它根据串代替规则提出了一种称为波斯特机的计算模型,模型中的每条规则称为产生。 什么是产生表示?它是用来做什么的? 确定性知识是...
  • 视觉SLAM笔记(43) 直接

    万次阅读 2019-10-24 08:33:14
    直接的推导、考虑已知位置的空间点P、直接分类(稀疏、半稠密、稠密)、优缺点
  • 常见分类算法优缺点

    千次阅读 2018-10-21 21:36:54
    本文主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发学习方式来实验。...
  • 3. 对2中最后的子分别wb求导可得:             由上面第1子可以知道,如果我们优化出了α,则直接可以求出w了,即模型的参数搞定。而上面第2个子可以作为后续优化的一个...
  • 德尔菲——意见可靠预测方法

    千次阅读 2019-07-09 08:59:14
    德尔菲/得尔飞(Delphi Method) 目录 1德尔菲的简介 1.1德尔菲的起源演变 1.2德尔菲的典型特征 2德尔菲的特征 3德尔菲的具体实施步骤 3....
  • HR:说说你最大的优缺点?

    千次阅读 2019-06-25 17:31:00
    尽量说一些优点,调侃也可以,千万别暴露缺点,也别直接说,可以这样回答我个人性格比较负责,用心的,通常很容易融入一个新团体,之前的公司同事朋友很喜欢跟我搭档做事,通常对我印象都是靠谱……. ...
  • 共轭梯度,最速下降法和牛顿

    万次阅读 2015-08-29 12:58:54
    共轭梯度,最速下降法和牛顿 (2013-01-24 09:06:26) 标签: 梯度 it 分类:Communication 共轭梯度   数学上,共轭梯度是求解特定线性系统的数值解的方法,其中那些矩阵...
  • 关于P、I、D三个环节的选择,一般只会用到PI控制或者PD控制,例如速度控制要求稳态无误差... 定义:通过调整比例、积分微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能。  优点  a. 技术成熟 ...
  • 机器学习各类算法的优缺点

    千次阅读 2018-07-30 22:06:19
    1.逻辑回归 二项logistic回归模型是一种分类...1. 计算代价不高,易于理解实现; 2. 适用于需要得到有分类概率额场景; 3.对小数据噪声的鲁棒性好,不会收轻微的多重共线性的影响 缺点: 1. 容易欠拟合,分...
  • Unity3D使用经验总结 优点

    千次阅读 2014-05-27 23:21:00
    Unity3D使用经验总结 优点篇 09年还在其它小伙伴开发引擎的时候,Unity3D就初露头角。 当时就对这种基于组件的设计结构很不理解。 觉得拆分过于细致,同时影响效率。 而时至今日,UNITY3D已经...
  • 四元数姿态的梯度下降推导解读

    万次阅读 多人点赞 2014-04-07 14:44:49
    而本文讨论的姿态融合算法叫做梯度下降,这部分代码可以参见Sebastian O.H. Madgwick在2010年4月发表的一篇论文(An efficient orientation filter for inertial andinertial/magneticsensor arrays),这篇论文...
  • 深入理解XGBoost,优缺点分析,原理推导及工程实现

    千次阅读 多人点赞 2019-12-26 20:04:00
    本文将从XGBoost的数学原理工程实现上进行介绍,然后介绍XGBoost的优缺点,并在最后给出面试中经常遇到的关于XGBoost的问题。 2. XGBoost的原理推导 2.1 从目标函数开始,生成一棵树 XGBoostGBDT两者都是...
  • 优点 稳定的分类效率 对小规模数据表现很好,能处理多分类任务,适合增量训练 对缺失数据不太敏感,算法较简单,多用于文本分类 如果满足条件独立假设,NB的收敛速度将快于判别模型如LR,所以...
  • 一文通透优化算法:从随机梯度、随机梯度下降到牛顿、共轭梯度       1 什么是梯度下降 经常在机器学习中的优化问题中看到一个算法,即梯度下降,那到底什么是梯度下降呢? 维基百科给出的定义...
  • 各种算法优缺点

    千次阅读 2016-08-25 20:55:30
    一、 决策树易于理解解释.人们在通过解释后都有能力去理解决策树所表达的意义。 二、 对于决策树,数据的准备往往是简单或者是不必要的.其他的技术往往要求先把数据一般化,比如去掉多余

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,138
精华内容 14,455
关键字:

关系式法的优点和缺点