实验二 聚类
实验代码:
http://www.17bigdata.com/%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84-kmeans-python%E5%AE%9E%E4%BE%8B/
一、实验目的
学习K-means算法基本原理,实现Iris数据聚类
K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
二、实验内容
应用K-means算法对iris数据集进行聚类。
三、编写代码调试(代码不唯一)
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
import sklearn.metrics as sm
import pandas as pd
import numpy as np
def print_data(want_print, print_iris):
"""
展示iris的数据
:return: None
"""
print("iris{0}为:\n{1}".format(want_print, print_iris))
print("=" * 85)
def show_data(length, width, title):
"""
画图
:param length: 长度
:param width: 宽度
:param title: 标题
:return: None
"""
# 建立一个画布
plt.figure(figsize=(14, 7))
plt.scatter(length, width, c=colormap[y.Targets], s=40)
plt.title(title)
plt.show()
if __name__ == '__main__':
# 导入iris数据
iris = datasets.load_iris()
# 展示iris真实数据
print_data(want_print="数据", print_iris=iris.data)
# 展示iris特征名字
print_data(want_print="特征名字", print_iris=iris.feature_names)
# 展示目标值
print_data(want_print="目标值", print_iris=iris.target)
# 展示目标值的名字
print_data(want_print="目标值的名字", print_iris=iris.target_names)
# 为了便于使用,将iris数据转换为pandas库数据结构,并设立列的名字
# 将iris数据转为pandas数据结构
x = pd.DataFrame(iris.data)
# 将iris数据的名字设为‘Sepal_Length’,‘Sepal_Width’,‘Sepal_Width’,‘Petal_Width’
x.columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']
# 将iris目标值也转为pandas数据结构
y = pd.DataFrame(iris.target)
# 将iris目标值得名字设为‘Targets’
y.columns = ['Targets']
# 创建色板图
colormap = np.array(['red', 'lime', 'black'])
# 开始画Sepal长度和宽度的关系
show_data(length=x.Sepal_Length, width=x.Sepal_Width, title='Sepal')
# 开始画Petal长度和宽度的关系
show_data(length=x.Petal_Length, width=x.Petal_Width, title='Petal')
#调用Kmeans进行聚类
# 绘出聚类前后的图
# 计算并输出准确率
四、实验要求
# 1.补充参考程序红字部分代码(调用Kmeans 模型进行聚类、绘图、并计算输出准确率)。
#2.也可另编写代码实现上述目的。
# 3.撰写实验报告(一周提交电子版)
由于每个python模块(python文件)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当前执行文件的名称(包含了后缀.py)。所以当模块被直接执行时,__name__ == '__main__'结果为真;而当模块被import到其他模块中时,__name__ == '__main__'结果为假,就是不调用对应的方法。
简而言之就是:__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被运行。
subplot()是将整个figure均等分割,而axes()则可以在figure上画图。
https://blog.csdn.net/claroja/article/details/70841382
可能性表格
分类准确率分数是指所有分类正确的百分比。
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
import sklearn.metrics as sm
import pandas as pd
import numpy as np
def print_data(want_print, print_iris):
"""
展示iris的数据
:return: None
"""
print("iris{0}为:\n{1}".format(want_print, print_iris))
print("=" * 85)
def show_data(length, width, title):
"""
画图
:param length: 长度
:param width: 宽度
:param title: 标题
:return: None
"""
# 建立一个画布
plt.figure(figsize=(14, 7))
plt.scatter(length, width, c=colormap[y.Targets], s=40)
plt.title(title)
plt.show()
if __name__ == '__main__':
# 导入iris数据
iris = datasets.load_iris()
# 展示iris真实数据
print_data(want_print="数据", print_iris=iris.data)
# 展示iris特征名字
print_data(want_print="特征名字", print_iris=iris.feature_names)
# 展示目标值
print_data(want_print="目标值", print_iris=iris.target)
# 展示目标值的名字
print_data(want_print="目标值的名字", print_iris=iris.target_names)
# 为了便于使用,将iris数据转换为pandas库数据结构,并设立列的名字
# 将iris数据转为pandas数据结构
x = pd.DataFrame(iris.data)
# 将iris数据的名字设为‘Sepal_Length’,‘Sepal_Width’,‘Sepal_Width’,‘Petal_Width’
x.columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']
# 将iris目标值也转为pandas数据结构
y = pd.DataFrame(iris.target)
# 将iris目标值得名字设为‘Targets’
y.columns = ['Targets']
# 创建色板图
colormap = np.array(['red', 'lime', 'black'])
# 开始画Sepal长度和宽度的关系
show_data(length=x.Sepal_Length, width=x.Sepal_Width, title='Sepal')
# 开始画Petal长度和宽度的关系
show_data(length=x.Petal_Length, width=x.Petal_Width, title='Petal')
#调用Kmeans进行聚类
# 绘出聚类前后的图
model=KMeans(n_clusters=3)#构造聚类器
model.fit(x)#聚类
Pre=model.labels_
#y.Targets== np.choose(model.labels_, [1, 0, 2]).astype(np.int64)#调换颜色顺序
# 绘出聚类前后的图
#show_data(length=x.Sepal_Length, width=x.Sepal_Width, title='Cluster-Sepal')
#show_data(length=x.Petal_Length, width=x.Petal_Width, title='Cluster-Petal')
# 计算并输出准确率
#print_data(want_print="准确率", print_iris=sm.accuracy_score(y, Pre))
#为了更清楚显示图示,我们就不采用print_data函数
print("="*80)
predY=np.choose(model.labels_, [0, 1, 2]).astype(np.int64)
plt.figure(figsize=(14, 7))
plt.subplot(1, 2, 1)
plt.scatter(x.Petal_Length, x.Petal_Width, c=colormap[y.Targets], s=40)
plt.title('Real Classification')
plt.subplot(1, 2, 2)
plt.scatter(x.Petal_Length, x.Petal_Width, c=colormap[predY], s=40)
plt.title('K Mean Classification')
print_data(want_print="准确率", print_iris=sm.accuracy_score(y, Pre))
print("实际预测矩阵:")
print(sm.confusion_matrix(y, Pre))