机器学习算法基础(Python和R语言实现)

简介

谷歌的无人驾驶汽车已经受到了世人很大的关注,但公司的未来却是在机器学习领域,因为这项技术将使电脑更智能,更人性化。--埃里克·施密特(谷歌主席)

我们可能正经历着人类最明确定义的阶段,这个阶段计算机计算从大型主机,到个人电脑,到云计算。但这些并不是根本原因,而是接下来几年中将会发生的。

这个时期使那些像我一样的人们兴奋的是工具和技术的开放,这得以于计算机领域的蓬勃发展。今天,作为一名数据科学家,我能以很低的成本搭建一个拥有复杂算法的数据处理系统。但是达到这样的结果,我也经历了在黑夜中艰苦的探索。

这个指导的目标受益人群

这个指导可能是今天我所能给出最有价值的手册

编写这篇指导的目的是为了使所有那些数据科学家和机器学习爱好者在探索这个领域的道路上给予一些帮助,简化一些步骤。通过这篇指导,我会使你能够解决机器学习的一些问题并获得相应的一些经验。我会对几个不同的机器学习算法提供一些概要性的阐述,并且提供Python编码和R语言编码的实现。这应该足够让你开始这个领域的实际的操作。

我特意略去了这些算法背后的统计数据,因为当前你并不需要这些数据。如果你想从统计学上学习这些算法,那你应该去找其他的文献而不是这篇。但是如果你想具备开始机器学习的项目的能力,那你找对地方了。

基本上现在有3种类型机器学习算法


1.监督式学习

工作原理:此类算法有一个目标/输出变量(依赖变量),该值是通过一组预测因子(独立变量)推测出来的。通过这些预测因子,我们生成方程式得出输入与期望输出的对应关系。整个训练过程会持续到模型能通过训练数据达到一定的精确度。这类监督式学习算法有:回归算法,决策树,随机森林,邻近算法(KNN) 和逻辑回归算法等。

2.非监督式学习

工作原理:此类算法,没有目标或预期输出变量。而是用于聚集不同的组别,其被广泛的应用于根据不同设定对客户人群进行分类。这类非监督式算法有:关联规则(Apriori algorithm),K均值聚类算法。

3. 增强式学习:

运用这类算法,机器被训练成为能都做出特定的决策。机器被暴露于一个环境,它在其中通过不断的尝试与错误训练自己。这种机器学习通过过去的经验来试图捕捉最优解来做出最准确的商业决策。这类增强式算法有:马可夫决策过程。

普遍的几种机器学习算法

这是几种被广泛运用的机器学习算法。这些算法能被应用到几乎所有数据问题。

1.    线性回归

2.    逻辑回归

3.    决策树

4.    支持向量机(SVM)

5.    朴素贝叶斯

6.    邻近算法

7.    K均值聚类算法

8.    随机森林

9.    降低维度算法

10. Gradient Boost和Adaboost算法

1. 线性回归

这个算法常常通过连续的数值来预测真实的数值(房屋成本,来电数量,总销售额等)。这里我们先需要通过适应一条基准线来建立独立和非独立变量。这条基准线就是回归线,可以通过以下这个线性方程来表示:

Y= a *X + b

我们通过一个儿童实验可以更好的理解线性回归。比如说,你让一个五年级的小朋友为他们班的小朋友进行体重的升序排序,但是不能测量他们的体重。你觉得小朋友会怎么做?他/她可能就是通过观察小朋友们的身高和体型来对他们进行排序。这就是线性回归在生活中的实际例子。小朋友通过实际的身高测量值和建立身高与体重的关系来完成排序任务。可以看成下面这个方程。

Y – 非独立变量,因变量

a-    斜率

X – 独立变量,自变量

b -  截距

a和b两个系数是通过最小化数据点与回归线间距离的方差之和得来的。

通过下面的这个例子,我们可以第一处最合适的线性方程 y=0.2811x+13.9通过这个方程,我们从一个人的身高推测出这个人的体重。

