如何基于OpenCV和Sklearn算法库开展机器学习算法研究

大家在做机器学习或深度学习研究过程中,不可避免都会涉及到对各种算法的研究使用,目前比较有名的机器学习算法库主要有OpenCV和Scikit-learn(简称Sklearn),二者都支持各种机器学习算法,主要有监督学习、无监督学习、数据降维等,OpenCV的所有机器学习相关函数都在OpenCV ML里面描述,OpenCV对图像处理方面有比较大的优势,后续在单独说明,Sklearn是目前机器学习领域最完整、同时也是最具影响力的算法库,基于Numpy, Scipy和matplotlib,包含了大量的机器学习算法实现,相关机器学习算法可通过sklearn.__all__进行查看,同时,Sklearn包含了非常多的已建设规范好的数据集,如波士顿数据集、mnist数据集等。

一般所说的机器学习或深度学习解决的问题主要有分类、回归、聚类和降维等。

一、十大经典机器学习算法
  1. 线性回归 (Linear Regression)
  2. 逻辑回归 (Logistic Regression)
  3. 决策树 (Decision Tree)
  4. 支持向量机(SVM)
  5. 朴素贝叶斯 (Naive Bayes)
  6. K邻近算法(KNN)
  7. K-均值算法(K-means)
  8. 随机森林 (Random Forest),集成算法
  9. 降低维度算法(Dimensionality Reduction Algorithms),主成分分析(即PCA)降维算法
  10. Gradient Boost和Adaboost集成算法
二、常见机器学习算法示例

以下是利用OpenCV或Sklearn实现的各种数据加载和分类回归问题示例,OpenCV对回归问题支持的不是太好,回归问题主要采用Sklearn实现了。完整代码如下。

python 复制代码
import cv2  
import numpy as np  
import sklearn  
print(dir(cv2.ml))      # 查看opencv支持的所有算法函数,如cv2.ml.KNearest_create()  
print(sklearn.__all__)  # 查看sklearn支持的所有算法分类等,如sklearn.linear_model.LogisticRegression()
# 1.加载本地数据集  
print('###1.加载本地数据,访问mnist数据集','#'*50)  
from scipy.io import loadmat  
mnist = loadmat("./data/mnist-original.mat") #获取本地数据集  
print(mnist["data"].shape) #70000张图像,每张图像为28*28=784个像素  
print(mnist["label"].shape)   #70000个标签,为每张图像设置一个标签  
print(np.unique(mnist["label"])) #标签分类总共有10,及0~9  
X=mnist["data"].T # 对数据进行转置,行为照片数,列为28*28=784特征数  
y=mnist["label"].T  
print('###拆分训练集和测试集','#'*50)  
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] #拆分数据集为训练集和测试集
# mnist分类模型训练和预测  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.linear_model import SGDClassifier  
from sklearn import metrics  
# model = SGDClassifier(random_state=42)  
model = KNeighborsClassifier()  
model.fit(X_train, y_train.ravel())  
y_pred=model.predict(X_test)  
accuracyError=metrics.mean_squared_error(y_test.ravel(), y_pred) #计算均方误差  
print('均方误差 =',accuracyError)

# 2.加载digits数据,访问sklearn数据  
print('###2.加载sklearn的digits数据集','#'*50)  
from sklearn import datasets  
import matplotlib.pyplot as plt  
digits = datasets.load_digits()  
print(digits.data.shape) #1797张图像,每张图像为8*8=64个像素  
print(digits.images.shape)  
img = digits.images[0, :, :] #获取第一张图像的像素数据  
plt.imshow(img, cmap='gray') #显示出来  
plt.savefig('./notebooks/figures/02.04-digit0.png')  
plt.show()    
# 获取前10张图像并显示  
plt.figure(figsize=(14, 4)) #设置绘图区域大小,14行,4列  
for image_index in range(10):  
    # images are 0-indexed, subplots are 1-indexed  
    subplot_index = image_index + 1  
    plt.subplot(2, 5, subplot_index)  
    plt.imshow(digits.images[image_index, :, :], cmap='gray')  
plt.show()  
  
