一维数据的K均值聚类
import cv2
import numpy as np
import matplotlib.pyplot as plt
#随机生成两组数组
#生成60个值在[0,50]内的xiaoMI直径数据
xiaoMI = np.random.randint(0,50,60)
#生成60个值在[200,250]内的daMI直径数据
daMI = np.random.randint(200,250,60)
#将xiaoMI和daMI组合为MI
MI = np.hstack((xiaoMI,daMI))
#使用reshape函数将其转化为(120,1)
MI = MI.reshape((120,1))
#将MI转化为float32类型
MI = np.float32(MI)
#调用kmeans模块
#设置参数criteria的值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#设置参数flage的值
flags = cv2.KMEANS_RANDOM_CENTERS
#调用kmeans
retval,bestLabels,centers = cv2.kmeans(MI,2,None,criteria,10,flags)
'''
#打印返回值
print(retval)
print(bestLabels)
print(centers)
'''
#获取分类结果
XM = MI[bestLabels == 0]
DM = MI[bestLabels == 1]
#绘制分类结果
#绘制原始数据
plt.plot(XM,'ro')
plt.plot(DM,'bo')
#绘制中心点
plt.plot(centers[0],'rx')
plt.plot(centers[1],'bx')
plt.show()
二维数组的K均值聚类
import cv2
import numpy as np
import matplotlib.pyplot as plt
#随机生成两组数组
#生成30个长款都在[0,20]内的xiaoMI数据
xiaoMI = np.random.randint(0,20,(30,2))
#生成30个长宽都在[40,60]内的daMI数据
daMI = np.random.randint(40,60,(30,2))
#将xiaoMI和daMI组合为MI
MI = np.vstack((xiaoMI,daMI))
#将MI转化为float32类型
MI = np.float32(MI)
#调用kmeans模块
#设置参数criteria的值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
#设置参数flage的值
flags = cv2.KMEANS_RANDOM_CENTERS
#调用kmeans
ret,label,center = cv2.kmeans(MI,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
'''
#打印返回值
print(retval)
print(bestLabels)
print(centers)
'''
#获取分类结果
XM = MI[label.ravel() == 0]
DM = MI[label.ravel() == 1]
#绘制分类结果
#绘制原始数据
plt.scatter(XM[:,0],XM[:,1],c = 'g',marker = 's')
plt.scatter(DM[:,0],DM[:,1],c = 'r',marker = 'o')
plt.scatter(center[0,0],center[0,1],s = 200, c = 'b',marker = 'o')
plt.scatter(center[1,0],center[1,1],s = 200, c = 'b',marker = 's')
plt.xlabel('Height'),
plt.ylabel('Width')
plt.show()