Machine Learning学习笔记

Unsupervised-clustering

1.k-means

算法过程

  1. 选择簇个数k
  2. 计算各样本到簇中心距离
  3. 根据划分结果更新簇中心
  4. 重复2,3
  5. 满足停止条件结束(中心点不变,达到最大迭代次数)

要点

  1. 时间复杂度O(n): 假设I次迭代,n个数据,每个数据m个feature,则为O(I m n), I和n为常数,化简为O(n)。
  2. k自由选择,在每个k值重复运行避免local opt,一般k选择较小,可通过枚举探究。
  3. 注意数据规格化。
  4. 距离选择:Minkowski distance, Euclidean distance, Manhattan distance.

模型评估

  1. 凝聚度:对某个元素,计算其与簇内其他元素距离平均值,记为ai。
  2. 分离度:对某个元素,计算其与另一簇所有点平均距离,遍历所有簇,找到最小平均距离,记为bi。
  3. 轮廓系数:对某个元素, s i = b i − a i m a x ( a i , b i ) s_{i} = \frac{b_{i}-a_{i}}{max(a_{i},b_{i})} si=max(ai,bi)biai。计算所有元素轮廓系数,平均值为该聚类整体轮廓系数。
  4. 评估: s i s_{i} si小于0,聚类效果差;si接近1,效果好。

代码
sklearn 实现

import numpy as py
from sklearn.cluster import KMeans

def loadData(filePath):
    fr = open(filePath,'r+')
    lines = fr.readlines()
    retData = []
    retFlowerName = []
    for line in lines:
        items = line.strip().split(",")
        print(items)
        retFlowerName.append(items[4])
        retData.append([float(items[i]) for i in range(0,len(items)-1)])
    return retData,retFlowerName

if __name__ == '__main__':
    data,FlowerName = loadData("iris.data")
    km = KMeans(n_clusters=3)
    label = km.fit_predict(data)
    result = []
    for i in range(len(label)):
        if label[i] == 0:
            result.append(1)
        elif label[i] == 1:
            result.append(2)
        else:
            result.append(3)
    print(result)
parameters:
n_clusters
max_iter
n_init:用不同质心初始化运算次数
Python笔记
 1.__name__
 __name__ 是python的内置属性,是系统全局变量!每一个py文件都有一个属于自己的__name__:
如果py文件作为模块被导入(import),那么__name__就是该py文件的文件名(也称 模块名);如果py文件直接运行时(Ctrl+Shift+F10),那么__name__默认等于字符串”__main__”;

2.__name__ == “__main__” 作为启动py文件的main函数入口

3.一个项目中必然会包含多个模块文件,每个模块文件在自己写完代码之后会做一些简单的测试用于检测bug 或者 对自己的函数调用写一个简单的示例,而恰到好处的是:__name__ == “__main__”  既不会影响你的测试代码,也不会影响别人调用你的接口函数。

缺点

  1. 实际情况下对于k的选择没有合适的依据。
  2. 会受到离群点的影响,因为kmeans会给所有的点分类。
  3. 主要适用于球星分布数据,凹图形效果不好。

2.DBSCAN

定义

  1. Eps:同一簇中样本最大距离(参数)
  2. MinPts:同一簇中最少样本点数
  3. 核心点:Eps内样本点超过Minpts的点
  4. 边界点:Eps内样本点小于MinPts,但在核心领域内
  5. 噪音点:Neither

算法流程

  1. 按照核心点,边界点,噪音点label所有的点
  2. 删除噪音点
  3. 为Eps内的核心点连一条边
  4. 每组连通的核心点形成簇
  5. 把边界点归入簇中

代码

import numpy as np
from sklearn.cluster import DBSCAN

def load_data(data_file):
    fr = open(data_file,"r+")
    lines = fr.readlines()
    data = []
    for line in lines:
        items = line.strip().split(",")
        data.append([float(items[i]) for i in range(len(items)-1)])
    return data

if __name__ == '__main__':
    data = load_data("iris.data")
    dbs = DBSCAN(eps=0.62,min_samples=3).fit(data)
    labels = dbs.labels_
    print("Labels:")
    print(labels)
parameters:
metric:距离方式
algorithm:最近搜索算法
eps:样本中最大距离
min_samples:MinPts

对比Kmeans

pros

  1. 不需要指定k。
  2. 可以适用于不同数据集。
  3. 可以识别出离群点。

cons

  1. 速度比kmeans慢。
  2. eps与min_samples设定较难:eps小,可能没有核心点,所有点都是噪声点;eps大,所有点都归为一个簇。min_samples太大,核心点更少,噪声更多。

Unsupervised-降维

PCA(Principle Component Analysis)

原理
Matrix的主成分就是其协方差Matrix对应的特征向量

推导
PCA推导过程
算法过程

  1. 对样本进行去中心化
  2. 计算样本协方差矩阵
  3. 对协方差矩阵做特征值分解
  4. 取最大的d特征作为特征向量

代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets  import load_iris

data = load_iris()
y = data.target
x = data.data
pca = PCA(n_components=2)
reduced_X = pca.fit_transform(x)

red_x,red_y = [],[]
blue_x,blue_y = [],[]
green_x,green_y = [],[]

for i in range(len(reduced_X)):
    if y[i] == 0:
        red_x.append(reduced_X[i][0])
        red_y.append(reduced_X[i][1])
    elif y[i] == 1:
        blue_x.append(reduced_X[i][0])
        blue_y.append(reduced_X[i][1])   
    else:
        green_x.append(reduced_X[i][0])
        green_y.append(reduced_X[i][1])

plt.scatter(red_x,red_y,c='r',marker='x')
plt.scatter(blue_x,blue_y,c='b',marker='D')
plt.scatter(green_x,green_y,c='g',marker='.')
plt.savefig('iris_flower.jpg')
n_components
svd_solver:奇异值分解方法

贡献率与k
在我的文章特征值和特征向量中说过,特征值反映了矩阵对于特征向量的拉伸程度,只有拉伸而没有旋转,也就是在特征向量方向上的作用程度,所以在PCA中我们选取前K个特征向量组成新基进行投影,就是因为原特征在前K个特征向量有最大的作用程度,投影过后可以保留更多的信息,作用程度是用特征值表示的,所以我们可以使用下面的式子表示贡献率,贡献率是表示投影后信息的保留程度的变量,可以用下面的式子表示:

∑ i = 0 K λ i ∑ i = 0 m λ i \frac{\sum_{i=0}^{K}\lambda _{i}}{\sum_{i=0}^{m}\lambda _{i}} i=0mλii=0Kλi

也就是特征值的总和比上前K个特征值,一般来说贡献率要大于85%。

kernel PCA
PCA利用协方差矩阵判断变量间的方差一致性,寻找出变量之间的最佳的线性组合,来代替特征,从而达到降维的目的。从高维到低维的映射是线性的,所以对于非线形相关特征区分效果不好。
首先计算n个样本间的距离矩阵D(n*n),利用核函数F,F(D)为高维空间投射。

NMF(Non-negative matrix factorization)

原理
任意给定一个非负矩阵V,其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件V=WH,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。其中W为基础图像矩阵(字典矩阵),H为拓展矩阵。个人理解有点像是分解成了元素权值的感觉。

损失函数

  1. 欧式距离
    arg ⁡ min ⁡ 1 2 ∥ A − W H ∥ 2 \arg \min \frac{1}{2}\left \| A-WH\right \|^{2} argmin21AWH2
  2. KL散度
    d K L ( X , Y ) = ∑ i , j ( X i j l o g ( X i j W H i j ) − X i j + W H i j ) ) d_{KL}(X,Y) = \sum_{i,j}(X_{ij}log(\frac{X_{ij}}{WH_{ij}})-X_{ij}+WH_{ij})) dKL(X,Y)=i,j(Xijlog(WHijXij)Xij+WHij))

原理推导以及梯度下降导出的乘法update方法

代码

from numpy.random import RandomState
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn import decomposition
 
 
n_row, n_col = 2, 3
n_components = n_row * n_col
image_shape = (64,64)
 
 
###############################################################################
# Load faces data
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(0))
faces = dataset.data
print(faces)
###############################################################################
def plot_gallery(title, images, n_col=n_col, n_row=n_row):
    plt.figure(figsize=(2. * n_col, 2.26 * n_row)) 
    plt.suptitle(title, size=16)
 
    for i, comp in enumerate(images):
        plt.subplot(n_row, n_col, i + 1)
        vmax = max(comp.max(), -comp.min())
 
        plt.imshow(comp.reshape(image_shape), cmap=plt.cm.gray,
                   interpolation='nearest', vmin=-vmax, vmax=vmax)
        plt.xticks(())
        plt.yticks(())
    plt.subplots_adjust(0.01, 0.05, 0.99, 0.94, 0.04, 0.)
 
     
plot_gallery("First centered Olivetti faces", faces[:n_components])
###############################################################################
 
estimators = [
    ('Eigenfaces - PCA using randomized SVD',
         decomposition.PCA(n_components=6,whiten=True)),
 
    ('Non-negative components - NMF',
         decomposition.NMF(n_components=6, init='nndsvda', tol=5e-3))
]
 
###############################################################################
 
for name, estimator in estimators:
    print("Extracting the top %d %s..." % (n_components, name))
    print(faces.shape)
    estimator.fit(faces)
    components_ = estimator.components_
    print(components_[0].shape)
    plot_gallery(name, components_[:n_components])
 
plt.show()
一些疑惑:
对于库中fetch_olivetti_faces数据集中导出的数据比较疑惑,应该是已经进行了一些处理。因为自己在利用其他数据进行尝试时,output出的feature不像fetch_olivetti_faces提取出的feature那样可视化效果好,基本看不出原本图像的印象了。

Supervised-classification

Logistic Regression

启发
为了能实现分类目的,更倾向于让output介于0-1之间,可以利用sigmoid函数的值域为(0,1)性质实现。
h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x h_{\theta }\left ( x \right )=g\left ( \theta^{T} x \right )=\frac{1}{1+e^{-\theta ^{T}x}} hθ(x)=g(θTx)=1+eθTx1
相当于对LR的结果做了一个sigmoid的转换。

预测思路
根据 h θ ( x ) h_{\theta }\left ( x \right ) hθ(x)的值域范围,可以把 h θ ( x ) h_{\theta }\left ( x \right ) hθ(x)视为在x的输入条件下,y输出为1的概率。即 h θ ( x ) = P ( y = 1 ∣ x ; θ ) h_{\theta }\left ( x \right )=P\left ( y=1|x;\theta \right ) hθ(x)=P(y=1x;θ)。当概率P ≥ \geq 0.5时,预测为1.
根据sigmoid函数图像,P ≥ \geq 0.5时, θ T x ≥ \theta^{T} x\geq θTx 0。即为decision boudary,图像上为分界线。

损失函数
在利用sigmoid函数的情况下,运用MSE会构造出一个nonconvex的代价函数,不利于优化。
所以设计出新的优化函数:
c o s t ( h θ ( x ) , y ) = { − l o g ( h θ ( x ) )  if  y = 1 − l o g ( 1 − h θ ( x ) )  if  y = 0 cost(h_{\theta }(x),y)=\begin{cases} & -log(h_{\theta }(x))\text{ if } y=1 \\ & -log(1-h_{\theta }(x))\text{ if } y=0 \end{cases} cost(hθ(x),y)={log(hθ(x)) if y=1log(1hθ(x)) if y=0

c o s t ( h θ ( x ) , y ) = − y l o g ( h θ ( x ) ) − ( 1 − y ) l o g ( 1 − h θ ( x ) ) cost(h_{\theta }(x),y)= -ylog(h_{\theta }(x)) -(1-y)log(1-h_{\theta }(x)) cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x))

