学习日记(2.22-2.21 K-MEANS)

K-means算法

K-means算法简介

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
定义:
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。(以上均来自于 百度百科)

算法分析:

以我个人的理解,K-means算法就是在一个大的样本里随机指定几个数据为聚类中心,然后在各个聚类中心的视角上,依次找到里该聚类中心最近的几个样本点,之后我们按照第一次分类找的点求出该聚类的几何中心,把几何中心作为聚类中心。经过了依次迭代我们发现聚类中心其实发生了改变,那几个样本归为一类也发生了改变,我们把这样的循环一直进行下去,直到聚类中心不发生偏移为止。在分类结束后,我们可以人工的给各个类别贴上标签,这个属于无监督学习是没有标签的。

K-means算法用sklearn库实现:

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
#载入数据
data=np.genfromtxt("E:\python-ml\kmeans.txt",delimiter=" ")
#设置K值
k=4
#训练模型
model=KMeans(n_clusters=k)
model.fit(data)
#分类中心点
centers=model.cluster_centers_
print('分类中心是:\n',centers)
result=model.predict(data)
#一共有四个类别 0 , 1, 2 ,3  打印出来的就是按照顺序分类的结果
print(result)
#画出各个数据点,用不同的颜色标识分类s
mark=['or','ob','og','oy']
#这里是一个 enumberate 语法, i是下标,d是data中的每一个一维数组用来表示坐标
for i,d in enumerate(data):
    #每一个坐标点的顺序下标在result里面是分类数字,然后把分类数字在mark里面换成颜色
    plt.plot(d[0],d[1],mark[result[i]])
#画出中心
mark=['*r','*b','*g','*y']
for i,center in enumerate(centers):
    #中心点就是4个,4个对应的分类颜色如上mark,这句话就是在一次打印出中心点,颜色安装mark规则,形状是 *,大小是20
    plt.plot(center[0],center[1], mark[i], markersize=20)
plt.show()

运行截图


补充一下:

点击可以查看更多关于plt.plot的语法知识,我也是看了他的博客

Mini Batch K-Means算法

Mini Batch K-Means算法是K-Means算法的变种,采用小批
量的数据子集减小计算时间。这里所谓的小批量是指每次训练
算法时所随机抽取的数据子集,采用这些随机产生的子集进行
训练算法,大大减小了计算时间,结果一般只略差于标准算法。
该算法的迭代步骤有两步:
1:从数据集中随机抽取一些数据形成小批量,把他们分配给
最近的质心
2:更新质心
与K均值算法相比,数据的更新是在每一个小的样本集上。
Mini Batch K-Means比K-Means有更快的 收敛速度,但同时
也降低了聚类的效果,但是在实际项目中却表现得不明显。


在分类边缘会出现一点小的瑕疵。

代码部分

和前面的 KMeans差不多,就是把前面的KMeans改成MiniBatchKMeans

from sklearn.cluster import MiniBatchKMeans
import numpy as np
import matplotlib.pyplot as plt
# 载入数据
data = np.genfromtxt("E:\python-ml\kmeans.txt", delimiter=" ")
# 设置k值
k = 4
# 训练模型
model = MiniBatchKMeans(n_clusters=k)
model.fit(data)
# 分类中心点坐标
centers = model.cluster_centers_
print('分类中心点坐标:')
print(centers)
# 预测结果
result = model.predict(data)
print('预测结果:')
print(result)
# 画出各个数据点,用不同颜色表示分类
mark = ['or', 'ob', 'og', 'oy']
for i,d in enumerate(data):
    plt.plot(d[0], d[1], mark[result[i]])

# 画出各个分类的中心点
mark = ['*r', '*b', '*g', '*y']
for i,center in enumerate(centers):
    plt.plot(center[0],center[1], mark[i], markersize=20)

plt.show()

KMeans算法存在的4个问题

解决方法:


解决方法:


一般来说,画出Cost函数和K值选取的图像,这个图片就很像人的手臂,我们在手肘的部位选取K值一般是比较合适的。

解决方案:数据可视化

可视化网址访问外网不成功。。。。有点卡你们要看的话就多等一会

挑选你希望的数据类型



迭代就是一直点GO和UPDATE

点到你感觉分类中心没有改变为止。
有一类这样的对称的图形实现不了分类:

这样的对称的数据不适合用KMEANS,我们在使用之前其实也应该用数据可视化的方法来看一下数据是否适合我们的K-Means算法,不然会白忙活一场

K-Means实战:NBA球队实例分析

数据集展示:

代码部分:

读取数据打印数据集,其中我遇到一个问题:读取文件的时候报错 SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 12-13: malformed \N character escape
解决方案把这个文件手动上传到Jupter 上面,不用添加路径只需要文件名就直接读取了,不会报错。

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
data = pd.read_csv('Nba_data.csv')
data.head()


数据标准化:我前面的博客提到过,主要是方便计算,又可以保存数据特征