线性回归主要有两种类型:简单线性回归和多元线性回归。简单线性回归只有一个自变量。而多元线性回归有多个自变量。当最佳匹配的那条线正好是多项式或曲线型回归的,那我们就称他们为多项式回归或曲线回归。

Python 代码


#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import linear_model
#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train=input_variables_values_training_datasets
y_train=target_variables_values_training_datasets
x_test=input_variables_values_test_datasets
# Create linear regression object
linear = linear_model.LinearRegression()
# Train the model using the training sets and check score
linear.fit(x_train, y_train)
linear.score(x_train, y_train)
#Equation coefficient and Intercept
print('Coefficient: \n', linear.coef_)
print('Intercept: \n', linear.intercept_)
#Predict Output
predicted= linear.predict(x_test)


R 代码


#Load Train and Test datasets
#Identify feature and response variable(s) and values must be numeric and numpy arrays
x_train <- input_variables_values_training_datasets
y_train <- target_variables_values_training_datasets
x_test <- input_variables_values_test_datasets
x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
linear <- lm(y_train ~ ., data = x)
summary(linear)
#Predict Output
predicted= predict(linear,x_test) 



2. 逻辑回归

这里不要被这个名字给混淆,这是一种分类而不是回归算法。它能够基于一组自变量来预估离散值(二进制值比如0或1,是或否,真或假)。简单来讲,它通过把给定的数据输入进一个评定模型方程来预测一个事件发生的可能性。因此它又被称为逻辑回归模型。 因为它是预测可能性的,它的输出值介于0和1之间。

让我们再通过一个例子来理解逻辑回归。

建设你的一个朋友让你解决一个智力题,这样就有两种情况- 要么你能解决,要么你解决不了。想象一下,现在有非常多的智力题给你解决来得出你擅长于那种类型的智力题。这个问题的结论就会像这样:如果给你的是一道10级的三角问题,你有70%的可能性能解答出来。而另一方面,如果是一道5级的历史题,你答出来的可能性只有30%。这就是逻辑回归所要做的。

从数学角度上来说,对数几率的输出就是预期变量的线性组合模型。

odds= p/ (1-p) = probability of event occurrence / probability of not event occurrence
ln(odds) = ln(p/(1-p))
logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3....+bkXk

以上公式中的p代表某个目标特征出现的概率。我们在选择参数时需要最大化观测值样本数据的相似度而不是最小化样本数据的均方差(类似普通的回归)

Python 代码

#Import Library
from sklearn.linear_model import LogisticRegression
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create logistic regression object
model = LogisticRegression()
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Equation coefficient and Intercept
print('Coefficient: \n', model.coef_)
print('Intercept: \n', model.intercept_)
#Predict Output
predicted= model.predict(x_test)

R 代码

x <- cbind(x_train,y_train)
# Train the model using the training sets and check score
logistic <- glm(y_train ~ ., data = x,family='binomial')
summary(logistic)
#Predict Output
predicted= predict(logistic,x_test)

更多…..

还有很多不同的步骤来改进这个模型:

  • 加入交互作用项
  • 去除特征值
  • 正则技术
  • 运用非线性模型

3. 决策树

这是我偏爱的算法之一,也在实际中用的比较多。它是一种监督式学习算法,常被用来解决分类问题。令人惊喜的是,它能对分类变量和连续依赖变量都起作用。在这个算法里,我们把所有的数据分成两个或多个同类集合。这是基于尽可能多的使用主要属性特征/自变量来区别分组。更多的细节可以参考:Decision Tree Simplified.


就上面的结构,你可以发现所有结果根据不同的属性被分成4个不同的组别来定义“他们是否会去玩”。为了区分各种不同的组别,我们使用了不同的技术,比如基尼系数,信息增益,卡方检验,熵值。

通过玩Jezzball这个游戏能最好的来理解决策树的工作原理。这个游戏是微软的一款经典老游戏(见下图)。这个游戏的基本目的就是,你可以在一个有活动墙的房间内来放置活动钱来最大化墙所覆盖的面积而不碰到其中运动的小球。

所以,每次你用墙来分割房间的时候,你都在试图区分出2个不同的区域。决策树的工作原理于此非常类似。

