Mechine learning for OpenCV 学习笔记 day3

来源:互联网 发布:编译java的软件 编辑:程序博客网 时间:2024/06/05 04:06

用逻辑斯特回归(Logistic Regression)分类

主要内容有:

  • 用逻辑斯特回归Logistic Regression分类
    • Logisitic Regression in OpenCV
  • 第四部分数据表示和特征工程
    • 特征工程Feature engineering
    • 预处理数据
      • 1特征标准化
      • 2特征正规化
      • 3将特征数据缩放到一个范围
      • 4二值化特征
      • 5解决数据丢失问题
    • 数据降维
      • 1 PCA


Logisitic Regression in OpenCV

  • 使用sklearn下载数据库:
import numpy as npimport cv2from sklearn import datasetsfrom sklearn import model_selectionfrom sklearn import metricsimport matplotlib.pyplot as pltplt.style.use('ggplot')iris = datasets.load_iris()

这一步会返回一个字典,其中包含了150个数据点,每个数据点包含4种特征,以及各自对应的标签[3类,标签为0,1,2]。为了方便起见,我们想使用2分类去着手。

idx = iris.target != 2data = iris.data[idx].astype(np.float32)target = iris.target[idx].astype(np.float32)
  • 在训练模型之前,我们可以先对图像点进行可视化
plt.figure(figsize=(10,6))plt.scatter(data[:,0],data[:,1],c=target,cmap=plt.cm.Paired,s=100)plt.xlabel(iris.feature_names[0])plt.ylabel(iris.feature_names[1])plt.show()

输出结果为:
这里写图片描述

  • 将数据分成训练集和测试集
X_train, X_test , y_train , y_test = model_selection.train_test_split(data,target,test_size=0.1,random_state=42)

训练集:测试集=9:1,所以将test_size设置为 0.1

  • 训练模型
    就像K-NN方法一样去训练模型
lr=cv2.ml.LogisticRegression_create()#选择训练方法,mini-batch or batchlr.setTrainMethod(cv2.ml.LOGISTIC_REGRESSION_MINI_BATCH) #设置mini-batch 每次的数量lr.setMiniBatchSize(3)  #设置迭代次数lr.setIterations(100)    #进行训练lr.train(X_train, cv2.ml.ROW_SAMPLE, y_train)lr.get_learnt_thetas()#分别输出在训练集和测试集上的准确率ret, y_pred = lr.predict(X_train) print(metrics.accuracy_score(y_train,y_pred))_ , y_pred = lr.predict(X_test)print(metrics.accuracy_score(y_test,y_pred))

最终输出结果为:
这里写图片描述

我们可以通过修改mini-batch的值还有迭代次数来观察,其中当mini-batch = 1 时,正确率可为100%.

第四部分:数据表示和特征工程

提纲:
1、预处理数据
2、数据降维
3、表示类型变量
4、表示文本特征
5、表示图片

特征工程(Feature engineering)

  • 特征选择:这是找到数据重要属性(特征)的一步,opencv提供了例如SIFT,SURF等方法
  • 特征抽取:将原始数据转变成我们训练模型想要的特征

1.预处理数据

主要内容有:
- 转换数据格式
- 数据清理
- 数据采样

1.1特征标准化

标准化是指将原始数据转换成均值为0,方差为1的数据集合,方便后续的机器学习算法的使用。scikit-learn就提供了相关的模块。

from sklearn import preprocessingimport numpy as npX = np.array([[ 1., -2.,  2.],              [ 3.,  0.,  0.],              [ 0.,  1., -1.]])X_scaled = preprocessing.scale(X)print(X_scaled)

输出结果为:
这里写图片描述

1.2特征正规化

# L1正规化X_normalized_11 = preprocessing.normalize(X, norm='l1')print(X_normalized_11)

输出结果为:
这里写图片描述

# L2正规化X_normalized_12 = preprocessing.normalize(X, norm='l2')print(X_normalized_12)

输出结果为:
这里写图片描述

1.3将特征数据缩放到一个范围

主要是使用MinMaxScaler来实现

min_max_sclaer = preprocessing.MinMaxScaler()X_min_max = min_max_sclaer.fit_transform(X)print(X_min_max)

输出结果为:
这里写图片描述

这里默认的范围是0-1,我们可以通过在MinMaxScaler()中加入feature_range

min_max_sclaer = preprocessing.MinMaxScaler(feature_range=(-10,10))X_min_max = min_max_sclaer.fit_transform(X)print(X_min_max)

输出结果为:
这里写图片描述

1.4二值化特征

使用preprocessing模块中的Binarizer()函数,来设定一个阈值,若大于则为1,小于则为0。

binarizer = preprocessing.Binarizer(threshold = 0.5)X_binarized = binarizer.transform(X)print(X_binarized)

输出结果为:
这里写图片描述

1.5解决数据丢失问题

在特征工程中,我们有时需要解决如下问题:

from numpy import nanX = np.array([[ nan, 0,   3  ],              [ 2,   9,  -8  ],              [ 1,   nan, 1  ],              [ 5,   2,   4  ],              [ 7,   6,  -3  ]])
这里的nan表示not a number, 在scikit-learn工具包中我们有3中方法来解决这个问题。
均值法(mean):用特定行(列)的均值来取代所有的nan
中间值法(median):用一行(列)的中间值来取代所有的nan
最大频率数(most_frequent):用一行(列)中的出现频率最多的值取代所有的nan
以均值法为例:
from sklearn.preprocessing import Imputerimp = Imputer(strategy='mean')X2 = imp.fit_transform(X)X2

输出结果为:
这里写图片描述

2.数据降维

2.1 PCA

import numpy as npimport matplotlib.pyplot as pltplt.style.use('ggplot')mean = [20,20]cov = [[5,0],[25,25]]np.random.seed(42)x,y = np.random.multivariate_normal(mean , cov , 1000).Tplt.figure(figsize=(10, 6))plt.plot(x, y, 'o', zorder=1)plt.axis([0, 40, 0, 40])plt.xlabel('feature 1')plt.ylabel('feature 2');

输出结果为:
这里写图片描述

这里我们需要叠加x和y坐标:

X=np.vstack((x,y)).T

然后在特征矩阵X上使用主成分分析(PCA):

import cv2mu,eig = cv2.PCACompute(X,np.array([]))print(eig)# 输出特征向量plt.figure(figsize=(10,6))plt.plot(x,y,'o',zorder=1)plt.quiver(mean[0],mean[1],eig[:,0],eig[:,1],zorder=3,scale=0.2,units = 'xy')plt.text(mean[0]+5*eig[0,0],mean[1]+5*eig[0,1],'u1',zorder=5, fontsize = 16 ,bbox = dict(facecolor='white',alpha=0.6))plt.text(mean[0]+7*eig[1,0],mean[1]+4*eig[1,1],'u2',zorder=5, fontsize = 16 ,bbox = dict(facecolor='white',alpha=0.6))plt.axis([0,40,0,40])plt.xlabel('feature 1')plt.ylabel('feature 2')plt.show()

输出结果为:
这里写图片描述
这里写图片描述

我们可以理解为PCA用了2个数据的主成分旋转了x和y轴,以致于便于分类和分析。

X2=cv2.PCAProject(X,mu,eig)plt.figure(figsize=(10,6))plt.plot(X2[:,0],X2[:,1],'o')plt.xlabel('first principal component')plt.ylabel('second principal component')plt.axis([-20,20,-10,10])plt.show()

旋转后的输出结果为:
这里写图片描述

原创粉丝点击