• 如何基于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实现了。完整代码如下。

    1. import cv2
    2. import numpy as np
    3. import sklearn
    4. print(dir(cv2.ml)) # 查看opencv支持的所有算法函数,如cv2.ml.KNearest_create()
    5. print(sklearn.__all__) # 查看sklearn支持的所有算法分类等,如sklearn.linear_model.LogisticRegression()
    6. # 1.加载本地数据集
    7. print('###1.加载本地数据,访问mnist数据集','#'*50)
    8. from scipy.io import loadmat
    9. mnist = loadmat("./data/mnist-original.mat") #获取本地数据集
    10. print(mnist["data"].shape) #70000张图像,每张图像为28*28=784个像素
    11. print(mnist["label"].shape) #70000个标签,为每张图像设置一个标签
    12. print(np.unique(mnist["label"])) #标签分类总共有10,及0~9
    13. X=mnist["data"].T # 对数据进行转置,行为照片数,列为28*28=784特征数
    14. y=mnist["label"].T
    15. print('###拆分训练集和测试集','#'*50)
    16. X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] #拆分数据集为训练集和测试集
    17. # mnist分类模型训练和预测
    18. from sklearn.neighbors import KNeighborsClassifier
    19. from sklearn.linear_model import SGDClassifier
    20. from sklearn import metrics
    21. # model = SGDClassifier(random_state=42)
    22. model = KNeighborsClassifier()
    23. model.fit(X_train, y_train.ravel())
    24. y_pred=model.predict(X_test)
    25. accuracyError=metrics.mean_squared_error(y_test.ravel(), y_pred) #计算均方误差
    26. print('均方误差 =',accuracyError)
    27. # 2.加载digits数据,访问sklearn数据
    28. print('###2.加载sklearn的digits数据集','#'*50)
    29. from sklearn import datasets
    30. import matplotlib.pyplot as plt
    31. digits = datasets.load_digits()
    32. print(digits.data.shape) #1797张图像,每张图像为8*8=64个像素
    33. print(digits.images.shape)
    34. img = digits.images[0, :, :] #获取第一张图像的像素数据
    35. plt.imshow(img, cmap='gray') #显示出来
    36. plt.savefig('./notebooks/figures/02.04-digit0.png')
    37. plt.show()
    38. # 获取前10张图像并显示
    39. plt.figure(figsize=(14, 4)) #设置绘图区域大小,14行,4列
    40. for image_index in range(10):
    41. # images are 0-indexed, subplots are 1-indexed
    42. subplot_index = image_index + 1
    43. plt.subplot(2, 5, subplot_index)
    44. plt.imshow(digits.images[image_index, :, :], cmap='gray')
    45. plt.show()
    46. # 3.加载boston数据,测试回归预测
    47. print('###3.加载sklearn的boston数据集','#'*50)
    48. from sklearn import datasets
    49. from sklearn import metrics
    50. from sklearn import model_selection
    51. from sklearn import linear_model
    52. import matplotlib.pyplot as plt
    53. boston = datasets.load_boston()
    54. print(dir(boston))
    55. linreg = linear_model.LinearRegression() #线性回归
    56. # linreg= linear_model.Ridge() #ridge回归
    57. # linreg= linear_model.Lasso() #Lasso回归
    58. X_train, X_test, y_train, y_test = model_selection.train_test_split(
    59. boston.data, boston.target, test_size=0.1, random_state=42)
    60. linreg.fit(X_train, y_train)
    61. metrics.mean_squared_error(y_train, linreg.predict(X_train)) #计算均方误差
    62. linreg.score(X_train, y_train) #计算确定系数(R方值)
    63. #计算测试集的预测情况
    64. y_pred = linreg.predict(X_test)
    65. metrics.mean_squared_error(y_test, y_pred) #计算均方误差
    66. #绘图显示预测结果
    67. plt.style.use('ggplot')
    68. plt.rcParams.update({'font.size': 16})
    69. plt.figure(figsize=(10, 6))
    70. plt.plot(y_test, linewidth=3, label='ground truth')
    71. plt.plot(y_pred, linewidth=3, label='predicted')
    72. plt.legend(loc='best')
    73. plt.xlabel('test data points')
    74. plt.ylabel('target value')
    75. plt.show()
    76. # 4.加载Iris数据,测试分类问题
    77. print('###4.加载sklearn的Iris数据集','#'*50)
    78. import numpy as np
    79. import cv2
    80. from sklearn import datasets
    81. from sklearn import model_selection
    82. from sklearn import metrics
    83. import matplotlib.pyplot as plt
    84. iris = datasets.load_iris()
    85. print(dir(iris))
    86. print(np.unique(iris.target))
    87. # 过滤数据,去掉分类2,变为二分类问题
    88. idx = iris.target != 2
    89. data = iris.data[idx].astype(np.float32)
    90. target = iris.target[idx].astype(np.float32)
    91. X_train, X_test, y_train, y_test = model_selection.train_test_split(
    92. data, target, test_size=0.1, random_state=42)
    93. # # (1) 利用opencv进行分类预测
    94. # lr = cv2.ml.LogisticRegression_create()
    95. # lr.setTrainMethod(cv2.ml.LogisticRegression_MINI_BATCH)
    96. # lr.setMiniBatchSize(1)
    97. # lr.setIterations(100) #设置迭代次数
    98. # lr.train(X_train, cv2.ml.ROW_SAMPLE, y_train)
    99. # lr.get_learnt_thetas() #获的权重参数
    100. # (2) 利用sklearn进行分类预测
    101. from sklearn.linear_model import LogisticRegression
    102. from sklearn.neighbors import KNeighborsClassifier
    103. from sklearn import svm
    104. from sklearn.tree import DecisionTreeClassifier
    105. # lr = KNeighborsClassifier(n_neighbors=1)
    106. # lr = svm.SVC()
    107. # lr = LogisticRegression()
    108. lr=DecisionTreeClassifier()
    109. lr.fit(X_train, y_train)
    110. #训练集预测
    111. # ret, y_pred = lr.predict(X_train) # opencv写法
    112. y_pred = lr.predict(X_train) # sklearn写法
    113. metrics.accuracy_score(y_train, y_pred)
    114. #测试集预测
    115. # ret, y_pred = lr.predict(X_test) # opencv写法
    116. y_pred = lr.predict(X_test) # sklearn写法
    117. metrics.accuracy_score(y_test, y_pred)
    118. # 显示过滤后的数据
    119. plt.figure(figsize=(10, 6))
    120. plt.scatter(data[:, 0], data[:, 1], c=target, cmap=plt.cm.Paired, s=100)
    121. plt.xlabel(iris.feature_names[0])
    122. plt.ylabel(iris.feature_names[1])
    123. plt.show()

  • 相关阅读:
    使用容器编译Yocto镜像
    MyBatis-Plus - 自定义租户拦截器,一定要这样吗?!
    数据结构:二叉树(1)
    旅游计划定制小程序网页模板源码
    Rt-Thread 4-线程
    Typora:Typora快捷键
    【软考软件评测师】2012综合知识历年真题
    初步搭建一个自己的对象存储服务---Minio
    Oracle for Windows安装和配置——Oracle for Windows net配置
    自学Python 51 多线程开发(一)threading模块
  • 原文地址:https://blog.csdn.net/hhue2007/article/details/134425195