更多细节:Simplified Version of Decision Tree Algorithms

Python 代码

#Import Library
#Import other necessary libraries like pandas, numpy...
from sklearn import tree
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create tree object
model = tree.DecisionTreeClassifier(criterion='gini')
# for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini
# model = tree.DecisionTreeRegressor() for regression
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)

R 代码

library(rpart)
x <- cbind(x_train,y_train)
# grow tree
fit <- rpart(y_train ~ ., data = x,method="class")
summary(fit)
#Predict Output
predicted= predict(fit,x_test)

4. 支持向量机

这是一个分类方法。在这个算法中,我们将每一个数据作为一个点在一个n维空间上作图(n是特征数),每一个特征值就代表对应坐标值的大小。比如说我们有两个特征:一个人的身高和发长。我们可以将这两个变量在一个二维空间上作图,图上的每个点都有两个坐标值(这些坐标轴也叫做支持向量)。

现在我们要在图中找到一条直线能最大程度将不同组的点分开。两组数据中距离这条线最近的点到这条线的距离都应该是最远的。

在上图中,黑色的线就是最佳分割线。因为这条线到两组中距它最近的点,点A和B的距离都是最远的。任何其他线必然会使得到其中一个点的距离比这个距离近。这样根据数据点分布在这条线的哪一边,我们就可以将数据归类。

更多阅读Simplified Version of Support Vector Machine

我们可以把这个算法想成n维空间里的JezzBall游戏,不过有一些变动:

·         你可以以任何角度画分割线/分割面(经典游戏中只有垂直和水平方向)。

·         现在这个游戏的目的是把不同颜色的小球分到不同空间里。

·         小球是不动的。

Python 代码

#Import Library
from sklearn import svm
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object
model = svm.svc()
# there is various option associated with it, this is simple for classification. You can refer link, for mo
# re detail.
# Train the model using the training sets and check score
model.fit(X, y)
model.score(X, y)
#Predict Output
predicted= model.predict(x_test)


R 代码

library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-svm(y_train ~ ., data = x)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)

5. 朴素贝叶斯

这个算法是建立在贝叶斯理论上的分类方法。它的假设条件是自变量之间相互独立。简言之,朴素贝叶斯假定某一特征的出现与其它特征无关。比如说,如果一个水果它是红色的,圆状的,直径大概7cm左右,我们可能猜测它为苹果。即使这些特征之间存在一定关系,在朴素贝叶斯算法中我们都认为红色,圆状和直径在判断一个水果是苹果的可能性上是相互独立的。

朴素贝叶斯的模型易于建造,并且在分析大量数据问题时效率很高。虽然模型简单,但很多情况下工作得比非常复杂的分类方法还要好。

贝叶斯理论告诉我们如何从先验概率P(c),P(x)和条件概率P(x|c)中计算后验概率P(c|x)。算法如下

·         P(c|x)是已知特征x而分类为c的后验概率。

·         P(c)是种类c的先验概率。

·         P(x|c)是种类c具有特征x的可能性。

·         P(x)是特征x的先验概率。

例子: 以下这组训练集包括了天气变量和目标变量“是否出去玩”。我们现在需要根据天气情况将人们分为两组:玩或不玩。整个过程按照如下步骤进行:

步骤1:根据已知数据转换成频率表

步骤2:通过发现其中的概率制作似然值表。比如阴天(Overcast)的概率为0.29,此时玩的概率为0.64.

步骤3:用朴素贝叶斯计算每种天气情况下玩和不玩的后验概率。概率大的结果为预测值。

提问:  天气晴朗的情况下(sunny),人们会玩。这句陈述是否正确?

我们可以用上述方法回答这个问题。P(Yes | Sunny)=P(Sunny | Yes) * P(Yes) / P(Sunny)。

这里,P(Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P(Yes)= 9/14 = 0.64。

那么,P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60>0.5,说明这个概率值更大。

当有多种类别和多种特征时,预测的方法相似。朴素贝叶斯通常用于文本分类和多类别分类问题。

Python 代码

#Import Library
from sklearn.naive_bayes import GaussianNB
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create SVM classification object model = GaussianNB()
# there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

R 代码

library(e1071)
x <- cbind(x_train,y_train)
# Fitting model
fit <-naiveBayes(y_train ~ ., data = x)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)

