聚类--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]):
    print(nearest(kc,x[i]))

运行结果为:

for i in range(x.shape[0]):
    y[i] = nearest(kc,x[i])
print(y)

运行结果为:

for i in range(x.shape[0]):
    y[i]=nearest(kc,x[i])
print(y)

运行结果为:

def initcenter(x,k):
    return x[:k]

def nearest(kc, i):
    d = (abs(kc - 1))
    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

kc = initcenter(x,k)
nearest(kc,93)
m  = np.where(y == 0)
np.mean(x[m])

kc[0]=24
flag = True
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
x = iris.data[:,1]
y = np.zeros(150)

def nearest(kc,i):  #初始聚类中心数组
  return x[0:k]

def  nearest(kc,i):  #数组中的值,与聚类中心最小距离所在类别的索引号
    d = (abs(kc - i))
    w = np.where(d == np.min(d))
    return w[0][0]

def kcmean(x, y, kc, k):  #计算各聚类新均值
    l =list(kc)
    flag = False
    for c in range(k):
        m = np.where(y == c)
        if m[0].shape != (0,):
            n = np.mean(x[m])
            if l[c] != n:
                l[c] = n
                flag = True #聚类中心发生改变
                return (np.array(1),flag)

def xclassify(x,y,kc):
    for i in range(x.shape[0]): #对数组的每个值分类
        y[i] = nearest(kc,x[i])
    return y

k = 3
kc = initcenter(x,k)

falg = True
print(x, y, kc, flag)
while flag:
    y = xclassify(x, y, kc)
    xc, flag = kcmean(x, y, kc, k)

print(y,kc)

运行结果为:

import matplotlib.pyplot as plt
plt.scatter(x, x, c=y, s=50, cmap=‘rainbow‘,marker=‘p‘,alpha=0.5);
plt.show()

运行结果为:

鸢尾花花瓣长度数据做聚类并用散点图显示。

import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
x = iris.data[:,1]
y = np.zeros(150)

def initcenter(x,k):    #初始聚类中心数组
    return x[0:k].reshape(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]):       #对数组的每个值进行分类,shape[0]读取矩阵第一维度的长度
        y[i] = nearest(kc,x[i])
    return y

def kcmean(x,y,kc,k):     #计算各聚类新均值
    l = list(kc)
    flag = False
    for c in range(k):
        print(c)
        m = np.where(y == c)
        n=np.mean(x[m])
        if l[c] != n:
            l[c] = n
            flag = True     #聚类中心发生变化
            print(l,flag)
    return (np.array(l),flag)

k = 3
kc = initcenter(x,k)

flag = True
print(x,y,kc,flag)

#判断聚类中心和目标函数的值是否发生改变,若不变,则输出结果,若改变,则返回2
while flag:
    y = xclassify(x,y,kc)
    kc, flag = kcmean(x,y,kc,k)
    print(y,kc,type(kc))

print(x,y)
import matplotlib.pyplot as plt
plt.scatter(x,x,c=y,s=50,cmap="rainbow");
plt.show()

运行结果为:

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

iris = load_iris()
X=iris.data
X

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

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

iris = load_iris()
X=iris.data
X

from sklearn.cluster import KMeans

est = KMeans(n_clusters=3)
est.fit(X)
kc = est.cluster_centers_
y_kmeans = est.predict(X)   #预测每个样本的聚类索引

print(y_kmeans,kc)
print(kc.shape,y_kmeans.shape,X.shape)

plt.scatter(X[:,0],X[:,1],c=y_kmeans, s=50, cmap=‘rainbow‘);
plt.show()

运行结果为

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

from sklearn.cluster import KMeans
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
data = load_iris()
iris = data.data
petal_len = iris
print(petal_len)
k_means = KMeans(n_clusters=3) #三个聚类中心
result = k_means.fit(petal_len) #Kmeans自动分类
kc = result.cluster_centers_ #自动分类后的聚类中心
y_means = k_means.predict(petal_len) #预测Y值
plt.scatter(petal_len[:,0],petal_len[:,2],c=y_means, marker=‘p‘,cmap=‘rainbow‘)
plt.show()

运行结果为:

原文地址:https://www.cnblogs.com/fanfanfan/p/9862233.html

时间: 2024-10-06 15:37:40

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

聚类--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-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\|

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类求平均值,得到新的中

DM里的K均值算法

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

二分-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均值算法

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均值算法(II)

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

K均值算法总结

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