k-平均聚类算法(k -means Clustering)第三步:调整初期类别。
使用k-平均聚类算法将8张train@@@.jpg
完美地聚类吧!
在这里,通过变更np.random.seed()
的值和np.random.random() < th
中分割类别的阈值th
来更好地预测图片的类别吧!由于train@@@.jpg
的图像数量是问题89的两倍,因此可以更容易地聚类。
这只能通过反复试验来完成。
python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from glob import glob
# Dicrease color
def dic_color(img):
img //= 63
img = img * 64 + 32
return img
# Database
def get_DB():
# get training image path
train = glob("dataset/train_*")
train.sort()
# prepare database
db = np.zeros((len(train), 13), dtype=np.int32)
pdb = []
# each train
for i, path in enumerate(train):
# read image
img = dic_color(cv2.imread(path))
# histogram
for j in range(4):
db[i, j] = len(np.where(img[..., 0] == (64 * j + 32))[0])
db[i, j+4] = len(np.where(img[..., 1] == (64 * j + 32))[0])
db[i, j+8] = len(np.where(img[..., 2] == (64 * j + 32))[0])
# get class
if 'akahara' in path:
cls = 0
elif 'madara' in path:
cls = 1
# store class label
db[i, -1] = cls
# add image path
pdb.append(path)
return db, pdb
# k-Means
def k_means(db, pdb, Class=2, th=0.5):
# copy database
feats = db.copy()
# initiate random seed
np.random.seed(4)
# assign random class
for i in range(len(feats)):
if np.random.random() < th:
feats[i, -1] = 0
else:
feats[i, -1] = 1
while True:
# prepare greavity
gs = np.zeros((Class, 12), dtype=np.float32)
change_count = 0
# compute gravity
for i in range(Class):
gs[i] = np.mean(feats[np.where(feats[..., -1] == i)[0], :12], axis=0)
# re-labeling
for i in range(len(feats)):
# get distance each nearest graviry
dis = np.sqrt(np.sum(np.square(np.abs(gs - feats[i, :12])), axis=1))
# get new label
pred = np.argmin(dis, axis=0)
# if label is difference from old label
if int(feats[i, -1]) != pred:
change_count += 1
feats[i, -1] = pred
if change_count < 1:
break
for i in range(db.shape[0]):
print(pdb[i], " Pred:", feats[i, -1])
db, pdb = get_DB()
k_means(db, pdb, th=0.3)
答案:
train_akahara_1.jpg Pred: 1
train_akahara_2.jpg Pred: 1
train_akahara_3.jpg Pred: 1
train_akahara_4.jpg Pred: 1
train_akahara_5.jpg Pred: 1
train_madara_1.jpg Pred: 0
train_madara_2.jpg Pred: 0
train_madara_3.jpg Pred: 0
train_madara_4.jpg Pred: 0
train_madara_5.jpg Pred: 0