第22章 K均值

《OpenCV 轻松入门 面向Python》 学习笔记

函数原型:
retval, bestLabels, centers=cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)
参数:
  • data 输入的待处理数据集合,应该是 np.float32 类型,每个特征放在单独的一列中。
  • K 分出的簇的个数,就是分类的个数,一般就是 K =2 表示二分类。
  • bestLabels 表示计算后各个数据点最终分类标签(索引),实际调用时,设置为None。
  • criteria 算法迭代的终止条件。当达到最大循环数目或者指定的精度阈值时,算法停止继续分类迭代计算。这个参数由三个子参数构成:type, max_iter , eps。
    • type 终止类型,有三种情况。
      – cv2.TERM_CRITERIA_EPS:精度满足 eps 时,停止迭代
      – cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过阈值 max_iter 时,停止迭代
      – cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:上述两个条件中的任意一个满足时,停止迭代。
    • max_iter 最大迭代次数
    • eps 精确的阈值
  • attempts 让算法使用不同的初始值进行 attempts 次尝试
  • flags 表示选择初始中心点的方法:
    • cv2.KMEANS_RANDOM_CENTERS:随机选取中心点。
    • cv2.KMEANS_PP_CENTERS:基于中心化算法选取中心点。
    • cv2.KMEANS_USE_INITIAL_LABELS:使用用户输入的数据作为第一次分类中心点;如果算法需要尝试多次(attempts 值大于 1 时),后续尝试都是使用随机值或者半随机值作为第一次分类中心点。
返回值
  • retval 返回的距离值(也称为密度值或紧密度),返回各个点到相应中心距离的平方和。
  • bestLabels 各个数据点额最终分类标签(索引)
  • centers,每个分类的中心点数据。

举例:

import numpy as np
import cv2
import matplotlib.pyplot as plt

xiaoMI = np.random.randint(0, 50, 60)
daMI = np.random.randint(200, 250, 60)
MI = np.hstack((xiaoMI, daMI))
MI = MI.reshape((120, 1)).astype(np.float32)

criteria = (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
flags = cv2.KMEANS_RANDOM_CENTERS
retval, best_Labels, centers = cv2.kmeans(MI, 2, None, criteria, 10, flags)

print(retval)
print(best_Labels)
print(centers)

XM = MI[best_Labels==0]
DM = MI[best_Labels==1]

plt.plot(XM, 'ro')
plt.plot(DM, 'bo')
plt.plot(centers[0], 'rx')
plt.plot(centers[1], 'bx')
plt.show()

第22章 K均值

上一篇:位运算 之(1) 按位与(AND)& 操作


下一篇:特征处理