数据挖掘之聚类分析

聚类分析是什么

相对于分类,聚类是一种不清楚类别的种类,或类别不清楚的情况下,通过计算数据之间的相似度(其中用得最多的是距离)来进行小组划分的一种数据挖掘方法。其特点是组中数据的相似度很高,而不同组别之间的相似度却很低。

聚类分析有哪些

根据不同的划分方式,聚类可分为K-Means聚类、K-中心点聚类、系统聚类等。其中最常用以及应用范围最广的是K-Means聚类,下面着重介绍K-Means聚类。

K-Means聚类

K-Means聚类是很典型的基于距离的聚类算法,以组内元素的均值作为每个组的中心,采用距离作为相似性的指标,即认为两个对象距离近,则相似,否则,不相似。该算法认为组内元素是由距离相近的元素组成的,因此,组间元素的距离相近,不同组的距离则较远。

算法步骤:

  • 随机选取K个对象作为聚类中心
  • while 聚类中心发生变化
    • 计算数据集中各个对象到K个聚类中心的距离,并将距离相近的对象归为同一个聚类
    • 重新计算聚类中心(即重新计算组内均值

算法实践:
我们以常用的分类数据集Iris作为我们的原始数据

iris = datasets.load_iris()
x,y = iris.data,iris.target
data = x[:, [1, 3]] #只取两个维度便于可视化
f = plt.scatter(data[:, 0], data[:, 1])
Iris

欧几里得距离:
我们采用欧几里得距离来计算点与点之间的距离

def distance(p1, p2):
    """
    返回两个点之间的欧几里得距离
    """
    tmp = np.sum((p1-p2)**2)
    return np.sqrt(tmp)

聚类中心的初始化:

def _rand_center(data, k):
    """
    随机挑选K个初始点
    """
    n = data.shape[1] #数据集包含的特征数
    centroids = np.zeros((k, n)) #初始化一个K行n列的0矩阵
    for i in range(n):
        dmin, dmax = np.min(data[:, i]), np.max(data[:, i])
        centroids[:, i] = dmin + (dmax - dmin) * np.random.rand(k)
 # 这里产生的是介于极小值和极大值之间的数,产生的数有可能不是数据集的数据
    return centroids

K均值聚类:
该算法中,当聚类中心不再改变的时候,迭代停止,返回聚类中心,各点归属于哪一聚类和他们之间距离的和。
注意到K-Means有可能陷于局部最小值,我们采用多次计算取最小值来解决此问题,当然也可以用二分K均值来解决此问题。

n = data.shape[0] #数据集的行数
centroids = _rand_center(data, k)
label = np.zeros(n, dtype=np.int) #用于标记最近的聚类中心
assessment = np.zeros(n) #用于对模型的评估
converged = False
while not converged:
    old_centroids = np.copy(centroids)
    for i in range(n): #决定最相近的聚类中心并记录在label中
        min_dist, min_index = np.inf, -1
        for j in range(k):
            dist = distance(data[i], centroids[j])
            if dist < min_dist:
                min_dist, min_index = dist, j
                label[i] = j
                assessment[i] = distance(data[i], centroids[j])
    for m in range(k): #更新聚类中心
        centroids[m] = np.mean(data[label == m], axis=0)
    converged = _converged(old_centroids, centroids)
return centroids, label, np.sum(assessment)

最后经过多次计算之后显示的结果如下图:

K-Means

从图可以看出,聚类的效果还不错。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容