# 3.加载boston数据,测试回归预测  
print('###3.加载sklearn的boston数据集','#'*50)  
from sklearn import datasets  
from sklearn import metrics  
from sklearn import model_selection  
from sklearn import linear_model  
import matplotlib.pyplot as plt  
boston = datasets.load_boston()  
print(dir(boston))  
linreg = linear_model.LinearRegression()   #线性回归  
# linreg= linear_model.Ridge()         #ridge回归  
# linreg= linear_model.Lasso()         #Lasso回归  
X_train, X_test, y_train, y_test = model_selection.train_test_split(  
boston.data, boston.target, test_size=0.1, random_state=42)  
linreg.fit(X_train, y_train)  
metrics.mean_squared_error(y_train, linreg.predict(X_train)) #计算均方误差  
linreg.score(X_train, y_train) #计算确定系数(R方值)  
#计算测试集的预测情况  
y_pred = linreg.predict(X_test)  
metrics.mean_squared_error(y_test, y_pred) #计算均方误差  
#绘图显示预测结果  
plt.style.use('ggplot')  
plt.rcParams.update({'font.size': 16})  
plt.figure(figsize=(10, 6))  
plt.plot(y_test, linewidth=3, label='ground truth')  
plt.plot(y_pred, linewidth=3, label='predicted')  
plt.legend(loc='best')  
plt.xlabel('test data points')  
plt.ylabel('target value')  
plt.show()  
  
# 4.加载Iris数据,测试分类问题  
print('###4.加载sklearn的Iris数据集','#'*50)  
import numpy as np  
import cv2  
from sklearn import datasets  
from sklearn import model_selection  
from sklearn import metrics  
import matplotlib.pyplot as plt  
iris = datasets.load_iris()  
print(dir(iris))  
print(np.unique(iris.target))  
# 过滤数据,去掉分类2,变为二分类问题  
idx = iris.target != 2  
data = iris.data[idx].astype(np.float32)  
target = iris.target[idx].astype(np.float32)  
X_train, X_test, y_train, y_test = model_selection.train_test_split(  
data, target, test_size=0.1, random_state=42)  
# # (1) 利用opencv进行分类预测  
# lr = cv2.ml.LogisticRegression_create()  
# lr.setTrainMethod(cv2.ml.LogisticRegression_MINI_BATCH)  
# lr.setMiniBatchSize(1)  
# lr.setIterations(100) #设置迭代次数  
# lr.train(X_train, cv2.ml.ROW_SAMPLE, y_train)  
# lr.get_learnt_thetas() #获的权重参数  
# (2) 利用sklearn进行分类预测  
from sklearn.linear_model import LogisticRegression  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn import svm  
from sklearn.tree import DecisionTreeClassifier  
# lr = KNeighborsClassifier(n_neighbors=1)  
# lr = svm.SVC()  
# lr = LogisticRegression()  
lr=DecisionTreeClassifier()  
lr.fit(X_train, y_train)  
#训练集预测  
# ret, y_pred = lr.predict(X_train) # opencv写法  
y_pred = lr.predict(X_train)        # sklearn写法  
metrics.accuracy_score(y_train, y_pred)  
#测试集预测  
# ret, y_pred = lr.predict(X_test)  # opencv写法  
y_pred = lr.predict(X_test)         # sklearn写法  
metrics.accuracy_score(y_test, y_pred)  
# 显示过滤后的数据  
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()
相关推荐
小豆庄2 小时前
监控视频脱敏:夜视/低光线条件下人脸检测的工程处理思路
opencv·计算机视觉·阿里云·视觉检测·音视频·视频
深蓝AI5 小时前
不调模型不改壳:CMU 开源 Hermit,给 Agent 外挂一个能训练的适配器
人工智能·agent
汤姆宝库7 小时前
世界模型深拆:视频生成、潜在模拟与物理直觉
人工智能
weixin_4684668510 小时前
从“看懂”到“做到”:视觉-语言-动作模型如何让机器人真正执行指令
人工智能·ai·机器人·大语言模型·前沿科技
朋友圈自动点赞工具10 小时前
科学AI插件化:从蛋白质结构到古籍修复
人工智能
龙粤GEO11 小时前
实体Entity在GEO中代表什么含义
人工智能
剑雨巍巍12 小时前
AI Agent面试之基础概念
人工智能
微帧Visionular12 小时前
AI视频单帧清晰,播放时却闪烁,原因是什么?
人工智能·深度学习·音视频
武子康12 小时前
MultiNet6 空闲崩溃:`EXCVADDR=0x8` 后又出现 `CORRUPT HEAP`
人工智能·后端·agent
云智慧AIOps社区12 小时前
智能巡检机器人应用场景解析:机房巡检、园区安防、管廊巡视与展厅导览
人工智能·机器人·具身智能·智能巡检机器人·企业级智能巡检机器人·机房巡检机器人·导览机器人