机器学习笔记3

1. SVM(核函数、高斯核函数RBF),径向基函数

K(x, y):表示样本 x 和 y,添加多项式特征得到新的样本 x’、y’,K(x, y) 就是返回新的样本经过计算得到的值;在 SVM 类型的算法 SVC() 中,K(x, y) 返回点乘:x’ . y’ 得到的值;

K是有效的核函数 <==> 核函数矩阵K是对称半正定的。

Mercer定理: 如果函数K是上的映射(也就是从两个n维向量映射到实数域)。那么如果K是一个有效核函数(也称为Mercer核函数),那么当且仅当对于训练样例,其相应的核函数矩阵是对称半正定的。

所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 ,可记作 k(   x-xc   ), 其作用往往是局部的 , 即当x远离xc时函数取值很小。
最常用的径向基函数是高斯核函数 ,形式为 k(   x-xc   )=exp{-   x-xc   ^2/(2*σ)^2) } 其中x_c为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。如果x和x_c很相近那么核函数值为1,如果x和x_c相差很大那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。

那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。

既然高斯核函数能够比较x和z的相似度,并映射到0到1,回想logistic回归,sigmoid函数可以,因此还有sigmoid核函数等等。

svm 类中的 SVC() 算法中包含两种核函数:
SVC(kernel = 'ploy'):表示算法使用多项式核函数;
SVC(kernel = 'rbf'):表示算法使用高斯核函数;

2.分析工具:Scipy

Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。

Scipy是由针对特定任务的子模块组成:

模块名	应用领域
scipy.cluster	向量计算/Kmeans
scipy.constants	物理和数学常量
scipy.fftpack	傅立叶变换
scipy.integrate	积分程序
scipy.interpolate	插值
scipy.io	数据输入输出
scipy.linalg	线性代数程序
scipy.ndimage	n维图像包
scipy.odr	正交距离回归
scipy.optimize	优化
scipy.signal	信号处理
scipy.sparse	稀疏矩阵
scipy.spatial	空间数据结构和算法
scipy.special	一些特殊的数学函数
scipy.stats	统计`

距离计算:

pdist(X[, metric, p, w, V, VI])Pairwise distances between observations in n-dimensional space.观测值(n维)两两之间的距离。距离值越大,相关度越小。

注意,距离转换成相似度时,由于自己和自己的距离是不会计算的默认为0,所以要先通过dist = spatial.distance.squareform(dist)转换成dense矩阵,再通过1 - dist计算相似度。

x=array([[0, 2, 3],
       [2, 0, 6],
       [3, 6, 0]])
y=dis.pdist(x)

array([ 4.12310563,  5.83095189,  8.54400375])

z=dis.squareform(y)

array([[ 0.        ,  4.12310563,  5.83095189],
       [ 4.12310563,  0.        ,  8.54400375],
       [ 5.83095189,  8.54400375,  0.        ]])

numpy column_stack

numpy.column_stack(tup):

取一维一维数组的序列并将其堆叠为列,以构成一个二维维数组。就像hstack一样,二维数组按原样堆叠。首先将一维数组转换为二维列。

参数:	
tup:一维或二维数组的序列。
要堆叠的数组。它们都必须具有相同的第一尺寸。
返回值:	
堆叠式:二维阵列
通过堆叠给定数组形成的数组。

a = np.array([1,2,3]);b=np.array([4,5,6])
c = np.column_stack((a,b))
c 
array([[1, 4],
       [2, 5],
       [3, 6]])

c = np.row_stack((a,b))
c
array([[1, 2, 3],
       [4, 5, 6]])

hstack, 沿水平方向堆叠

a = np.array([1,2,3]);b=np.array([4,5,6])
c = np.hstack((a,b))
c
Out[11]: array([1, 2, 3, 4, 5, 6])

a = np.array([[1,2,3],[4,5,6]]);b=np.array([[41,51,61],[11,12,13]])
c = np.hstack((a,b))
c
Out[15]: 
array([[ 1,  2,  3, 41, 51, 61],
       [ 4,  5,  6, 11, 12, 13]])

vstack,沿列方向堆叠

a = np.array([1,2,3]);b=np.array([4,5,6])
c = np.vstack((a,b))
c
Out[20]: 
array([[1, 2, 3],
       [4, 5, 6]])

a = np.array([[1,2,3],[4,5,6]]);b=np.array([[41,51,61],[11,12,13]])
c = np.vstack((a,b))
c
Out[17]: 
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [41, 51, 61],
       [11, 12, 13]])

逻辑回归算法

逻辑回归算法(LogisticRegression)虽然是线性回归算法,但是其它线性回归有所不同,逻辑回归的预测结果只有两种,即true(1)和false(0)。因此,Logistic regression ( 逻辑回归 ) ,尽管它的名字是回归,是一个用于分类的线性模型而不是用于回归。所以,逻辑回归算法往往适用于数据的分类.

要想数据将数据的拟合结果映射到1和0上,就需要构造一个函数,使得该函数的结果只有0、1。事实上,逻辑回归算法的拟合函数称为sigmond函数,该函数的输出值只有0、1,而且是一个平滑的函数。我们又称该函数为逻辑函数。

y= 1/(1+e^(-z))

numpy.mean(), numpy.std()

mean() 函数定义: numpy.mean(a, axis, dtype, out,keepdims )

mean()函数功能:求取均值,经常操作的参数为axis,以m * n矩阵举例:

axis 不设置值,对 m*n 个数求均值,返回一个实数
axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
axis =1 :压缩列,对各行求均值,返回 m *1 矩阵

numpy.std()

numpy.std(a,axis = None,dtype = None,out = None,ddof = 0,keepdims = <无值> ) 计算沿指定轴的标准偏差。

返回数组元素的标准偏差,即分布分布的度量。默认情况下,将为展平数组计算标准偏差,否则将在指定轴上计算。

参数:	
    a : array_like       计算这些值的标准偏差。
    axis : 无或整数或整数元组,可选, 计算标准偏差所沿的一个或多个轴。默认值是计算展平数组的标准偏差。 如果这是一个整数元组,那么将在多个轴上执行标准偏差,而不是像以前那样在单个轴或所有轴上执行标准偏差。
    dtype : dtype,可选
    用于计算标准偏差的类型。对于整数类型的数组,默认值为float64,对于浮点类型的数组,其与数组类型相同。
    out : ndarray,可选
    放置结果的替代输出数组。它必须具有与预期输出相同的形状,但如有必要,将强制转换(计算值的)类型。
    ddof : int,可选
    表示Delta自由度。计算中使用的除数为,其中表示元素数。默认情况下,ddof为零。N - ddofN
    keepdims : bool,可选
    如果将其设置为True,则缩小的轴将保留为尺寸1的尺寸。使用此选项,结果将针对输入数组正确广播。
    如果传递了默认值,则keepdims不会传递给的std子类的方法 ndarray,但是任何非默认值都将传递。如果子类的方法未实现keepdims,则将引发任何异常。
    返回值:	
    standard_deviation : ndarray,请参见上面的dtype参数。
    如果out为None,则返回包含标准偏差的新数组,否则返回对输出数组的引用。

>>> a = np.array([[1, 2], [3, 4]])
>>> np.std(a) # 计算全局标准差
1.1180339887498949
>>> np.std(a, axis=0) # axis=0计算每一列的标准差
array([ 1., 1.])
>>> np.std(a, axis=1) # 计算每一行的标准差
array([ 0.5, 0.5])

类别不平衡:

类别不平衡:就是指分类任务中不同类别的训练样例数目差别很大的情况.如正类样例较少,反类样例较多.

解决方法:

  1. 再缩放,阔值移动” (threshold-moving):找出真实的各类的比例,调整阀值.直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将新阀值嵌入到其决策过程中.
  2. 欠采样:去除部分采样,使各类的比例相差不大.
  3. 过来样:增加样本,使各类的比例相差不大.过采样法的代表性算法SMOTE.

scipy interp 插值

interp1d表示1维插值

插值的方法 通过kind 导入;插值方式有:’linear’,’zero’, ‘slinear’, ‘quadratic’(2次), ‘cubic’(3次)

f2 = interp1d(x, y, kind=’cubic’) 返回一个插值后的函数

import scipy.interpolate
import numpy as np, matplotlib.pyplot as plt
from scipy.interpolate import interp1d
x= np.array([0, 1, 2, 3, 4, 5, 6, 7])
y= np.array([3, 4, 3.5, 2, 1, 1.5, 1.25, 0.9])
xx = np.linspace(x.min(), x.max(), 100)
fig, ax = plt.subplots(figsize=(8, 4))
ax.scatter(x, y)
for n in ['linear','zero', 'slinear', 'quadratic', 'cubic',  4, 5]:
    f = interp1d(x, y, kind = n)
    ax.plot(xx, f(xx), label= n)
ax.legend()
ax.set_ylabel(r"$y$", fontsize=18)
ax.set_xlabel(r"$x$", fontsize=18)
plt.show()

np.argmax(),返回最大值的索引

import numpy as np
a = np.array([3, 1, 2, 4, 6, 1])
print(np.argmax(a))

参数axis,默认是0,表示每一列的最大值的索引 axis=1表示每一行的最大值的索引

### np.bincount(),统计每个值出现的次数,索引相同的权重会求和

x = np.array([0, 1, 1, 3, 2, 1, 7])
# 索引0出现了1次,索引1出现了3次......索引5出现了0次......
np.bincount(x)
#因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])

# 我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([7, 6, 2, 1, 4])
# 索引0出现了0次,索引1出现了1次......索引5出现了0次......
np.bincount(x)
#输出结果为:array([0, 1, 1, 0, 1, 0, 1, 1])


w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6])
# 我们可以看到x中最大的数为4,因此bin的数量为5,那么它的索引值为0->4
x = np.array([2, 1, 3, 4, 4, 3])
# 索引0 -> 0
# 索引1 -> w[1] = 0.5
# 索引2 -> w[0] = 0.3
# 索引3 -> w[2] + w[5] = 0.2 - 0.6 = -0.4
# 索引4 -> w[3] + w[4] = 0.7 + 1 = 1.7
np.bincount(x,  weights=w)
# 因此,输出结果为:array([ 0. ,  0.5,  0.3, -0.4,  1.7])

关于在PyCharm中import numpy 出现from . import _mklinit ImportError: DLL load failed: 找不到指定模块

https://www.cnblogs.com/ssjxx98/p/11222835.html

np.astype(int), np.clip()

类型转换

	该命令查看数据类型
	In [13]: arr.dtype
	Out[13]: dtype('int64')


numpy.clip(a, a_min, a_max, out=None)[source]

clip这个函数将将数组中的元素限制在a_min, a_max之间,
大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min

import numpy as np
x=np.array([1,2,3,5,6,7,8,9])
np.clip(x,3,8)
Out[88]:
array([3, 3, 3, 5, 6, 7, 8, 8])

参考:

  1. my coding.net
  2. 机器学习:SVM(核函数、高斯核函数RBF)
  3. Python机器学习及分析工具:Scipy篇
  4. Scipy教程 - 距离计算库scipy.spatial.distance
  5. Scipy数据操作归纳总结
  6. https://blog.csdn.net/lilong117194/article/details/78397329
  7. https://www.cnblogs.com/ggzhangxiaochao/p/9083343.html
  8. https://blog.csdn.net/xlinsist/article/details/51346523