自然语言处理实验—用K-means的方法对样本特征分类(含python代码和详细例子解释)

自然语言处理实验—用K-means的方法对样本特征分类

一、算法简述

本次博客我们介绍一下机器学习里经典的聚类算法K-means,它属于典型的无监督学习算法。其核心思想也非常的简单,大致思路如下:

  1. 要选取 K ( K = 1 , 2 , . . ) K(K=1,2,..) K(K=1,2,..)个簇的质心,这决定了我们最终聚类的簇(每一类被分为一个簇)。
  2. 对每一个待分类的样本,我们都计算该样本到每个簇质心的距离,然后将该样本归类到最小距离的簇。
  3. 更新每个簇的质心,每个簇的新的质心等于所有位于该簇的样本的均值。
  4. 以此类推,重新归类样本,更新簇的质心。直到簇的质心不再改变为止。

二、情景介绍

下面我们举个栗子,记录有某音乐网站6位用户点播的歌曲流派,给定用户名称和九种音乐类型的播放数量,通过K-means将6位用户分成3簇(把播放数量当成数组或者向量进行簇质心的迭代运算)

用户/项目项目1项目2项目3项目4项目5项目6项目7项目8项目9
用户11064000000
用户2000890000
用户3000004400
用户4000960020
用户5403000003
用户6001008000

三、python代码实现

import numpy as np

user_item_matrix = np.array([[10,6,4,0,0,0,0,0,0],
                             [0,0,0,8,9,0,0,0,0],
                             [0,0,0,0,0,4,4,0,0],
                             [0,0,0,9,6,0,0,2,0],
                             [4,0,3,0,0,0,0,0,3],
                             [0,0,1,0,0,8,0,0,0]])
