类别变量表示、文本特征表示、图像表示
程序员文章站
2024-02-26 19:45:04
...
一、类别变量表示
首先准备数据集
data = [
{'name':'dzzhyk111', 'born': 1912, 'died': 1954},
{'name':'dzzhyk222', 'born': 1916, 'died': 1959},
{'name':'dzzhyk333', 'born': 1922, 'died': 1964},
{'name':'dzzhyk444', 'born': 1926, 'died': 1969},
{'name':'dzzhyk555', 'born': 1930, 'died': 1970}
]
使用独热编码来表示类别图像
# 使用sklearn中的DictVectorizer(独热编码 - 二值编码)来确定编码的特征
from sklearn.feature_extraction import DictVectorizer
# sparse - 是否开启稀疏矩阵 - 压缩空间 - 在数据量较大的时候使用
vec = DictVectorizer(sparse=False, dtype=int)
print(vec.fit_transform(data))
# 调用get_feature_name()函数来找出这些特征的列表顺序
print(vec.get_feature_names())
# 注意:有些机器学习算法,比如决策树,本身就可以处理类别特征,在这种情况下并不需要使用独热编码
输出:
[[1912 1954 1 0 0 0 0]
[1916 1959 0 1 0 0 0]
[1922 1964 0 0 1 0 0]
[1926 1969 0 0 0 1 0]
[1930 1970 0 0 0 0 1]]
['born', 'died', 'name=dzzhyk111', 'name=dzzhyk222', 'name=dzzhyk333', 'name=dzzhyk444', 'name=dzzhyk555']
二、文本特征表示
sklearn已经提供了方法来编码文本特征
首先准备数据集
sample = [
'feature engineering',
'feature selection',
'feature extraction',
]
from sklearn.feature_extraction.text import CountVectorizer
vec_text = CountVectorizer()
x = vec_text.fit_transform(sample)
# 默认情况下,这个操作会把特征矩阵x保存为一个稀疏矩阵。如果需要手动检测他,需要把它转换成为一个常规数组
print(x.toarray())
# 也可以查看特征的名字
print(vec_text.get_feature_names())
输出:
[[1 0 1 0]
[0 0 1 1]
[0 1 1 0]]
['engineering', 'extraction', 'feature', 'selection']
上面的方法存在一定的局限性 - 可能会给频繁出现的单词赋予更大的权重
解决这个问题的方法是使用词频 - 逆文档频率 TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
vec_tfidf = TfidfVectorizer()
x = vec_tfidf.fit_transform(sample)
print(x.toarray())
print(vec_tfidf.get_feature_names())
输出:
[[0.861037 0. 0.50854232 0. ]
[0. 0. 0.50854232 0.861037 ]
[0. 0.861037 0.50854232 0. ]]
['engineering', 'extraction', 'feature', 'selection']
三、图像表示
(1)使用色彩空间表示图像
# 1. 以RGB色彩空间编码图像
import cv2
import matplotlib.pyplot as plt
# 使用cv2.imread载入BGR格式的样本图像
img_bgr = cv2.imread('img.jpg')
# 如果直接显示图像则存在蓝色异样,因为matplotlib希望的是RGB图像,可以使用cv2.cvtColor来重新排列彩色通道
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
# 同时显示两张图像
plt.figure(figsize=(12, 6))
plt.subplot(221)
plt.imshow(img_bgr)
plt.subplot(222)
plt.imshow(img_rgb)
# 2. 使用HSV空间和HLS空间编码图像
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
img_hls = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HLS)
plt.subplot(223)
plt.imshow(img_hsv)
plt.subplot(224)
plt.imshow(img_hls)
plt.show()
(2)图像角点检测
# 使用Harris角点检测
# 首先将图像转换成为灰度图像
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
# 接下来设置角点检测的像素领域大小(blockSize),边缘检测的孔径参数(kSize),以及Harris检测器的*参数
corners = cv2.cornerHarris(img_gray, 2, 3, 0.04)
plt.figure(figsize=(12, 6))
plt.imshow(corners, cmap='gray');
plt.show()
结果会得到一张灰度图像:
(3)使用尺度不变特征变换SIFT检索关键点
# SIFT主要分为两步:
# 第一步:识别图像中的关键点
# 第二步:计算每个关键点的真实的特征值
sift = cv2.xfeatures2d.SIFT_create()
# 关键点的检测
kp = sift.detect(img_bgr)
# 使用drawKeypoints函数可以对关键点进行可视化
import numpy as np
img_kp = np.zeros_like(img_bgr)
img_kp = cv2.drawKeypoints(img_rgb, kp, img_kp, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img_kp)
plt.show()
# 接下来特征描符号就可以使用compute函数来计算
kp, des = sift.compute(img_bgr, kp)
print(des.shape)
# 还可以简化操作,一步就检测关键点并且计算特征描述符
kp2, des2 = sift.detectAndCompute(img_bgr, None)
(4)使用加速健壮特征SURF检索关键点
# 速度更快
surf = cv2.xfeatures2d.SURF_create()
kp = surf.detect(img_bgr)
img_kp = cv2.drawKeypoints(img_rgb, kp, img_kp, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img_kp)
plt.show()
# SURF可以检测到更多的特征
kp, des = surf.compute(img_bgr, kp)
推荐阅读