本次目标
2018-07-23 19_54_56-【邹博_chinahadoop】机器学习升级版VII(七).pngK-Means (K均值)
2018-07-23 19_58_14-【邹博_chinahadoop】机器学习升级版VII(七).pngVector Quantization(矢量量化)
2018-07-23 19_58_33-【邹博_chinahadoop】机器学习升级版VII(七).png传统模型
2018-07-23 19_59_50-【邹博_chinahadoop】机器学习升级版VII(七).png传统图像分类
2018-07-24 10_01_16-【邹博_chinahadoop】机器学习升级版VII(七).png 2018-08-05 18_51_36-【邹博_chinahadoop】机器学习升级版VII(七).png如图,下面三个样本的维度不同:
第一个是20x144维
第二个是10x144维
第三个是15x144维
因为维度不同,所以无法喂给Logistic回归(LR)。
但是换一个思路,因为都是x144,所以可以将20,10,15看成各自独立的样本。每一张图片,看成是一个词袋,第一个袋子放了20个样本,第二个袋子放了10个样本,第三个袋子放了15个样本。
然后对于这45个样本,做一个聚类。
如中间部分,做了5种聚类,即5个簇。(K=5)
然后观察三张图片各自样本,落在这5个簇的聚类情况。
即特征变成了5维的向量。
即各个图片,在分类器看来,就是长度为5的列向量。
然后将列向量横过来,就形成3行(3张图片)五列的数据,如此即可将其喂给SVM或者随机森林都是可以的。
当然也可以映射为1000个数的向量,即变成3x1000。
无论是映射成5个还是1000个,其实都比原始维度要低的多。即通过聚类,达到降维的目的。
而中间这一步(即聚类),是一个无监督的学习。可以看做对144维向量,映射到某一个数字上去。对Vector做了量化,即矢量量化,即VQ。
然后回过头来看Vector Quantization这张ppt,
任何一张图片可以看成RGB三通道的彩色图像,任何一个像素点是三维的一个数字,换句话说,任何一个像素点其实是一个向量。
假定是800x600的图片,有48万个向量,将这项矢量做聚类,用簇的中心代替原始的像素。即可以用调色板,将图像压缩了。
2018-08-05 19_17_14-【邹博_chinahadoop】机器学习升级版VII(七).png
课堂问答
问:图像有噪声会有影响么?
答: 应该有影响,但这个影响,有些时候可以自适应。比如图像偏红,其中有一片是绿色的,作为噪声。如果将噪声作为一个簇,则问题不大。但是椒盐噪声,而且颜色随机,会影响很大。不过椒盐噪声,如果颜色一致,则会聚类,影响就不会很大。
问:聚类跟PCA类似么?
答:不类似。
问:聚类主要用在哪?
答:一般不会把聚类作为主算法。比如用卷积网络,识别物体,有可能把聚类当成中间环节,对数据做变换。此时聚类会产生价值。比如预处理,中间预处理,或者后处理的一个步骤。完善整个环节中的其中一环。聚类可以帮助选择特征。
问:聚类可以达到降维的目的?
答:是的
问:如果是RGB,是RGB一起聚类,还是RGB各自聚类?
答:是一起聚类。
问:如果是多张图片,是一起聚类,还是各自聚类?
答:多张图片,也是一起聚类,一起做特征。
问:选特征与VQ是什么关系呢?
答:我们是利用VQ来最终选特征,选出来这1000个数(特征)。
问:在应用中,具体如何选择使用Kmeans最大密度聚类,谱聚类,DBScan哪个算法?需要逐个尝试么?
答:如果数据量特别大,只能选Kmeans;
如果数据量不是特别大,可以选密度最大聚类,或DBSCAN。
如果数据量中等或偏小,可使用谱聚类试一试。因为谱聚类不会过分探讨特征距离是怎么来的。
问:图像压缩是不是把图像所有的颜色压缩到100种颜色中去?
答:是的
问:可否理解为处理后的结果就是把占据图像主要色彩的部分给留下来?
答:不是。我们是把所有的像素给替换了。
问:聚类之后的操作是干什么?
答:之后的操作,可能是做SVM, Logisitc回归,或者将特征喂给卷积网络。具体问题具体处理。
问:能用聚类做二值化么?
答:当然能。比如可以选择黑白图像做二值化。
问:把图像变成字符的图像,是不是也可以用VQ?
2018-08-05 19_43_18-【邹博_chinahadoop】机器学习升级版VII(七).png
答:先用VQ,倒是有可能。
问:聚类可以用于一致性问题么?就是把所有点演化成最终汇聚到一个点上?
答:这个取决于应用场景。
AP聚类
2018-08-05 19_12_38-【邹博_chinahadoop】机器学习升级版VII(七).png时间复杂度太高,计算速度慢一些,只能适用于中小型数据。
调参还好。
MeanShift
把均值做移动,然后生成下面的结果
2018-08-05 19_46_40-【邹博_chinahadoop】机器学习升级版VII(七)png.png
密度聚类
参数有ε, m以及聚类数目。
2018-08-05 19_47_44-【邹博_chinahadoop】机器学习升级版VII(七).png
谱聚类
参数为给出相似度的值,实际上就是标准差。
2018-08-05 19_49_15-【邹博_chinahadoop】机器学习升级版VII(七).png用处,在于做分隔:
2018-08-05 19_50_23-【邹博_chinahadoop】机器学习升级版VII(七).png
代码解析
视频对应的代码:链接:https://pan.baidu.com/s/1LOeY5sWr7dyX-LBhSFI9WQ 密码:cipq
参见:第十八课_代码.zip
Kmeans
# !/usr/bin/python
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.colors
import matplotlib.pyplot as plt
import sklearn.datasets as ds
from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score, adjusted_mutual_info_score,\
adjusted_rand_score, silhouette_score
from sklearn.cluster import KMeans
def expand(a, b):
d = (b - a) * 0.1
return a-d, b+d
if __name__ == "__main__":
N = 400
centers = 4
data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)
data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1,2.5,0.5,2), random_state=2)
data3 = np.vstack((data[y == 0][:], data[y == 1][:50], data[y == 2][:20], data[y == 3][:5]))
y3 = np.array([0] * 100 + [1] * 50 + [2] * 20 + [3] * 5)
m = np.array(((1, 1), (1, 3)))
data_r = data.dot(m)
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
cm = matplotlib.colors.ListedColormap(list('rgbm'))
data_list = data, data, data_r, data_r, data2, data2, data3, data3
y_list = y, y, y, y, y2, y2, y3, y3
titles = '原始数据', 'KMeans++聚类', '旋转后数据', '旋转后KMeans++聚类',\
'方差不相等数据', '方差不相等KMeans++聚类', '数量不相等数据', '数量不相等KMeans++聚类'
model = KMeans(n_clusters=4, init='k-means++', n_init=5)
plt.figure(figsize=(8, 9), facecolor='w')
for i, (x, y, title) in enumerate(zip(data_list, y_list, titles), start=1):
plt.subplot(4, 2, i)
plt.title(title)
if i % 2 == 1:
y_pred = y
else:
y_pred = model.fit_predict(x)
print(i)
print('Homogeneity:', homogeneity_score(y, y_pred))
print('completeness:', completeness_score(y, y_pred))
print('V measure:', v_measure_score(y, y_pred))
print('AMI:', adjusted_mutual_info_score(y, y_pred))
print('ARI:', adjusted_rand_score(y, y_pred))
print('Silhouette:', silhouette_score(x, y_pred), '\n')
plt.scatter(x[:, 0], x[:, 1], c=y_pred, s=30, cmap=cm, edgecolors='none')
x1_min, x2_min = np.min(x, axis=0)
x1_max, x2_max = np.max(x, axis=0)
x1_min, x1_max = expand(x1_min, x1_max)
x2_min, x2_max = expand(x2_min, x2_max)
plt.xlim((x1_min, x1_max))
plt.ylim((x2_min, x2_max))
plt.grid(b=True, ls=':')
plt.tight_layout(2, rect=(0, 0, 1, 0.97))
plt.suptitle('数据分布对KMeans聚类的影响', fontsize=18)
plt.show()
结果如下:
2018-08-05 19_54_52-Figure 1.png
网友评论