优化函数
梯度下降

其他优化函数:
conjugate gradient
BFGS
L-BFGS
Advantages:不需要人工选取学习率;通常更快
Disadvantages:更复杂

多分类问题
利用one-vs-all策略

过拟合问题
high bias —— underfit
high variance —— overfit
解决方案:

  1. 减少feature数量:人工筛选feaures;利用模型进行模型筛选
  2. 减少feature的magnitude:正则化

正则化项

  1. L2 Norm
    J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x i ) − y i ) 2 + λ ∑ j = 1 n θ j 2 ] J\left ( \theta \right )=\frac{1}{2m}\left [ \sum_{i=1}^{m} (h_{\theta }(x^{i})-y^{i})^{2}+\lambda \sum_{j=1}^{n}\theta _{j}^{2}\right ] J(θ)=2m1[i=1m(hθ(xi)yi)2+λj=1nθj2]

  2. L1 Norm
    J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x i ) − y i ) 2 + λ ∑ j = 1 n | θ j | ] J\left ( \theta \right )=\frac{1}{2m}\left [ \sum_{i=1}^{m} (h_{\theta }(x^{i})-y^{i})^{2}+\lambda \sum_{j=1}^{n}|\theta _{j}|\right ] J(θ)=2m1[i=1m(hθ(xi)yi)2+λj=1nθj]

不对偏置项做正则化,因为在对输出结果的贡献中,参数b对于输入的改变是不敏感的,不管输入改变是大还是小,参数b的贡献就只是加个偏置而已。相当于如果是曲线曲率太大了,也与b无关。

Naive Bayes

算法思路
根据条件概率公式: P ( A ∣ B ) = P ( A B ) P ( B ) P(A|B)=\frac{P(AB)}{P(B)} P(AB)=P(B)P(AB)和全概率公式可以推出贝叶斯公式: P ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) ) P(B_{i}|A)=\frac{P(B_{i})P(A|B_{i})}{\sum_{j=1}^{n}P(B_{j})P(A|B_{j}))} P(BiA)=j=1nP(Bj)P(ABj))P(Bi)P(ABi)

给定dataset(X,Y),样本特征 X = ( x 1 , x 2 , x 3 . . . x n ) X = (x_{1},x_{2},x_{3}...x_{n}) X=(x1,x2,x3...xn),类别标记 Y = ( y 1 , y 2 , y 3 . . . y n ) Y = (y_{1},y_{2},y_{3}...y_{n}) Y=(y1,y2,y3...yn)。给定新样本X,判断类别。即给定X,求出 P ( y 1 ∣ x ) , P ( y 2 ∣ x ) . . . P ( y n ∣ x ) P(y_{1}|x),P(y_{2}|x)...P(y_{n}|x) P(y1x),P(y2x)...P(ynx)中概率最大的那个,也就是求出后验概率最大的输出。

根据贝叶斯公式,可得 P ( y k ∣ x ) = P ( y k ) P ( x ∣ y k ) ∑ k P ( y k ) P ( x ∣ y k ) ) P(y_{k}|x)=\frac{P(y_{k})P(x|y_{k})}{\sum_{k}P(y_{k})P(x|y_{k}))} P(ykx)=kP(yk)P(xyk))P(yk)P(xyk),其中 P ( y k ) P(y_{k}) P(yk)为先验概率。

P ( x ∣ y k ) = P ( x 1 x 2 . . . x n ∣ y k ) P(x|y_{k})=P(x_{1}x_{2}...x_{n}|y_{k}) P(xyk)=P(x1x2...xnyk),设第 i i i维特征 x i x_{i} xi取值有S_{i}个,则参数有 k ∏ i = 1 n S i k \prod_{i=1}^{n}S_{i} ki=1nSi个。假设特征相互独立,则 P ( x ∣ y k ) = ∏ i = 1 n P ( x i ∣ y k ) P(x|y_{k})=\prod_{i=1}^{n}P(x_{i}|y_{k}) P(xyk)=i=1nP(xiyk)

则上述内容都可以通过给出的样本计算得出,便可以得到要求的内容。

算法过程

  1. x = { a 1 , a 2 , . . . , a m } x=\{a_{1},a_{2},...,a_{m}\} x={a1,a2,...,am}为待分项,每个a为x的一个特性属性。
  2. 类别集合 C = { y 1 , y 2 , . . . , y n } C=\{y_{1},y_{2},...,y_{n}\} C={y1,y2,...,yn}
  3. 计算 P ( y 1 ∣ x ) , P ( y 2 ∣ x ) . . . P ( y n ∣ x ) P(y_{1}|x),P(y_{2}|x)...P(y_{n}|x) P(y1x),P(y2x)...P(ynx)
  4. P ( x ∣ y k ) = m a x { P ( y 1 ∣ x ) , P ( y 2 ∣ x ) . . . P ( y n ∣ x ) } P(x|y_{k})=max\{P(y_{1}|x),P(y_{2}|x)...P(y_{n}|x)\} P(xyk)=max{P(y1x),P(y2x)...P(ynx)}
  5. 输出预测结果 y k y_{k} yk

要点

  1. 该算法对于小规模效果较好。
  2. 若有的类别太稀有,可以进行拉普拉斯平滑( α = 1 \alpha=1 α=1),Lidstone平滑( 0 < α < 1 0<\alpha<1 0<α<1)。
