3.K均值算法

1). 扑克牌手动演练k均值聚类过程:>30张牌,3类

选取32张牌,分3类。

第1轮:聚类中心为1,2,3。

第2轮:聚类中心为1,2,6(5.5向上取整)。

第3轮:聚类中心为1,2,6(5.5向上取整)。

# 扑克牌手动演练k均值聚类过程:选择32张牌,3类
sum11 = 0
sum12 = 0
sum13 = 0
print("第1轮")
for i in range(1, 2):
    sum11 = sum11+i*4
print("牌为1类求平均值,得到新的中心为:", sum11 / 4)

for i in range(2, 3):
    sum12 = sum12+i*4
print("牌为2类求平均值,得到新的中心为:", sum12 / 4)

for i in range(3, 9):
    sum13 = sum13+i*4
print("牌为3类求平均值,得到新的中心为:", sum13 / 24)
sum21 = 0
sum22 = 0
sum23 = 0
print("第2轮")
for i in range(1, 2):
    sum21 = sum21+i*4
print("牌为1类求平均值,得到新的中心为:", sum21 / 4)

for i in range(2, 4):
    sum22 = sum22+i*4
print("牌为2类求平均值,得到新的中心为:", sum22 / 8)

for i in range(4, 9):
    sum23 = sum23+i*4
print("牌为3类求平均值,得到新的中心为:", sum23 / 20)
sum31 = 0
sum32 = 0
sum33 = 0
print("第3轮")
for i in range(1, 2):
    sum31 = sum31+i*4
print("牌为1类求平均值,得到新的中心为:", sum31 / 4)

for i in range(2, 4):
    sum32 = sum32+i*4
print("牌为2类求平均值,得到新的中心为:", sum32 / 8)

for i in range(4, 9):
    sum33 = sum33+i*4
print("牌为3类求平均值,得到新的中心为:", sum33 / 20)

运行结果:

2). *自主编写K-means算法 ,以鸢尾花花瓣长度数据做聚类,并用散点图显示。(加分题)

import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from pylab import mpl

# 指定字体,解决plot不能显示中文的问题
mpl.rcParams[‘font.sans-serif‘] = [‘SimHei‘]

iris = load_iris()
print(iris.feature_names)  # 特征名称
n = len(iris.data)   # 鸢尾花花瓣数据的长度
x = iris.data[:, 1]  # 鸢尾花花瓣长度数据
k = 3 # 类簇个数
y = np.zeros(n)  # 初始化数组
# 初始聚类中心数组
# 选择前k个样本作为初始类中心
def initcenter(x, k):
    # # 初始聚类中心数组
    # 选择前k个样本作为初始类中心
    return x[0:k]

def nearest(kc, i):
    d = (abs(kc - i)) #距离绝对值
    w = np.where(d == np.min(d))
    return w[0][0]
def xclassify(x, y, kc):
    for i in range(x.shape[0]):  # 对数组的每个值分类
        y[i] = nearest(kc, x[i])
    return y
# 更新聚类中心:将每个类别中所有对象所对应的均值作为该类别的聚类中心,计算目标函数的值;
def kcmean(x, y, kc, k):
    li = list(kc)
    flag = False
    for i in range(k):
        m = np.where(y==i)
        n = np.mean(x[m])
        if li[i] !=n:
            li[i]=n
            flag=True # 聚类中心发生变化
    return (np.array(li),flag)
# 判断聚类中心和目标函数的值是否发生改变。
# 获取鸢尾花数据集
kc = initcenter(x, k)
flag = True
while flag:
    y = xclassify(x, y, kc)
    kc, flag = kcmean(x, y, kc, k)
print("聚类结果:", y)
print("聚类中心:", kc)

plt.scatter(x, x, c=y, s=50, cmap=‘rainbow‘)
plt.title("自主编写K-means算法 ,以鸢尾花花瓣长度数据做聚类的散点图")
plt.show()

运行结果:

3). 用sklearn.cluster.KMeans,鸢尾花花瓣长度数据做聚类,并用散点图显示.

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from pylab import mpl

# 指定字体,解决plot不能显示中文的问题
mpl.rcParams[‘font.sans-serif‘] = [‘SimHei‘]

# 获取鸢尾花数据集
iris = load_iris()
x = iris.data[:, 1].reshape(-1, 1)  # 鸢尾花花瓣长度数据
# 直接调用sklearn库实现对鸢尾花数据进行聚类分析
model = KMeans(n_clusters=3)  # 构建模型
model.fit(x)  # 训练
y = model.predict(x)  # 预测每个样本的聚类索引
print("预测结果:", y)
kc = model.cluster_centers_   # 聚类中心
print("聚类中心:", kc)
plt.scatter(x[:, 0], x[:, 0], c=y, s=50, cmap=‘rainbow‘)
plt.title("用sklearn.cluster.KMeans,鸢尾花花瓣长度数据做聚类的散点图")
plt.show()

运行结果:

4). 鸢尾花完整数据做聚类并用散点图显示.

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from pylab import mpl

# 指定字体,解决plot不能显示中文的问题
mpl.rcParams[‘font.sans-serif‘] = [‘SimHei‘]