6. KNN(K-邻近算法)

这个算法既可以解决分类问题,也可以用于回归问题,但工业上用于分类的情况更多。 KNN先记录所有已知数据,再利用一个距离函数,找出已知数据中距离未知事件最近的K组数据,最后按照这K组数据里最常见的类别预测该事件。

距离函数可以是欧式距离,曼哈顿距离,闵氏距离 (Minkowski Distance), 和汉明距离(Hamming Distance)。前三种用于连续变量,汉明距离用于分类变量。如果K=1,那问题就简化为根据最近的数据分类。K值的选取时常是KNN建模里的关键。

更多阅读:Introduction to k-nearest neighbors : Simplified

KNN在生活中的运用很多。比如,如果你想了解一个不认识的人,你可能就会从这个人的好朋友和圈子中了解他的信息。

在用KNN前你需要考虑到:

·         KNN的计算成本很高

·         所有特征应该标准化数量级,否则数量级大的特征在计算距离上会有偏移。

·         在进行KNN前预处理数据,例如去除异常值,噪音等。

Python 代码

#Import Library
from sklearn.neighbors import KNeighborsClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create KNeighbors classifier object model
KNeighborsClassifier(n_neighbors=6)
# default value for n_neighbors is 5
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

R 代码

library(knn)
x <- cbind(x_train,y_train)
# Fitting model
fit <-knn(y_train ~ ., data = x,k=5)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)

7. K均值算法

K均值算法是一类可以解决聚簇问题的非监督算法。它的过程按照一个简易的方法来对给定的数据进行聚簇。一个聚簇内的数据点同类的和不同类的对等组。

记得通过墨水点来发现其中的形状?K均值就是类似的方法。你观察其中的形状并且指出不同的聚簇。

K均值如何描述聚簇:

1.  K均值选取K个点,最为每个聚簇的质心。

2.  每个数据点以最近的质心形成一个聚簇。

3.  通过已有的聚簇成员再发现新的质心。

4.  通过新的质心,我们重复第2,3步,直到新的质心保持不变。

在K均值中, 我们有一组聚簇和每个聚簇的质心。每个聚簇中计算聚簇中所有点到质心的距离平方和,再将不同聚簇的距离平方和相加,我们就得到了这个聚簇方案的总平方和。我们知道,随着聚簇数量的增加,总平方和会减少。但是如果用总平方和对K作图,你会发现在某个K值之前总平方和急速减少,但在这个K值之后减少的幅度大大降低,这个值就是最佳的聚簇数。

Python 代码

#Import Library
from sklearn.cluster import KMeans
#Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
# Create KNeighbors classifier object model
k_means = KMeans(n_clusters=3, random_state=0)
# Train the model using the training sets and check score
model.fit(X)
#Predict Output
predicted= model.predict(x_test)

R 代码

library(cluster)
fit <- kmeans(X, 3) # 5 cluster solution

8. 随机森林

随机森林是决策树的集合术语。在随机森林算法中,我们有一组决策树(所以叫森林)。根据属性对一个新目标进行分类,每棵树给出一个分类结果,然后我们就说树给出了某个分类投了一票。森林就会根据投票结果进行分类(所有在这个森林中的决策树)。

每棵决策树是这样的:

如果训练集中有N种类别,则有重复地随机选取N个样本。这些样本将组成决策树的训练集。

如果有M个特征变量,那么选取数m << M,从而在每个节点上随机选取m个特征变量来分割该节点。m在整个森林养成中保持不变。

每个决策树都最大程度上进行分割,没有剪枝。

比较决策树和调节模型参数可以获取更多该算法细节。我建议读者阅读这些文章:

  1. Introduction to Random forest – Simplified
  2. Comparing a CART model to Random Forest (Part 1)
  3. Comparing a Random Forest to a CART model (Part 2)
  4. Tuning the parameters of your Random Forest model

Python 代码

