如何基于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()
相关推荐
大唐荣华12 分钟前
视觉语言模型(VLA)分类方法体系
人工智能·分类·机器人·具身智能
即兴小索奇13 分钟前
AI应用商业化加速落地 2025智能体爆发与端侧创新成增长引擎
人工智能·搜索引擎·ai·商业·ai商业洞察·即兴小索奇
NeilNiu26 分钟前
开源AI工具Midscene.js
javascript·人工智能·开源
nju_spy44 分钟前
机器学习 - Kaggle项目实践(4)Toxic Comment Classification Challenge 垃圾评论分类问题
人工智能·深度学习·自然语言处理·tf-idf·南京大学·glove词嵌入·双头gru
计算机sci论文精选1 小时前
CVPR 2025 | 具身智能 | HOLODECK:一句话召唤3D世界,智能体的“元宇宙练功房”来了
人工智能·深度学习·机器学习·计算机视觉·机器人·cvpr·具身智能
ezl1fe1 小时前
RAG 每日一技(十八):手写SQL-RAG太累?LangChain的SQL智能体(Agent)前来救驾!
数据库·人工智能·后端
我星期八休息1 小时前
大模型 + 垂直场景:搜索/推荐/营销/客服领域开发新范式与技术实践
大数据·人工智能·python
飞哥数智坊1 小时前
等了这么久,企业微信的AI终于来了!
人工智能
Christo31 小时前
SIGKDD-2023《Complementary Classifier Induced Partial Label Learning》
人工智能·深度学习·机器学习
AIGC安琪2 小时前
Transformer中的编码器和解码器是什么?
人工智能·深度学习·ai·语言模型·大模型·transformer·ai大模型