欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类别变量表示、文本特征表示、图像表示

程序员文章站 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)