# 获取鸢尾花数据集
iris = load_iris()
x = iris.data  # 鸢尾花花瓣长度数据
# 直接调用sklearn库实现对鸢尾花数据进行聚类分析
model = KMeans(n_clusters=3)  # 构建模型
model.fit(x)  # 训练
y = model.predict(x)  # 预测每个样本的聚类索引
print("预测结果:", y)
kc = model.cluster_centers_   # 聚类中心
print("聚类中心:", kc)
plt.scatter(x[:, 0], x[:, 1], c=y, s=50, cmap=‘rainbow‘)
plt.title("鸢尾花完整数据做聚类的散点图")
plt.show()

运行结果:

5).想想k均值算法中以用来做什么?

答:k均值算法可以用来根据对用户的购买历史或浏览记录进行分类,对不同的用户进行不同的推荐;也可以用来根据标签、主题和文档

  内容将文档分为多个不同的类别,即可以做文档分类器。

原文地址:https://www.cnblogs.com/hs01/p/12692767.html

时间: 2024-11-05 16:12:21

3.K均值算法的相关文章

DM里的K均值算法

1.Preface 因为一直在做的是聚类算法的研究,算是总结了一些心得,这里总结些知识性与思路性的东西,我想在其他地方也是很容易的找到类似的内容的.毕竟,世界就是那么小. 声明:本文比较不适合没有DM基础的人来阅读.我只是胡乱的涂鸦而已 2.聚类算法 在DM里的聚类算法里,有基于划分的算法,基于层次的算法,基于密度的算法,基于网格的算法,基于约束的算法. 其中每一种基于的算法都会衍生出一至几种算法,对应的每一种算法不管在学术界还是工业界都存在着许多的改进的算法 这里想介绍的是基于基于划分的算法里

k均值算法

import matplotlib.pyplot as plt import numpy as np import time from django.template.defaultfilters import center def loadDataSet(fileName): dataMat=[] fr=open(fileName) for line in fr.readlines(): curLine=line.strip().split('\t') fltLine=map(float,cu

聚类算法:K-means 算法(k均值算法)

k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设定,例如可选开始的$K$个模式样本的向量值作为初始聚类中心.      第二步:逐个将需分类的模式样本$\{x\}$按最小距离准则分配给$K$个聚类中心中的某一个$z_j(1)$.假设$i=j$时, \[D_j (k) = \min \{ \left\| {x - z_i (k)} \right\|

二分-k均值算法

首先我们都知道k均值算法有一个炒鸡大的bug,就是在很多情况下他只会收敛到局部最小值而不是全局最小值,为了解决这个问题,很多学者提出了很多的方法,我们在这里介绍一种叫做2分k均值的方法. 该算法首先将所有点作为一个簇,然后将该簇一分为二.之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于哪个簇的sse是最大值.上述基于sse的划分过程不断重复,直到得到用户指定的簇数目为止. 将所有的点看成一个簇,当粗的数目小于k时,对每一个簇计算总误差,在给定的粗上进行k均值聚类(k=2),计算将该粗一

K均值算法-python实现

测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点A,聚类个数k输出:k个聚类的中心点 随机选取k个初始的中心点repeat: 计算每个点和中心点的距离,将点分配给最近的中心簇中 计算Ck,更新簇的中心点until 中心点稳定 -----------------------------'''import sysimport randomimport

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

4 用python实现K均值算法 x=np.random.randint(1,100,[20,1]) y=np.zeros(20) k=3 def initcenter(x,k): return x[:k] def nearest(kc,i): d = (abs(kc - i)) w = np.where(d ==np.min(d)) return w [0] [0] kc = initcenter(x,k) nearest(kc,14) for i in range(x.shape[0]):

聚类--K均值算法

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用    1.用python实现K均值算法 K-means是一个反复迭代的过程,算法分为四个步骤:(x,k,y) import numpy as np x = np.random.randint(1,50,[20,1]) y = np.zeros(20) k = 3 # 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心:def initcenter(x, k): kc def initcenter(x,k)

【机器学习】K均值算法(II)

k聚类算法中如何选择初始化聚类中心所在的位置. 在选择聚类中心时候,如果选择初始化位置不合适,可能不能得出我们想要的局部最优解. 而是会出现一下情况: 为了解决这个问题,我们通常的做法是: 我们选取K<m个聚类中心. 然后随机选择K个训练样本的实例,之后令k个聚类中心分别与k个训练实例相等. 之后我们通常需要多次运行均值算法.每一次都重新初始化,然后在比较多次运行的k均值的结果,选择代价函数较小的结果.这种方法在k较小的时候可能会有效果,但是在K数量较多的时候不会有明显改善. 如何选取聚类数量

K均值算法总结

这几天在一个项目上需要用到K均值聚类算法,以前都是直接利用百度老师copy一个Kmeans算法代码,这次想自己利用已知的算法思想编写一下,编写才知道,虽然熟悉了算法思想,真正实现时,还是遇到不少bug,这就是小学老师说的"眼高手低",还是需要亲自动手实现一下,才算真正的掌握思想. 回顾一下Kmeas算法思想,将若干元素聚为k类,使之,每一类内的元素相似度较高,类间的元素相似度较低,达到将若干元素划分的目的,具体如下: 1.初始化质心,初始化质心有多种初始化方法,我熟知的有两种,随机选择