2016-10-13 16:10:23 drbinzhao 阅读数 10555

Conference on Computer Vision and Pattern Recognition(CVPR)  论文中

Convolution

Deep

卷积神经网络(CNN)

递归神经网络(RNN) 很多

SVM 不火了。

  • 深度学习是 data driven 的,需要大量的数据,而传统的机器学习算法不需要;

  • 深度学习本质上可以看作一个特征学习器,在无需另构特征情况下,传统的机器学习算法已经能够胜任日常的任务;

2017-10-25 14:35:31 wangli0519 阅读数 2835

支持向量机Support Vector Machine (SVM)是有监督学习中最有影响的方法之一。

SVM与逻辑回归Logistic Regression相似, 都基于线性函数 wTx+b

SVM的关键创新在与kernel trick, 采用样本点乘的形式我们可以将SVM使用的线性函数写成

wTx+b=b+i=1mαixTx(i)
其中x(i) 是训练样本,α 是系数向量

我们用特征函数 ϕ(x) 替代 x ,则点乘部分可替换为函数 k(x,x(i))=ϕ(x)ϕ(x(i)) ,这里的函数 k 就被称为kernel。

这样我们可以将函数写成

f(x)=b+iαik(x,x(i))

这个函数相对于 x 是非线性的,但相对于 ϕ(x) 是线性的,尤其重要的是 f(x) 对于 α 是线性的。

这就相当于我们首先使用 ϕ(x) 对所有样本进行了预处理,然后使用一个线性模型。

由于我们这里要优化的是 α ,这就使我们能用线性的模型来处理非线性的任务。

最常用到的kernel是Gaussian kernel高斯核 k(u,v)=N(uv;0,σ2I) ,其中N(x;μ,Σ) 是标准正态密度,它也被称为radial basis function (RBF) kernel,

我们可以将高斯核视作执行模板匹配,首先训练样本 x 与对应的标签 y 成为 y 类别的模板,当测试样本 x, 的欧几里德距离接近 x 时,认为 x,x 的模板非常相似,模型给对应的 y 一个非常大的权重。

SVM不是唯一可以用kernel trick提高的算法,所有使用kernel trick的算法被称为kernel machines或kernel methods。

SVM的一个弱点是评估决策函数的成本与训练样本数量成线性相关,减轻影响的方法是学习一个大多为0的 α 向量,这样分类新样本时只需评估那些 αi 不为0的训练样本,这些训练样本被称为support vectors 支撑向量。

Kernel machines当数据集规模巨大时计算成本非常高,相应的有了Stochastic Gradient Descent,同时核机器也不能很好的泛化,为克服核机器这个弱点引发了深度学习的复兴。

2017-06-29 21:13:30 tz_zs 阅读数 350

____tz_zs学习笔记


其他学习资料:

支持向量机通俗导论(理解SVM的三层境界)

http://blog.csdn.net/v_july_v/article/details/7624837

支持向量机(SVM)算法

http://www.cnblogs.com/end/p/3848740.html


在深度学习(2012)出现之前,支持向量机被认为机器学习中近十几年来最成功,表现最好的算法。

SVM的主要思想可以概括为两点:
  1. 它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
  2. 它基于结构风险最小化理论之上再特征空间中构建最优超平面,使得学习器得到全局最优化,并且在整个样本空间的期望以某个概率满足一定上界。


SVM算法特性:

训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定的。所以SVM不太容易产生过度拟合 

SVM训练出来的模型完全依赖于支持向量(Support Vectors),即使训练集里面所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型。 

一个SVM如果训练得出的支持向量个数比较小,SVM训练出的模型比较容易被泛化。

简单应用案例1:

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
from sklearn import svm


X = [[2, 0], [1, 1], [2,3]]
y = [0, 0, 1]
clf = svm.SVC(kernel = 'linear')
clf.fit(X, y)  


print clf


# get support vectors
print clf.support_vectors_


# get indices of support vectors
print clf.support_ 


# get number of support vectors for each class
print clf.n_support_ 


运行结果:

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma='auto', kernel='linear',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
[[ 1.  1.]
 [ 2.  3.]]