#Import Library
from sklearn.ensemble import RandomForestClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Random Forest object
model= RandomForestClassifier()
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

R 代码

library(randomForest)
x <- cbind(x_train,y_train)
# Fitting model
fit <- randomForest(Species ~ ., x,ntree=500)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)

9. 降低维度算法

在过去的4-5年里,可获取的数据几乎以指数形式增长。公司/政府机构/研究组织不仅有了更多的数据来源,也获得了更多维度的数据信息。

例如:电子商务公司有了顾客更多的细节信息,像个人信息,网络浏览历史,个人喜恶,购买记录,反馈信息等,他们关注你的私人特征,比你天天去的超市里的店员更了解你。

作为一名数据科学家,我们手上的数据有非常多的特征。虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。怎样才能从1000或2000个变量里找到最重要的变量呢?这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。

进一步的了解可以阅读: Beginners Guide To Learn Dimension Reduction Techniques。

Python 代码

#Import Library
from sklearn import decomposition
#Assumed you have training and test data set as train and test
# Create PCA obeject pca= decomposition.PCA(n_components=k)
#default value of k =min(n_sample, n_features)
# For Factor analysis
#fa= decomposition.FactorAnalysis()
# Reduced the dimension of training dataset using PCA
train_reduced = pca.fit_transform(train)
#Reduced the dimension of test dataset
test_reduced = pca.transform(test)

R 代码

library(stats)
pca <- princomp(train, cor = TRUE)
train_reduced  <- predict(pca,train)
test_reduced  <- predict(pca,test)

10. Gradient Boosting & AdaBoost

GBM和AdaBoost都是在有大量数据时提高预测准确度的boosting算法。Boosting是一种集成学习方法。它通过有序结合多个较弱的分类器/估测器的估计结果来提高预测准确度。这些boosting算法在Kaggle,AV Hackthon, CrowdAnalytix等数据科学竞赛中有出色发挥。

更多阅读:Know about Gradient and AdaBoost in detail

Python 代码

#Import Library
from sklearn.ensemble import GradientBoostingClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Gradient Boosting Classifier object
model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)

R 代码

library(caret)
x <- cbind(x_train,y_train)
# Fitting model
fitControl <- trainControl( method = "repeatedcv", number = 4, repeats = 4)
fit <- train(y ~ ., data = x, method = "gbm", trControl = fitControl,verbose = FALSE)
predicted= predict(fit,x_test,type= "prob")[,2] 

GradientBoostingClassifier 和随机森林是两种不同的boosting分类树。人们经常提问这两个算法有什么不同。

结束语

现在,我确信你对机器学习算法运用有了一个基本概念。希望通过这篇文章和其中的Python和R语言代码能让你马上开始投身到机器学习研究中来。从现在开始,努力成为一名机器学习的专家。找到一个问题,对问题过程设计一个模型,应用这些代码来得到有趣的结果。

原文链接:https://www.analyticsvidhya.com/blog/2015/08/common-machine-learning-algorithms/

时间: 2024-07-29 12:34:09

机器学习算法基础(Python和R语言实现)的相关文章

Python赶超R语言,成为数据科学、机器学习平台中最热门的语言?

近日,kdnuggets做了一个关于数据科学.机器学习语言使用情况的问卷调查,他们分析了954个回答,得出结论--Python已经打败R语言,成为分析.数据科学和机器学习平台中使用频率最高的语言.有关此次问卷更具体的情况如何?笔者将kdnuggets上发表的总结文编译整理如下: 之前我们在kdnuggets上做了这样一个问卷调查,2016.2017两年,在分析.数据科学和机器学习的工作中,你用R语言,还是Python,或两者都用,或选择其他的语言? 通过分析954个回答,我们得出了这样的结论:虽

机器学习算法与Python实践之(五)k均值聚类(k-means)

       机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了.        机器学习中有两类的大问题,一个是分类,一个是聚类.分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行分类.这属于supervised learning(监督学习).而聚类指事先

机器学习算法的python实现之KNN-k近邻算法的实现

1.背景 今后博主会每周定时更新机器学习算法及其python的简单实现.今天学习的算法是KNN近邻算法.KNN算法是一个监督学习分类器类别的算法. 什么是监督学习,什么又是无监督学习呢.监督学习就是我们知道目标向量的情况下所使用的算法,无监督学习就是当我们不知道具体的目标变量的情况下所使用的.而监督学习又根据目标变量的类别(离散或连续)分为分类器算法和回归算法. k-Nearest Neighbor.k是算法中的一个约束变量,整个算法的总体思想是比较简单的,就是将数据集的特征值看作是一个个向量.

Python VS R语言?数据分析与挖掘该选哪一个?

什么是R语言? R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的罗斯·伊哈卡和罗伯特·杰特曼开发(也因此称为R),现在由"R开发核心团队"负责开发.R基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行.R的语法是来自Scheme. R的源代码可自由下载使用,亦有已编译的可执行文件版本可以下载,可在多种平台下运行,包括UNIX(也包括FreeBSD和Linux).W

机器学习算法的python实现之决策树-Decision tree(1)信息熵划分数据集

1.背景 决策书算法是一种逼近离散数值的分类算法,思路比较简单,而且准确率较高.国际权威的学术组织,数据挖掘国际会议ICDM (the IEEE International Conference on Data Mining)在2006年12月评选出了数据挖掘领域的十大经典算法中,C4.5算法排名第一.C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. 算法的主要思想就是将数据集按照特征对目标指数的影响由高到低排列.行成一个二叉树序列,进行分类,如下图所示. 现在的问题关

机器学习算法的python实现之扫黄神器-朴素贝叶斯分类器的实现

1.背景 以前我在外面公司实习的时候,一个大神跟我说过,学计算机就是要一个一个贝叶斯公式的套用来套用去.嗯,现在终于用到了.朴素贝叶斯分类器据说是好多扫黄软件使用的算法,贝叶斯公式也比较简单,大学做概率题经常会用到.核心思想就是找出特征值对结果影响概率最大的项.公式如下: 什么是朴素贝叶斯,就是特征值相互独立互不影响的情况.贝叶斯可以有很多变形,这里先搞一个简单的,以后遇到复杂的再写. 2.数据集 摘自机器学习实战. [['my','dog','has','flea','problems','h

机器学习算法的python实现之svm支持向量机(2) 简化版SMO算法

1.背景知识 通过上一节我们通过引入拉格朗日乗子得到支持向量机变形公式.详细变法可以参考这位大神的博客--地址 参照拉格朗日公式F(x1,x2,...λ)=f(x1,x2,...)-λg(x1,x2...).我们把上面的式子变型为: 约束条件就变成了: 下面就根据最小优化算法SMO(Sequential Minimal Optimization).找出距离分隔面最近的点,也就是支持向量集.如下图的蓝色点所示. 本栏目更多精彩内容:http://www.bianceng.cnhttp://www.

机器学习算法的python实现之svm支持向量机(1) 理论知识

1.背景 强烈推荐阅读(http://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html) 支持向量机SVM(support vector machines).SVM是一种二值分类器,是近些年比较流行的一种分类算法. 本文,首先要介绍一些基本的知识概念,在下一章将对SVM进行简单地代码实现. 2.基本概念 (1)线性可分 首先介绍一下什么叫线性可分,引用一张上一节的图.线性可分实际上就是可以用一条直线将两种不同的点区分开来.由此我们

机器学习算法的python实现之逻辑回归的实现(LogicalRegression)

1.背景知识 在刚刚结束的天猫大数据s1比赛中,逻辑回归是大家都普遍使用且效果不错的一种算法. (1)回归 先来说说什么是回归,比如说我们有两类数据,各有50十个点组成,当我门把这些点画出来,会有一条线区分这两组数据,我们拟合出这个曲线(因为很有可能是非线性),就是回归.我们通过大量的数据找出这条线,并拟合出这条线的表达式,再有数据,我们就以这条线为区分来实现分类.下图是我画的一个数据集的两组数据,中间有一条区分两组数据的线. 本栏目更多精彩内容:http://www.bianceng.cnht