生成模型:由数据学习得到概率分布,求P(Y|X)。例如朴素贝叶斯、马尔可夫、高斯混合、LDA等
判别模型:由数据学得决策函数或条件概率分布。例如k近邻、SVM、决策树、感知机等

高斯模型
如果特征为连续值,利用朴素贝叶斯会导致 P ( x i ∣ y i ) = 0 P(x_{i}|y_{i})=0 P(xiyi)=0的情况过多。此时可以利用高斯贝叶斯模型。
e . g . e.g. e.g.例如通过height, weight,shoesize来预测gender。假设三个特征均为正态分布,根据样本计算平均值和方差。
则可以得到 P ( x i ∣ y i ) = 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 P(x_{i}|y_{i})=\frac{1}{\sqrt{2\pi \sigma ^{2}}}e^{-\frac{(x-\mu)^{2}}{2\sigma^{2}}} P(xiyi)=2πσ2 1e2σ2(xμ)2,之后的流程与朴素贝叶斯类似。

KNN、Decision Tree、Logistic Regression

代码

import pandas as pd
import numpy as np

from sklearn.metrics import classification_report

from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn import model_selection

def iris_type(s):
    class_label={b'Iris-setosa':0,b'Iris-versicolor':1,b'Iris-virginica':2}
    return class_label[s]

filepath = 'iris.data'
data = np.loadtxt(filepath,dtype=float,delimiter=',',converters={4:iris_type})

X,y = np.split(data,(4,),axis=1)
x_train,x_test,y_train,y_test=model_selection.train_test_split(X,y,random_state=1,test_size=0.3)

print('Start training knn')
knn = KNeighborsClassifier().fit(x_train,y_train)
print('Training Done')
answer_knn = knn.predict(x_test)
print('Prediction done')

print('Start training DT')
dt = DecisionTreeClassifier().fit(x_train, y_train)
print('Training done')
answer_dt = dt.predict(x_test)
print('Prediction done')
     
print('Start training Bayes')
gnb = GaussianNB().fit(x_train, y_train)
print('Training done')
answer_gnb = gnb.predict(x_test)
print('Prediction done')

print('\n\nThe classification report for knn:')
print(classification_report(y_test, answer_knn))
print('\n\nThe classification report for DT:')
print(classification_report(y_test, answer_dt))
print('\n\nThe classification report for Bayes:')
print(classification_report(y_test, answer_gnb))
KNN表现较好。

SVM(Support Vector Machine)

启发
Logistc Regression损失函数为:
J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) l o g ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J\left ( \theta \right )=\frac{1}{m} \sum_{i=1}^{m}\left[ -y^{(i)}log(h_{\theta }(x^{(i)})) -(1-y^{(i)})log(1-h_{\theta }(x^{(i)}))\right ]+\frac{\lambda}{2m} \sum_{j=1}^{n}\theta _{j}^{2} J(θ)=m1i=1m[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]+2mλj=1nθj2
其中 − l o g h θ ( x ( i ) ) ( y = 1 ) -logh_{\theta}(x^{(i)})(y=1) loghθ(x(i))(y=1)改为 c o s t 1 ( θ T x ( i ) ) cost_{1}(\theta^{T}x^{(i)}) cost1(θTx(i))
得到:
m i n C ∑ i = 1 m [ y ( i ) c o s t i ( θ T x ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T x ( i ) ) ] + 1 2 ∑ i = 1 n θ j 2 minC\sum_{i=1}^{m} \left[y^{(i)}cost_{i}(\theta^{T}x^{(i)})+(1-y^{(i)})cost_{0}(\theta^{T}x^{(i)})\right]+\frac{1}{2}\sum_{i=1}^{n}\theta_{j}^{2} minCi=1m[y(i)costi(θTx(i))+(1y(i))cost0(θTx(i))]+21i=1nθj2
然后可以根据 − l o g h θ ( x ( i ) ) ( y = 1 ) -logh_{\theta}(x^{(i)})(y=1) loghθ(x(i))(y=1)的图像近似得到 c o s t 1 ( θ T x ( i ) ) cost_{1}(\theta^{T}x^{(i)}) cost1(θTx(i))
cost函数近似图像
发现 y = 1 y=1 y=1时, z ≥ 1 z\geq1 z1 c o s t cost cost为0, y = 0 y=0 y=0时, z ≤ − 1 z\leq-1 z1 c o s t cost cost为0。
其中 z = θ T x z=\theta^{T}x z=θTx,即 θ T x ≥ 1 \theta^{T}x\geq1 θTx1 θ T x ≤ − 1 \theta^{T}x\leq-1 θTx1为decision boudary。
所以最终优化目标可以写为:
m i n 1 2 ∑ j = 1 n θ j 2 min\frac{1}{2}\sum_{j=1}^{n}\theta_{j}^{2} min21j=1nθj2
s . t . s.t. s.t.
θ T x ( i ) ≥ 1 \theta^{T}x^{(i)}\geq1 θTx(i)1, i f if if y i = 1 y_{i}=1 yi=1
θ T x ( i ) ≤ − 1 \theta^{T}x^{(i)}\leq-1 θTx(i)1, i f if if y i = 0 y_{i}=0 yi=0

优化函数推导
推导过程
利用拉格朗日和KKT条件

松弛变量
由于受到噪声影响,可能很难找到合适的超平面,为了避免出现与另一类别有所重叠的噪声影响,引入松弛变量 ξ \xi ξ,即 θ T x ( i ) ≥ 1 + ξ i , i = ( 1 , 2 , . . . n ) \theta^{T}x^{(i)}\geq1+\xi_{i},i=(1,2,...n) θTx(i)1+ξi,i=(1,2,...n)