肘部法则:我们就判断 4为肘部好了

用K值来训练模型:

打印出聚类效果:

完整代码

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
data = pd.read_csv('Nba_data.csv')
minmax_scaler = MinMaxScaler()
# 标准化数据
X = minmax_scaler.fit_transform(data.iloc[:,1:])
# 肘部法则
loss = []
#在2--10之间用选取K值
for i in range(2,10):
    model = KMeans(n_clusters=i).fit(X)
    #损失函数值导入loss list 方便画出图像
    loss.append(model.inertia_)

plt.plot(range(2,10),loss)
plt.xlabel('k')
plt.ylabel('loss')
plt.show()
k = 4
model = KMeans(n_clusters=k).fit(X)

# 将标签整合到原始数据上
data['clusters'] = model.labels_
for i in range(k):
    print('clusters:',i)
    label_data = data[data['clusters'] == i].iloc[:,0]
    print(label_data.values)

以上就是我这三天对于K-means的学习笔记。

原文地址:https://www.cnblogs.com/Eldq/p/12358455.html

时间: 2024-10-15 16:18:28

学习日记(2.22-2.21 K-MEANS)的相关文章

学习日记 | 5.22 [Python3] Python3基础与面向对象

注:这是一系列基于实验楼网络培训的python学习日记,内容零散,只是便于我自己回顾,有需要请了解www.shiyanlou.com. 去三亚玩了3天,进度严重滞后,难受. 3. 挑战1 挑战:实现个税计算器 #!/usr/bin/env python3 import sys # rateAndQD函数,求应纳税所得额对应的税率和速算扣除数 def rateAndQD(taxableIncome): if taxableIncome <= 1500: rate, QD = 0.03, 0 eli

Thinkphp学习日记:jQuery_ajax数据提交

最近在玩Thinkphp,废话不多说,说正事. 客户端js提交代码 1 $.post('http://localhost/app/index.php/Index/Index/handle',{username : document.getElementById('username').value,content : document.getElementById('content').value,},function (data){console.log(data);alert('ok');})

学习日记-----各种问题

用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答: 从下至上分别为:数据访问层.业务逻辑层(又或成为领域层).表示层 数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关 表示层:是系统的UI部分,负责使用者与整个系统的交互.  优点:  分工明确,条理清晰,易于调试,而且具有可扩展性. 缺点:  增加成本. 分层式结构究竟其优势何在? 1.开发人员可以只关注整个结构中的其中某一

informatica 学习日记整理

1. INFORMATICA CLIENT的使用 1.1 Repository Manager 的使用 1.1.1 创建Repository. 前提: a. 在ODBC数据源管理器中新建一个数据源连接至你要创建Repository的数据库(例:jzjxdev) b. 要在你要连接的数据库中新建一个用户(例:name: ETL password: ETL) 现在你可以创建一个Repository了.选择Repository – Create Repository,输入Repository Name

Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 Android Gradle编译学习日记(基于 Android Studio 1.0): Android Gradle编译学习日记之一(搭建 Gradle 环境以及编译 Android 应用) 在上一篇文章中,我简单介绍了一个 Gradle 环境变量的搭建,以及如何使用 Gradle 编译 Android

Numba学习日记 —— 2019-12-5

Numba学习日记 -- 2019-12-5 Python的不足: Python的最大优势也可能是它最大的弱点:它的灵活性和无类型的高级语法可能导致数据和计算密集型程序的性能不佳.-- 动态类型化解释语言 什么是 numba : Numba,一个来自Anaconda的Python编译器,可以编译Python代码,以便在支持CUDA的GPU或多核CPU上执行.由于Python通常不是编译语言,您可能想知道为什么要使用Python编译器.答案当然是运行本机编译代码比运行动态解释代码快许多倍. Num

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和

学习日记

五一耍了三天,自己的计划有泡汤,那种制止力哪里去了,不过我认真起来还有有废寝忘食的时候,不过希望这种时候多一点,回家妈妈告诉我,她给老师打电话了的,老师说了我的一些情况,不过我没有老师说的那么好,学习在班上算中等.我觉得还算不上吧!任重而道远吧. Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量

学习日记之解释器模式和Effective C++

解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. (1),如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言的句子.这样可以构建一个解释器,该解释器通过解释这些句子来解决该问题. (2),当一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式. (3),容易改变和扩展文法,因为该模式使用类来表示文法规则,你可以使用继承来改变和扩展该文法

学习日记之中介者模式和Effective C++

中介者模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. (1),中介者模式很容易在系统中应用,也很容易在系统中误用.当系统出现多对多交互复杂的对象群时,不要急于使用中介者模式,而要反思你在系统的设计上是不是合理. (2),中介者的出现减少了各个对象的耦合,使得可以独立地改变和复用各个对象和中介者. (3),由于把对象如何协作进行了抽象,将中介者作为一个独立的概念并将其封装在一个对象中,这样关注