首页 > 其他分享 >机器学习-无监督机器学习-kmeans-17

机器学习-无监督机器学习-kmeans-17

时间:2023-12-23 11:23:01浏览次数:28  
标签:机器 17 kmeans 距离 dataSet centroids 中心点 聚类 np

目录

1. 什么是聚类

无监督机器学习的一种 输入数据只有X 没有y
将已有的数据 根据相似度 将划分到不同的簇 (花团锦簇)

步骤:

  1. 随机选择k个簇的中心点
  2. 样本根据距离中心点的距离分配到不同的簇
  3. 重新计算簇的中心点
  4. 重复 2-3直到所有样本 分配的簇不再发生改变

距离的计算:

  1. Euclidean Distance 欧式距离

  2. 余弦距离
    两个向量的夹角余弦值 -1 +1:

    1-cos(theta) 称为余弦距离

欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异

cosine相似度更适用于文本
举例:

后面两篇文章来自同一篇,余弦距离测度更准确,因为来自相同的分布,

归一化之后两种测量方式存在单调关系 选择谁都一样:

kmeans算法的目标函数:

每个簇里面 元素距离中心点的距离最小

算法不保证找到最好的解,目标函数是非凸函数,通常的做法就是运行KMeans很多次,每次随机初始化不同的初始中心点,然后从多次运行结果中选择最好的局部最优解

聚类簇的 数目k的选择:
改变聚类数K,然后进行聚类,计算损失函数,拐点处即为推荐的聚类数

聚类本身是为了有监督任务服务的
例如聚类产生features【譬如KMeans用于某个或某些个数据特征的离散化】然后将KMeans离散化后的特征用于下游任务),则可以直接根据下游任务的metrics进行评估更好
例如:衣服尺寸的分类

2. 代码实现

#!/usr/bin/env python
# coding: utf-8

# In[6]:


import random
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer


# In[3]:


def disCos(vecA, vecB):
    return np.dot(vecA, vecB)/(np.sqrt(np.sum(np.square(vecA)))*np.sqrt(np.sum(np.square(vecB))))


# In[4]:


def disEclud(vecA, vecB):
    return np.sqrt(np.sum(np.power(vecA-vecB, 2)))


# In[22]:


def ranCent(dataSet, k):
    m, n = dataSet.shape
    index_list = list(range(m))
    np.random.shuffle(index_list)
    centroids = dataSet[index_list][:k]
    return centroids


# In[44]:


def kMeans(dataSet, k, disMeans=disEclud):
    m, n = dataSet.shape

    clusterAssment = np.zeros((m, 2))  # 用于存放 属于哪一类 以及距离该类中心点的距离
    centroids = ranCent(dataSet, k)
    
    clusterChanged = True
    
    while clusterChanged:
        clusterChanged = False
        
        # 1. 将样本点 根据距离最近 划分到所属类别
        
        for i in range(m):
            minDist = float("inf")
            minIndex = -1
            
            for j in range(k):
                distJI = disMeans(centroids[j, :], dataSet[i, :])
                if distJI < minDist:
                    minDist = distJI
                    minIndex = j
            if clusterAssment[i, 0] != minDist:
                clusterChanged = True # 距离有变化
            clusterAssment[i, :] = minIndex, minDist**2  # 将每个样本的所属类别 以及距离 存入
        print(centroids)  
        # 2. 更新每个类的中心点
        for cent in range(k):
            ptsInCluster = dataSet[np.nonzero(clusterAssment[: 0] == cent)]  # 属于该类别的所有x取出
            centroids[cent, :] = np.mean(ptsInCluster, axis=0)
            
    return centroids, clusterAssment          


# In[47]:


import jieba
doc1 = '我爱北京北京天安门'
doc2 = '我爱北京颐和园'

doc3 = "世界杯梅西夺冠"

doc4 = "世界杯精彩"

docs = [doc1, doc2, doc3, doc4]
docs = [" ".join(list(jieba.cut(sentence))) for sentence in docs]

X = TfidfVectorizer().fit_transform(docs)
result = kMeans(X.A, k=2, disMeans=disCos)
result


# In[48]:


a = np.array([[1, 2], [2, 4], [3, 6]])
a


# In[49]:


a[:, 0] # 取出第一个维度


# In[50]:


a[:, 1]


# In[53]:


np.mean(a, axis=0)  # 沿着 竖直方向求平均


标签:机器,17,kmeans,距离,dataSet,centroids,中心点,聚类,np
From: https://www.cnblogs.com/cavalier-chen/p/17922806.html

相关文章

  • 用C#也能做机器学习?
    前言✨说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合专门学习机器学习,本文我将基于ML.NETModelBuilder(低代码、入门简单)构建一个猫狗识别实......
  • 【洛谷 P1781】宇宙总统 题解(高精度+结构体排序)
    宇宙总统题目描述地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。输入格式第一行为一个整数,代表竞选总统的人数。接下来有行,分别为第一个候选人到第个候选人的票数。输出格式共两行,第一行是......
  • P8647 [蓝桥杯 2017 省 AB] 分巧克力
    二分#include<iostream>#include<stdio.h>#include<algorithm>#include<cstring>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;constintN=1e5+5;intn,k,upb;inth[N],w[N];inlineintread(......
  • P8646 [蓝桥杯 2017 省 AB] 包子凑数
    根据裴蜀定理可得INF的情况是所有数的最大公约数非1而我们的完全背包的上限是多少呢?设置为Σai即可,因为把每一个ai用上之后的集合,和ai可以重复使用的集合,只差了整数倍个ai,因此可达性是完全一致的,这里N<=100,ai<=100,所以我们把这个背包的上限设置为10000.#include<bits/stdc+......
  • 机器学习笔记(二)使用paddlepaddle,再探波士顿房价预测
    目标用paddlepaddle来重写之前那个手写的梯度下降方案,简化内容流程实际上就做了几个事:数据准备:将一个批次的数据先转换成nparray格式,再转换成Tensor格式前向计算:将一个批次的样本数据灌入网络中,计算出结果计算损失函数:以前向计算的结果和真是房价作为输入,通过算是函数sqare......
  • 一家17年的老店,要关门了(转自虎嗅)
    吃完饭,走出店子,看到门头上贴着“旺铺转让”,问老板,“大姐,你们要搬走了?” 大姐一如既往笑眯眯地说,“是啊。我们两个年纪大了,63岁了,做不动了,要回去了。” 这对来自揭阳新亨的老夫妻,在福田下沙开一家小餐厅。店主大哥姓吴,大姐姓王,每天下午4点开门,凌晨2点收摊,风雨无阻,一做就是17......
  • 机器学习笔记(一)从波士顿房价预测开始,梯度下降
    从波士顿房价开始目标其实这一章节比较简单,主要是概念,首先在波士顿房价这个问题中,我们假设了一组线性关系,也就是如图所示我们假定结果房价和这些参数之间有线性关系,即:然后我们假定这个函数的损失函数为均方差,即:那么就是说,我们现在是已知y和x,来求使得这个损失函数Loss最小......
  • 自然语言处理:通过API调用各大公司的机器翻译开放平台
    国内大公司做机器翻译做的比较好的有讯飞和百度,这里给出这两个公司机器翻译的开放平台API的介绍:讯飞开放平台:链接:https://www.xfyun.cn/doc/nlp/xftrans_new/API.html#%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E百度翻译平台:链接:https://api.fanyi.baidu.com/doc/21......
  • 重庆大学重大计算机考研917统考2016~2023年复试/录取情况
    重庆大学计算机学院917考研交流KC群进入KC群可点击下方链接:重大计算机考研KC群  添加图片注释,不超过140字(可选)  添加图片注释,不超过140字(可选)  添加图片注释,不超过140字(可选)  ......
  • 【SpringBootWeb入门-17】Mybatis-基础操作-动态SQL
    1、章节回顾上一篇文章我们讲解完了Mybatis基础操作,本篇继续学习Mybatis中非常重要的功能:动态SQL。什么是动态SQL:随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL。简单说SQL语句不是固定的,是动态变化的。就拿我们上一篇所提到的根据条件来查询员工的SQL语句来......