[1 2]
[1 1]


简单应用案例2:

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
print(__doc__)

import numpy as np
import pylab as pl
from sklearn import svm

# we create 40 separable points
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20

# fit the model
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)

# get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - (clf.intercept_[0]) / w[1]

# plot the parallels to the separating hyperplane that pass through the
# support vectors
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])


print "w: ", w
print "a: ", a
# print " xx: ", xx
# print " yy: ", yy
print "support_vectors_: ", clf.support_vectors_
print "clf.coef_: ", clf.coef_

# In scikit-learn coef_ attribute holds the vectors of the separating hyperplanes for linear models. It has shape (n_classes, n_features) if n_classes > 1 (multi-class one-vs-all) and (1, n_features) for binary classification.
# 
# In this toy binary classification example, n_features == 2, hence w = coef_[0] is the vector orthogonal to the hyperplane (the hyperplane is fully defined by it + the intercept).
# 
# To plot this hyperplane in the 2D case (any hyperplane of a 2D plane is a 1D line), we want to find a f as in y = f(x) = a.x + b. In this case a is the slope of the line and can be computed by a = -w[0] / w[1].




# plot the line, the points, and the nearest vectors to the plane
pl.plot(xx, yy, 'k-')
pl.plot(xx, yy_down, 'k--')
pl.plot(xx, yy_up, 'k--')

pl.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
           s=80, facecolors='none')
pl.scatter(X[:, 0], X[:, 1], c=Y, cmap=pl.cm.Paired)

pl.axis('tight')
pl.show()


运行结果:

@author:tz_zs

w:[0.90230696 0.64821811]
a:-1.39198047626
support_vectors_:[[-1.02126202 0.2408932]
 [-0.46722079 -0.53064123]
 [0.95144703 0.57998206]]
clf.coef_:[[0.90230696 0.64821811]]



线性不可分的情况(linearly inseparable case)

如图1所示,利用一个非线性的映射把原数据集中的向量点转化到一个更高维度的空间中
2,在这个高维度的空间中找一个线性的超平面来根据线性可分的情况处理

简单应用实例(我运行时数据集下载失败):

# -*- coding: utf-8 -*-
"""
@author: tz_zs
"""
from __future__ import print_function


from time import time
import logging
import matplotlib.pyplot as plt #绘图


from sklearn.cross_validation import train_test_split
from sklearn.datasets import fetch_lfw_people
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.decomposition import RandomizedPCA
from sklearn.svm import SVC


print(__doc__)


# Display progress logs on stdout
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')


################################################## #############################
# Download the data, if not already on disk and load it as numpy arrays
# 下载名人头像数据集(如果没有的话)
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

# introspect the images arrays to find the shapes (for plotting)
n_samples, h, w = lfw_people.images.shape

# for machine learning we use the 2 data directly (as relative pixel
# positions info is ignored by this model)
X = lfw_people.data
n_features = X.shape[1]



# the label to predict is the id of the person
y = lfw_people.target
target_names = lfw_people.target_names
n_classes = target_names.shape[0]


print("Total dataset size:")
print("n_samples: %d" % n_samples)
print("n_features: %d" % n_features)
print("n_classes: %d" % n_classes)



###############################################################################
# Split into a training set and a test set using a stratified k fold


# split into a training and testing set
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25)




###############################################################################
# Compute a PCA (eigenfaces) on the face dataset (treated as unlabeled
# dataset): unsupervised feature extraction / dimensionality reduction
n_components = 150


print("Extracting the top %d eigenfaces from %d faces"
      % (n_components, X_train.shape[0]))
t0 = time()
pca = RandomizedPCA(n_components=n_components, whiten=True).fit(X_train)
print("done in %0.3fs" % (time() - t0))


eigenfaces = pca.components_.reshape((n_components, h, w))


print("Projecting the input data on the eigenfaces orthonormal basis")
t0 = time()
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
print("done in %0.3fs" % (time() - t0))




###############################################################################
# Train a SVM classification model


