机器学习笔记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])
类别不平衡:
类别不平衡:就是指分类任务中不同类别的训练样例数目差别很大的情况.如正类样例较少,反类样例较多.
解决方法:
- 再缩放,阔值移动” (threshold-moving):找出真实的各类的比例,调整阀值.直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将新阀值嵌入到其决策过程中.
- 欠采样:去除部分采样,使各类的比例相差不大.
- 过来样:增加样本,使各类的比例相差不大.过采样法的代表性算法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])
参考: