人工智能 实验2.无监督学习方法(聚类)

实验二  聚类

实验代码:

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.撰写实验报告(一周提交电子版)

__name__ == '__main__':

由于每个python模块(python文件)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当前执行文件的名称(包含了后缀.py。所以当模块被直接执行时,__name__ == '__main__'结果为真;而当模块被import到其他模块中时,__name__ == '__main__'结果为假,就是不调用对应的方法。

 

简而言之就是:__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被运行。

plt.subplot

subplot()是将整个figure均等分割,而axes()则可以在figure上画图。

https://blog.csdn.net/claroja/article/details/70841382

可能性表格

accuracy_score

分类准确率分数是指所有分类正确的百分比。

confusion_matrix

https://img-blog.csdn.net/20170814211735042?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbTBfMzgwNjE5Mjc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

实验代码

# -*- 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))

 

你可能感兴趣的:(人工智能,聚类,无监督学习)