kernel
当样本空间是线形不可分的时候,就需要引入新的特征。
e . g . e.g. e.g.
在二维特征空间中,引入三个点,记作 l 1 , l 2 , l 3 l_{1},l_{2},l_{3} l1,l2,l3然后对于每个样本,分别计算其与这三个点的高斯距离,记作 f 1 ( i ) , f 2 ( i ) , f 3 ( i ) f_{1}^{(i)},f_{2}^{(i)},f_{3}^{(i)} f1(i),f2(i),f3(i)。则当 θ 0 + θ 1 f 1 ( i ) + θ 2 f 2 ( i ) + θ 3 f 3 ( i ) ≥ 0 \theta_{0}+\theta_{1}f_{1}^{(i)}+\theta_{2}f_{2}^{(i)}+\theta_{3}f_{3}^{(i)}\geq0 θ0+θ1f1(i)+θ2f2(i)+θ3f3(i)0时,预测为1。
c o s t f u n c t i o n cost function costfunction也变为 c o s t 1 ( θ T f ( i ) ) cost_{1}(\theta^{T}f^{(i)}) cost1(θTf(i)) c o s t 0 ( θ T f ( i ) ) cost_{0}(\theta^{T}f^{(i)}) cost0(θTf(i))
之后的推导与SVM类似。

更改上述例子中的距离计算公式,便可以得到不同的核函数。

参数分析
优化目标中的C,即对应正则化中的 1 λ \frac{1}{\lambda} λ1
Large C会导致Lower bias, higher variance;
Small C会导致Higher bias, lower variance;
如果应用高斯kernel,其中的 σ 2 \sigma^{2} σ2(根据高斯图像推断):
Large σ 2 \sigma^{2} σ2会导致Higher bias, lower variance;
Small σ 2 \sigma^{2} σ2会导致Lower bias, Higher variance;

SVM vs Logistic Regression

设n为特征数,m为样本数。

  1. 若相比m,n更大,即 n ≥ m n\geq m nm:适用Logistic Regression,或者不用kernel的SVM;
  2. n较小,m中等:适用高斯核的SVM;
  3. n较小,m很大:可以先增加一些特征,然后适用Logistic Regression或不用kernel的SVM。

Supervised-Regression

Linear regression

代价函数
MAE: L ( w , b ) = 1 n ∑ i = 1 n ( y i ^ − y i ) 2 L(w,b)=\frac{1}{n}\sum_{i=1}^{n}(\hat{y_{i}}-y_{i})^{2} L(w,b)=n1i=1n(yi^yi)2

解法

  • 最小二乘法
  • Gradient descent:其中可以设置学习率为 α t \frac{\alpha}{t} tα或者 α t \frac{\alpha}{\sqrt{t}} t α的形式,使得最终更好达到最优点。

Polynomial regression

思想
y i = w 0 + w 1 x i + w 2 x i 2 + . . . + w p x i p y_{i} = w_{0}+w_{1}x_{i}+w_{2}x_{i}^{2}+...+w_{p}x_{i}^{p} yi=w0+w1xi+w2xi2+...+wpxip中,
把其中的 { 1 , x i , x i 2 , . . . , x i p } \{1,x_{i},x_{i}^{2},...,x_{i}^{p}\} {1,xi,xi2,...,xip}堪称features,就转变成了线形的。

Ridge regression

思想
在Polynomial regression的基础上增加了L2 Norm。

代价函数
J ( θ ) = 1 2 [ ∑ i = 1 m ( h θ ( x i ) − y i ) 2 + λ ∑ j = 1 n θ j 2 ] J\left ( \theta \right )=\frac{1}{2}\left [ \sum_{i=1}^{m} (h_{\theta }(x^{i})-y^{i})^{2}+\lambda \sum_{j=1}^{n}\theta _{j}^{2}\right ] J(θ)=21[i=1m(hθ(xi)yi)2+λj=1nθj2]
R S S ( w ) = ∑ i = 1 m ( h θ ( x i ) − y i ) 2 RSS(w)=\sum_{i=1}^{m} (h_{\theta }(x^{i})-y^{i})^{2} RSS(w)=i=1m(hθ(xi)yi)2

参数分析
λ \lambda λ是用来平衡RSS与正则项的关系:
λ = 0 \lambda=0 λ=0,Cost function = RSS,即无正则项;
λ = ∞ \lambda=\infty λ=,最终 w 趋 近 于 0 w趋近于0 w0(永远不会达到0)。
通常利用Validation set来寻找合适的 λ \lambda λ:leave one cross validation.

Lasso regression(Least absolute shrinkage and selection operator)

思想
在Polynomial regression的基础上增加了L1 Norm。

代价函数
J ( θ ) = 1 2 [ ∑ i = 1 m ( h θ ( x i ) − y i ) 2 + λ ∑ j = 1 n | θ j | ] J\left ( \theta \right )=\frac{1}{2}\left [ \sum_{i=1}^{m} (h_{\theta }(x^{i})-y^{i})^{2}+\lambda \sum_{j=1}^{n}|\theta _{j}|\right ] J(θ)=21[i=1m(hθ(xi)yi)2+λj=1nθj]
R S S ( w ) = ∑ i = 1 m ( h θ ( x i ) − y i ) 2 RSS(w)=\sum_{i=1}^{m} (h_{\theta }(x^{i})-y^{i})^{2} RSS(w)=i=1m(hθ(xi)yi)2

Feature Selection方法:
 1. 自由组合:先选只有一个feature的,然后两个feature的...每一类最好的都在validation set上进行测试,选取最后表现最好的。
 2. 贪心算法。
 3. Lasso。