print("初始矩阵为:")
print(user_item_matrix)
K1 = user_item_matrix[0]
K2 = user_item_matrix[1]
K3 = user_item_matrix[2]
number = 0
while(1):
    number += 1
    print(f"\n############# cluster iter :{number} #############")
    cluster_one = []
    cluster_two = []
    cluster_three = []
    distance = []
    for item in user_item_matrix:
        distance.append([np.sqrt(sum((item - K1)**2)),np.sqrt(sum((item - K2)**2)),np.sqrt(sum((item - K3)**2))])
    distance = np.array(distance)
    print("compute distance result\n",distance)
    num = distance.argmin(axis=1)
    print("cluster result\n",num)
    for i in range(len(num)):
        if(num[i]==0):
            cluster_one.append(i)
        elif(num[i]==1):
            cluster_two.append(i)
        else:
            cluster_three.append(i)
    K1_new = np.mean([user_item_matrix[i] for i in cluster_one ])
    K2_new = np.mean([user_item_matrix[i] for i in cluster_two ])
    K3_new = np.mean([user_item_matrix[i] for i in cluster_three ])
    if(K1_new.all()==K1.all() and K2_new.all()==K2.all() and K3_new.all()==K3.all()):
        print("\n################ cluster result ################")
        print("cluster_one",cluster_one)
        print("cluster_two",cluster_two)
        print("cluster_three",cluster_three)
        break
    else:
        K1 = np.mean([user_item_matrix[i] for i in cluster_one])
        K2 = np.mean([user_item_matrix[i] for i in cluster_two])
        K3 = np.mean([user_item_matrix[i] for i in cluster_three])
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个简单的使用Python实现的K-Means算法的代码: ``` import numpy as np import matplotlib.pyplot as plt # 生成随机数据 np.random.seed(0) X = np.random.randn(100, 2) # 初始化聚类中心 k = 3 centers = X[:k, :] # 迭代更新聚类中心 while True: # 计算每个样本与聚类中心的距离 distances = np.sqrt(((X - centers[:, np.newaxis]) ** 2).sum(axis=2)) # 分配样本到最近的聚类中心 labels = distances.argmin(axis=0) # 更新聚类中心 new_centers = np.array([X[labels == i].mean(axis=0) for i in range(k)]) # 判断是否收敛 if np.all(centers == new_centers): break centers = new_centers # 可视化聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='r') plt.show() ``` 上述代码中,我们首先生成了一个二维的随机数据集X,然后初始化了三个聚类中心,接着进行了迭代更新聚类中心的过程,直到聚类中心不再变化为止。最后,我们用matplotlib库将聚类结果可视化出来。 ### 回答2: k-means是一种基本的聚类算法,它的目标是将数据集划分为k个簇,使得每个数据点与所属簇中的均值最接近。以下是一个简单的使用Python实现k-means算法的代码: ```python import numpy as np def kmeans(data, k, max_iters=100): # 随机选择k个初始质心 centers = data[np.random.choice(range(len(data)), k, replace=False)] for _ in range(max_iters): # 计算每个数据点与质心的距离 distances = np.sqrt(((data - centers[:, np.newaxis])**2).sum(axis=2)) # 将数据点分配到最近的质心 labels = np.argmin(distances, axis=0) # 更新质心位置为所属簇的均值 new_centers = np.array([data[labels == i].mean(axis=0) for i in range(k)]) # 如果质心位置没有变化,则停止迭代 if np.all(centers == new_centers): break centers = new_centers return labels, centers # 测试代码 data = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) k = 2 labels, centers = kmeans(data, k) print("数据点所属簇的标签:", labels) print("质心坐标:", centers) ``` 上述代码中,将数据集表示为一个二维numpy数组。在算法开始时,通过随机选择k个数据点作为初始质心。然后,通过多次迭代计算每个数据点与质心的距离,将数据点分配到最近的质心所属的簇,然后更新质心的位置为所属簇的均值。重复这个过程直到质心位置不再发生变化或达到最大迭代次数。 最后,打印每个数据点所属的簇的标签以及最终的质心坐标。 ### 回答3: k-means是一种常用的聚类算法,其思想是根据样本之间的相似度进行聚类,将样本划分为K个不重叠的簇。下面是一个用Python实现k-means算法的例子: ```python import numpy as np import random def k_means(data, k, max_iters): centroids = random.sample(list(data), k) # 随机选择k个初始质心 for _ in range(max_iters): clusters = [[] for _ in range(k)] # 存储每个簇的样本 for point in data: distances = [np.linalg.norm(point - centroid) for centroid in centroids] # 计算样本与每个质心的距离 cluster_idx = np.argmin(distances) # 找到距离最近的质心索引 clusters[cluster_idx].append(point) # 将样本添加到对应的簇中 new_centroids = [] for cluster in clusters: if cluster: new_centroid = np.mean(cluster, axis=0) # 计算簇中样本的均值作为新的质心 new_centroids.append(new_centroid) else: new_centroids.append(random.choice(list(data))) # 若某个簇为空,则随机选择一个样本作为新的质心 if np.all(centroids == new_centroids): break # 若质心不再更新,则停止迭代 centroids = new_centroids return centroids, clusters # 测试代码 data = np.array([[1, 2], [1, 4], [3, 4], [5, 7], [3, 2], [8, 1]]) k = 2 max_iters = 10 centroids, clusters = k_means(data, k, max_iters) for i, cluster in enumerate(clusters): print('Cluster {}:'.format(i)) print(cluster) ``` 上述代码中,`data`是一个包样本的numpy数组,`k`是簇的数量,`max_iters`是最大迭代次数。代码首先在样本中随机选择`k`个作为初始质心,然后进行迭代,直到质心不再更新或达到最大迭代次数为止。对于每个迭代周期,代码计算每个样本与质心的距离,将样本分配到距离最近的簇中,然后重新计算每个簇的质心。最后,返回最终的质心和簇的分配结果。 测试代码中,我们给定了一个简单的二维数据集,将其分为两个簇,然后输出每个簇的样本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值