机器学习算法

1. 处理分类问题常用算法

1.1 交叉熵公式

交叉熵——设q(x) p(x)是X中取值的两个概率分布,则p对q的相对熵为

1

在一定程度上,相对熵可以度量两个随机变量的“距离”,且D(p||q) 与 D(q||p)不等。

两个随机变量X Y的互信息定义——X Y的联合分布和各自独立分布乘积的相对熵,用I(X,Y)表示:

2

1.2 LR公式——逻辑回归

9. 降维算法

在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”。另外在高维特征中容易出现特征之间的线性相关,这也就意味着有的特征是冗余存在的。基于这些问题,降维思想就出现了。

9.1 SVD奇异值分解(线性降维)

步骤

  1. 将矩阵A变换成一个双对角矩阵(除了两行对角线元素非零,剩下的都是零),这个过程的计算量为 ,如果矩阵是稀疏的,可以大大缩短计算时间
  2. 将双对角矩阵变成奇异值分解的三个矩阵,这一步计算量只是第一步的零头。

SVD算法的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class SVDReduce(object):

def __init__(self, data, dimension=500):
"""
Initialize the class with the parameters.
:param data: pd.DataFrame, the output data from the class DataPreprocess.
:param dimension: int, default 500. To specify the output dimension.
"""
self.data = data
self.target_dim = dimension
self.format_data_path = '.../.../data/format_2/'
self.field = ['user', 'product', 'context', 'shop']
# self.field = ['product']

def judge(self,data):
"""
方法:判读大领域的维度
标准维度判断:不足补0,大于转为svd()
:return:
"""
logger.info("judge the dimension...")
field_matrix_shape = data.shape
dimension = field_matrix_shape[1]
if dimension > self.target_dim:
return True;
else:
return False;

def svd(self, field_matrix):
"""
方法:对大的领域数据进行降维
:param field_matrix: list(2d) or np.array, 每一行(list)表示一条record
:return: 返回领域的降维矩阵
"""
logger.info("use svd to reduce the dimension")
indices = field_matrix.index
fm = field_matrix
field_matrix = np.array(field_matrix)
field_matrix_dim = field_matrix.shape
print(field_matrix_dim)

# 对维度进行判断是否需要降维
if field_matrix_dim[1] <= self.target_dim:
logger.info('Filed_matrix_dim if smaller than the target, no need to perform reduction, thus we only add extra zero element to make up the dimension.')
dim_make_up = self.target_dim - field_matrix_dim[1]
matrix_make_up = np.zeros([field_matrix_dim[0], dim_make_up])
matrix_make_up = pd.DataFrame(matrix_make_up, index=indices)
return pd.concat([fm, matrix_make_up], axis=1)
else:
svd = TruncatedSVD(n_components=self.target_dim)
return pd.DataFrame(svd.fit_transform(field_matrix), index=indices)

def run(self):
"""
1. Extract the one-hot-form data from the self.new_data_one_hot according to the field-instruction.
2. Based on the given self.target_dimension, judge the field matrix whether satisfy the dimension requirement.
3. If so, do the svd method, else add extra zero element to achieve the self.target_dimension.
"""
output_matrix = []
for i, field_data in enumerate(self.data):
# field_data = self.split_field(field=item)
svd_matrix = self.svd(field_matrix=field_data)
svd_matrix.to_csv(self.format_data_path + 'svd_' + self.field[i] + '.csv')
output_matrix.append(svd_matrix)
return output_matrix

示例:SVD用于图像压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding: utf-8 -*-

import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt
from sklearn import datasets
from skimage import io

def getImgAsMat(index):
ds = datasets.fetch_olivetti_faces()
return np.mat(ds.images[index])

def getImgAsMatFromFile(filename):
img = io.imread(filename, as_grey=True)
return np.mat(img)

def plotImg(imgMat):
plt.imshow(imgMat, cmap=plt.cm.gray)
plt.show()

def recoverBySVD(imgMat, k):
# singular value decomposition
U, s, V = la.svd(imgMat)
# choose top k important singular values (or eigens)
Uk = U[:, 0:k]
#SK:二维数组
Sk = np.diag(s[0:k])
Vk = V[0:k, :]
# recover the image
imgMat_new = Uk * Sk * Vk
return imgMat_new


# -------------------- main --------------------- #
A = getImgAsMatFromFile('D:/Movie/svd.jpg')
plotImg(A)
A_new = recoverBySVD(A, 20)
plotImg(A_new)

关于SVD的结论

图片描述

9.2 PCA主成分分析

思路:

数据从原来坐标转换到新坐标,由数据本身决定。

本文标题:机器学习算法

文章作者:松子

发布时间:2020年01月04日 - 13:01

最后更新:2022年03月26日 - 02:03

博文链接:https://songzi.info/post/dd983d22/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%