Feature Selection

  1. Ridge regression:如果选取一个阈值,然后过滤阈值较低的结果,这种方法不可行。因为如果有若干相关性较高的features,那么这些feature的权值会都比较小(相当于一个权值分配到了很多个上)
  2. Lasso: λ \lambda λ增加的时候,会出现有的feature的权重变成0,即稀疏性。
    上述原因可以通过画出RSS与L1,L2的图像,然后会发现L1+RSS的图像的最优化中心可能会出现在数轴上。

Neural Network

算法推导
推导过程

训练流程

Mini-batch:

  1. 采样一个batch数据
  2. 前向计算loss
  3. 反向计算梯度
  4. 用这部分梯度迭代更新权重
  5. 重复
batch size:批尺寸
机器学习中参数更新方法:

 1. Batch Gradient Descent:批处理下降,每次遍历全部数据集以后进行一次参数更新,这样下降方向更加准确,但开销更大;
 2. Stochastic Gradient Descent:随机梯度下降,每个样本进行一次梯度下降,下降快,但不准确;
 3. Mini-batch Gradient Decent:小批量下降,把样本分成若干批,分别计算损失函数和更新参数。
 
 Iteration:迭代,每更新一次w和b,就是一次Iteration。
 Epoch:所有样本被计算一次就是一次Epoch。