print("Fitting the classifier to the training set")
t0 = time()
param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],
              'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
clf = GridSearchCV(SVC(kernel='rbf', class_weight='auto'), param_grid)
clf = clf.fit(X_train_pca, y_train)
print("done in %0.3fs" % (time() - t0))
print("Best estimator found by grid search:")
print(clf.best_estimator_)




###############################################################################
# Quantitative evaluation of the model quality on the test set


print("Predicting people's names on the test set")
t0 = time()
y_pred = clf.predict(X_test_pca)
print("done in %0.3fs" % (time() - t0))


print(classification_report(y_test, y_pred, target_names=target_names))
print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))




###############################################################################
# Qualitative evaluation of the predictions using matplotlib


def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
    """Helper function to plot a gallery of portraits"""
    plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
    plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())




# plot the result of the prediction on a portion of the test set


def title(y_pred, y_test, target_names, i):
    pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]
    true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]
    return 'predicted: %s\ntrue:      %s' % (pred_name, true_name)


prediction_titles = [title(y_pred, y_test, target_names, i)
                     for i in range(y_pred.shape[0])]


plot_gallery(X_test, prediction_titles, h, w)


# plot the gallery of the most significative eigenfaces


eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)


plt.show()




2018-06-26 21:14:25 Miss_yuki 阅读数 366

大家好,今天学习了SVM相关知识,真的很难,看了很久,依旧手推公式,总结出来,希望能帮到大家。

SVM是一种二分类模型,在特征空间中寻求间隔最大化的分离超平面。具体推导如图:




有不懂得欢迎问我,我们下期见。





2018-10-11 21:36:40 QQ1131221088 阅读数 19

写在前面:

为了更好的督促自己和志同道合的朋友一起学习!特制定了一个学习机器学习、深度学习算法、数据挖掘算法的计划。即定期,发布一个学习任务,整理相关的学习资料(文本、知名博客、视频、数据、程序)等内容,以及学习目标等等。学习任务通过本博客及微信公众号“算法学习小课堂”同步更新,完成自驱学习之后,将学习经验及总结的文本(自己或一起学习的朋友),以博客及微信推送的形式发出,供大家参考。另外相关数据及参考代码会以github的形式供大家参考、练习。

第一期:SVM的学习

SVM是机器学习中经典、有效且理解较为困难的算法,特别是对背后的数据原理推到以及优化实现SMO等内容的理解。但是理解SVM是学习机器学习算法过程中的一个重要环节,因此,本次作为第一期的学习对象。

资料:

  1. 学习教材:《机器学习实战(machine learning in action)》一书的第六章节。该章节简要介绍了必要的原理及代码的实现,从易到难,从简到全。
  2. 经典博文:支持向量机通俗导论(理解SVM的三层境界)https://blog.csdn.net/v_july_v/article/details/7624837 ,该博文通俗易懂的介绍了支持向量机,且有详细的数学推到过程。
  3. 天池大佬讲解视频及项目介绍和代码。https://tianchi.aliyun.com/learn/liveDetail.html?spm=5176.100150.711.7.41d3278458Bb1u&classroomId=250
  4. github代码及数据地址:https://github.com/bshyang/MachineLearning-action/tree/master/SVM 里面包括kaggle手写数字识别数据和机器学习实战一书第六章的代码和样例供大家参考。
  5. 另外:机器学习实战和svm三层境界 网上都可以找到对应的pdf文件。

学习目标

  1. 理解SVM的原理和意义。
  2. 对绝大多数的数学公式推导理解,并自己进行推导。
  3. 理解SMO算法
  4. 使用SVM实现手写数字识别项目,可以将结果放到kaggle上进行测试。
  5. 最后能够形成一个自己的学习总结文档
  6. 要多思考为什么?

学习周期

暂定一周吧,毕竟对于加班狗来说,时间是挤出来的!
加油吧!

加入方式

QQ群:170272813

最后:
“If You Want to Go Fast, Go Alone. If You Want to Go Far, Go Together.”
学习之路贵在坚持,积累!希望自己可以走的更远!

没有更多推荐了,返回首页