激活函数

  • 用途:在网络中引入非线性,增强神经网络的表达能力

  • Sigmoid:把输入变化为(0,1)的输出。
    缺点:

    1. 初始化权值为[0,1]之间的随机值时,梯度消失发生的概率较大;初始化为(1,+ ∞ \infty ),容易发生梯度爆炸。
    2. 输出非0均值,所以对 w w w求局部梯度都为正,使得梯度下降都往一个方向,收敛缓慢。(可通过分batch训练缓解)
    3. 公式中有幂运算,求解复杂。
  • tanh函数:(Hyperbolic Tangent)
    t a n h ( x ) = e x − e − x e x + e − x tanh(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+exexex
    解决了sigmoid非0均值输出的问题,但梯度消失和幂运算问题仍然存在。

  • Relu:
    $Relu = max(0,x)
    优点:

    1. 在正区间解决了梯度消失的问题;
    2. 计算速度快;
    3. 收敛速度快。

    缺点:

    1. 非零均值;
    2. 某些神经元永远不被激活(与learning rate和初始化有关)。
  • Leaky ReLU
    f ( x ) = m a x ( α x , x ) f(x) = max(\alpha x,x) f(x)=max(αx,x)
    把ReLU左边的0改为了非0。 α \alpha α通常取0.01。

参数初始化

  • 初始化0时,所有状态无差别,都输出0,无法训练;

  • 初始化为很小的随机数,对于层数少的模型可行,层数较高的网络会方差越来越小,输出基本不变;

  • 初始化为大一点的随机数,输出要么是1要么是0,梯度为0;

参数初始化两个必要条件:各层激活值不会出现饱和现象;各层激活值不为0。

Feature Scaling
利用每一个维度特征的mean和variance进行标准化。

Batch Normalization
为了解决Internal Covariate Shift的问题,对每一层的output(一个batch的,不能太小)进行Normalization。
较详细解释

Multiple output
利用one-vs-all策略,把output设置为一个向量,同时把样本的label值都做一个one-hot的转变。

RNN

所存在问题
梯度消失或者梯度爆炸的问题,如果采用sigmoid函数作为激活函数,sigmoid的导数值域为 ( 0 , 1 4 ) (0,\frac{1}{4}) (041),在推导过程中会发现有它连乘的情况,当层次增加的时候,就会趋近于0.

GRU

算法核心
增加了Memory Cell:
c ~ < t > = t a n h ( w c [ c t − 1 , x < t > ] + b n ) \widetilde{c}^{<t>}=tanh(w_{c}[c^{t-1},x^{<t>}]+b_{n}) c <t>=tanh(wc[ct1,x<t>]+bn)
Γ u = σ ( w u [ c < t − 1 > , x < t > ] + b u ) \Gamma _{u} = \sigma (w_{u}[c^{<t-1>},x^{<t>}]+b_{u}) Γu=σ(wu[c<t1>,x<t>]+bu)
c < t > = Γ u ∗ c ~ < t > + ( 1 − Γ u ) ∗ c ~ < t − 1 > c^{<t>} = \Gamma _{u}\ast \widetilde{c}^{<t>}+(1-\Gamma _{u})\ast \widetilde{c}^{<t-1>} c<t>=Γuc <t>+(1Γu)c <t1>

  1. 增加了记忆门,使得之前的信息也可以存储下来,为之后的预测提供信息;
  2. 在进行梯度下降时,求导会得到 1 − Γ u 1-\Gamma_{u} 1Γu这一项,所以我们可以对其进行控制,防止梯度消失的发生。

LSTM

算法核心
增加了update gate,output gate,forget gate:
c ~ < t > = t a n h ( w c [ c t − 1 , x < t > ] + b n ) \widetilde{c}^{<t>}=tanh(w_{c}[c^{t-1},x^{<t>}]+b_{n}) c <t>=tanh(wc[ct1,x<t>]+bn)
Γ u = σ ( w u [ c < t − 1 > , x < t > ] + b u ) \Gamma _{u} = \sigma (w_{u}[c^{<t-1>},x^{<t>}]+b_{u}) Γu=σ(wu[c<t1>,x<t>]+bu)
Γ f = σ ( w f [ c < t − 1 > , x < t > ] + b f ) \Gamma _{f} = \sigma (w_{f}[c^{<t-1>},x^{<t>}]+b_{f}) Γf=σ(wf[c<t1>,x<t>]+bf)
Γ o = σ ( w o [ c < t − 1 > , x < t > ] + b o ) \Gamma _{o} = \sigma (w_{o}[c^{<t-1>},x^{<t>}]+b_{o}) Γo=σ(wo[c<t1>,x<t>]+bo)
c < t > = Γ u ∗ c ~ < t > + Γ f ∗ c ~ < t − 1 > c^{<t>} = \Gamma _{u}\ast \widetilde{c}^{<t>}+\Gamma _{f}\ast \widetilde{c}^{<t-1>} c<t>=Γuc <t>+Γfc <t1>
a < t > = Γ o ∗ t a n h ( c < t > ) a^{<t>} = \Gamma _{o}\ast tanh(c^{<t>}) a<t>=Γotanh(c<t>)

LSTM vs GRU
GRU为LSTM的一个变种。
LSTM更复杂一些,但是也更powerful;
GRU更简单,但表达能力相对更弱。

BRNN

y ^ ( t ) = g ( w y [ a → < t > , a ← < l − t > ] + b y ) \hat{y}^{(t)} = g(w_{y}[\overrightarrow{a}^{<t>},\overleftarrow{a}^{<l-t>}]+b_{y}) y^(t)=g(wy[a <t>,a <lt>]+by)
其基本神经元可以是LSTM或者GRU。

集成学习

bagging:并行,基学习器无强依赖
boosting:串行,有强依赖性

Bagging:Random Forest

算法思想
bagging+决策树。对data进行抽样训练基学习器,同时随机筛选部分特征子集进行训练。

优点

  1. 消除了DT过拟合的问题;
  2. 减小了预测值的方差。

Boosting:Adaboost

算法思想
减小了上一轮分类正确的权值,提升了分类错误样本的权值。
对于最终的学习器的预测结果进行加权投票。

Boosting:BDT

算法思想
利用原始数据训练一个决策树,然后计算预测值与真实值的残差。
然后利用特征与残差组成新的数据集,并用该数据集训练新的学习器,不断迭代。

Boosting:GBDT

算法思想
梯度下降+BDT。利用最速下降的近似方法,利用loss function的负梯度拟合基学习器。
− [ ∂ L ( y i , F ( x i ) ) ∂ F ( x i ) ] F ( x ) = F t − 1 ( x ) -[\frac{\partial{L(y_{i},F(x_{i}))}}{\partial{F(x_{i})}}]_{F(x)}=F_{t-1}(x) [F(xi)L(yi,F(xi))]F(x)=Ft1(x)
取Loss function为平方差,会发现负梯度其实和残差一样,所以可以利用负梯度来替代残差。

Regression Tree

算法思想

  1. 计算每个类别的标准方差
    条件标准方差: S ( T , X ) = ∑ c ∈ x P ( c ) S ( c ) S(T,X)=\sum_{c\in x}P(c)S(c) S(T,X)=cxP(c)S(c)

  2. 计算方差减小值:
    S D R ( T , X ) = S ( T ) − S ( T , X ) SDR(T,X)=S(T)-S(T,X) SDR(T,X)=S(T)S(T,X)
    选取下降最多的作为分裂标准。

  3. 停止条件:
    - 某分支变化系数小于某个阈值:
    变化系数:Coifficient of variance = CV = S x ˉ ∗ 100 \frac{S}{\bar{x}}*100% xˉS100
    - 节点元素个数小于某个阈值

Boosting:XGboost

算法推导

  1. 每次生成新的树,优化目标为:
    O b j ( Θ ) = ∑ i = 1 N L ( y i + y F ) + ∑ j = 1 t Ω ( f i ) Obj(\Theta)=\sum_{i=1}^{N}L(y_{i}+\overset{F}{y})+\sum_{j=1}^{t}\Omega(f_{i}) Obj(Θ)=i=1NL(yi+yF)+j=1tΩ(fi)
    其中 y F \overset{F}{y} yF为新生成的树的预测值。
    O b j ( Θ ) = ∑ i = 1 N L ( y i , y ^ i ( t ) ) + ∑ j = 1 t Ω ( f i ) Obj(\Theta)=\sum_{i=1}^{N}L(y_{i},\hat{y}_{i}^{(t)})+\sum_{j=1}^{t}\Omega(f_{i}) Obj(Θ)=i=1NL(yi,y^i(t))+j=1tΩ(fi)
    O b j ( Θ ) = ∑ i = 1 N L ( y i , y ^ i ( t − 1 ) + f t ( x i ) ) + O m e g a ( f t ) + c o n s t Obj(\Theta)=\sum_{i=1}^{N}L(y_{i},\hat{y}_{i}^{(t-1)}+f_{t}(x_{i}))+Omega(f_{t})+const Obj(Θ)=i=1NL(yi,y^i(t1)+ft(xi))+Omega(ft)+const
    泰勒展开,推导后可得:
    O b j = ∑ i = 1 N ( g i f t ( x i ) + 1 2 h t f t 2 ( x i ) ) + Ω ( f t ) Obj= \sum_{i=1}^{N}(g_{i}f_{t}(x_{i})+\frac{1}{2}h_{t}f_{t}^{2}(x_{i}))+\Omega(f_{t}) Obj=i=1N(gift(xi)+21htft2(xi))+Ω(ft)
    O b j = ∑ i = 1 N ( g i w i + 1 2 h t w i 2 ( x i ) + γ T Obj= \sum_{i=1}^{N}(g_{i}w_{i}+\frac{1}{2}h_{t}w_{i}^{2}(x_{i})+\gamma T Obj=i=1N(giwi+21htwi2(xi)+γT
    求导=0:
    w j = − G j H j + λ w_{j}=-\frac{G_{j}}{H_{j}+\lambda} wj=Hj+λGj
    带回。
    然后根据Obj可以推导出新的Gain的算法,可以作为树分裂的依据。
MahNMF Manhattan Non-negative Matrix Factorization code % Manhattan Non-negative Matrix Factorization. % ManhNMF: Matlab Code for Efficient Robust Manhattan NMF Solver % Reference % [1] N. Guan, D. Tao, Z. Luo, and J. Shawe-taylor, "MahNMF: Manhattan % Non-negative Matrix Factorization," arXiv:1207.3438v1, 2012. % [2] N. Guan, D. Tao, Z. Luo, and J. Shawe-taylor, "MahNMF: Manhattan % Non-negative Matrix Factorization," Submitted to Journal of Machine Learning Research, 2013. % The model is X \approx W^TH, where X, W, and H are defined as follows: % X (m x n): data matrix including n samples in m-dimensional space; % W (r x m): basis matrix including r bases in m-dimensional space; % H (r x n): coefficients matrix includeing n encodings in r-dimensional space. % Written by Naiyang Guan (ny.guan@gmail.com) % Copyright 2012-2014 by Naiyang Guan and Dacheng Tao % Modified at Jan. 28 2013 % <Inputs> % X : Input data matrix (m x n) % r : Target low-rank % % (Below are optional arguments: can be set by providing name-value pairs) % MAX_ITER : Maximum number of iterations. Default is 1,000. % MIN_ITER : Minimum number of iterations. Default is 10. % MAX_TIME : Maximum amount of time in seconds. Default is 100,000. % W_INIT : (m x r) initial value for W. % H_INIT : (r x n) initial value for H. % LAM_INIT : initial value of smoothness parameter. Default is 1. % MDL_TYPE : Model type (Default is 'PLAIN'), % 'PLAIN' - MahNMF (min{||X-W^T*H||_1,s.t.,W >= 0 and H >= 0}.), % 'BXC' - Box Constrained MahNMF (min{||X-W^T*H||_1,s.t.,1 >= W >= 0 and 1 >= H >= 0}.), % 'MNR' - Manifold Regularized MahNMF % (min{||X-W^T*H||_1+.5*beta*TR(H*Lp*H^T),s.t.,W >= 0 and H >= 0}.), % 'GSP' - Group Sparse MahNMF % (min{||X-W^T*H||_1+.5*beta*\sum_{g\in G}||W^[g]||_{1,p},s.t.,W >= 0 and H >= 0}.), % 'SYM' - Symmetric MahNMF (min{||X-H*H^T||_1,s.t., H >= 0}.). % ALG_TYPE : Algorithm type (Default is 'AGD'), % 'AGD' - Accelerated Gradient Descent, % 'RRI' - Rank-one Residue Iteration. % BETA : Tradeoff parameter over regularization term. Default is 1e-3. % SIM_MTX : Similarity matrix constructed by 'constructW'. % GPP_MTX : Group pattern for boundary of all groups. % TOL_INNR : Stopping tolerance of inner iterations. Default is 1e-2. % TOL_OUTR : Stopping tolerance of outer iterations. Default is 1e-3. % If you want to obtain a more accurate solution, decrease TOL_INNR or TOL_OUTR and increase MAX_ITER at the same time. % VB_OUTR : 0 (default) - No debugging information is collected. % 1 (debugging purpose) - History of computation is returned by 'HIS' variable. % 2 (debugging purpose) - History of computation is additionally printed on screen. % VB_INNR : 0 (default) - No debugging information is collected. % 1 (debugging purpose) - History of computation is returned by 'HIS' variable. % 2 (debugging purpose) - History of computation is additionally printed on screen. % <Outputs> % W : Obtained basis matrix (r x m). % H : Obtained coefficients matrix (r x n). % iter : Number of iterations. % elapse : CPU time in seconds. % HIS : (debugging purpose) History of computation, % niter - total iteration number spent for Nesterov's optimal % gradient method, % cpus - CPU seconds at iteration rounds, % objf - objective function values at iteration rounds, % dlta - stopping criteria of block coordinate descent. % % <Usage Examples> % >>X=rand(1000,500); % >>ManhNMF(X,10); % >>ManhNMF(X,20,'verbose',1); % >>ManhNMF(X,30,'verbose',2,'w_init',rand(r,m)); % >>ManhNMF(X,5,'verbose',2,'tol_outr',1e-5); % Note: other files 'GetStopCriterion.m', 'ApproxFunC.m', and 'wmedianf.mexw32' should be included under the same % directory as this code.
Pattern recognition and machine learning是一门涉及到模式识别和机器学习的课程,通过这门课程的学习,我对模式识别和机器学习有了更深入的了解。 在模式识别方面,我学习了如何使用统计学和概率论的知识对数据进行分析,识别出数据中的规律和模式。通过学习不同的模式识别算法,我了解了如何利用机器来识别图像、音频、文本甚至是生物特征等不同类型的模式。在机器学习方面,我学习了如何利用机器学习算法来训练模型,使得机器可以从数据中学习规律和模式,进而做出预测和决策。 通过学习这门课程,我对机器学习和模式识别的应用有了更清晰的认识,比如在图像识别、语音识别、自然语言处理、生物特征识别等领域的应用。我也学习到了如何应用这些知识和技术来解决现实生活中的问题,比如医疗诊断、金融风控、智能驾驶等领域的应用。 另外,通过课程中的实践项目,我有机会动手实践机器学习算法的应用,从数据的处理和特征提取到模型的训练和评估,这些实践使我对课程中学到的理论知识有了更深刻的理解。 总的来说,通过学习Pattern recognition and machine learning这门课程,我不仅对机器学习和模式识别的理论和技术有了更深入的了解,也掌握了一些实践应用的技能,对未来在相关领域的发展和应用有了更清晰的思路和认识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值