python 机器学习(一)无监督学习 + 监督学习 + 聚类算法 + k-means算法自实现

一、机器学习


1. 概念


在历史数据中去发现规律,然后利用规律,在新的数据中进行预测、与指导


2. 人工智能基础(数据分析、数据挖掘)


如果想要一个好的机器学习结果,就必须有一个好的数据处理


3. 数据分析、与数据挖掘的区别


  • 数据分析主要偏向于业务(是对数据的一种操作手段)
    是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。
  • 数据挖掘主要偏向于对数据价值的挖掘(是对数据分析手段后的信息,进行价值化的分析)
    又译为资料探勘、数据采矿。它是数据库知识发现中的一个步骤。数据挖掘一般是指从大量的数据中通过算法搜索隐藏于其中信息的过程。

4. 无监督学习


根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题,称之为无监督学习。

特点:

  • 数据:无目标值数据
  • 研究:研究的是样本与样本之间的关系

5, 监督学习


利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程;监督学习是从标记的训练数据来推断一个功能的机器学习任务。
在监督学习中,每个实例都是由一个输入对象(通常为矢量)和一个期望的输出值(也称为监督信号)组成。

特点:

  • 数据:既有特征值,又有目标值
  • 研究:研究的是特征与目标之间的关系

6. 无监督学习和监督学习的区别


  1. 监督学习方法必须要有训练集与测试样本。在训练集中找规律,而对 测试样本使用这种规律。而非监督学习没有训练集,只有一组数据,在该 组数据集内寻找规律。
  2. 监督学习的方法就是识别事物,识别的结果表现在给待识别数据加上 了标签。因此训练样本集必须由带标签的样本组成。而无监督学习方法只 知 有要分析的数据集的本身,预先没有什么标签。如果发现数据集呈现某种 识 聚集性,则可按自然的聚集性分类,但不予以某种预先分类标签对上号为 讲解 目的。

何时使用:

简单的方法就是从定义入手,有训练样本则考虑采用监督学习方法;无 训练样本,则一定不能用监督学习方法。但是,现实问题中,即使没有训 练样本,我们也能够凭借自己的双眼,从待分类的数据中,人工标注一些 样本,并把它们作为训练样本,这样的话,可以把条件改善,用监督学习 方法来做。对于不同的场景,正负样本的分布如果会存在偏移(可能大的 偏移,可能比较小),这样的话,监督学习的效果可能就不如用非监督学 习了。


7. 聚类算法


聚类分析是一种分类的多元统计分析方法。按照个体或样品的特征将它们 分类,使同一类别内的个体具有尽可能高的同质性(homogeneity),而不同类别 之间则应具有尽可能高的异质性(heterogeneity)。

利用样本的特征,使最终的结果,同一类别内的样本具有较高的相似性,不同类别的样本具有较高相异性
其利用的就是k-means算法

  • k-means算法原理
    在这里插入图片描述

8. k-means算法自实现


import numpy as np  ## 科学计算库
import matplotlib.pyplot as plt  ## 数据可视化库
import pandas as pd  ## 数据处理库

def built_data():
    """
    构建数据
    :return: 数据
    """
    # 加载数据
    # 1. open
    # 2. np.loadtxt np.genfromtxt
    # 3. pandas.read_table
    # 参数1 文件路径 + 名称
    # delimiter sep 都可以指定分隔符
    data = pd.read_table('test.txt',sep='\t',header=None)

    # 将data转换为矩阵
    data = np.mat(data.values)
    return data

def center_init(data,k):
    """
    聚类中心初始化
    :param data: 数据
    :param k: 聚类的类别数目
    :return: center
    """

    # 随机选择所有样本中的四个样本作为最开始的聚类中心
    # 随机选取四个聚类中心 行的范围
    index_num = data.shape[0]
    # 确定随机四核聚类中心的列数
    column_num = data.shape[1]
    # 初始化一个全为0的聚类中心数组
    center = np.zeros(shape=(k,column_num))
    # 定义一个计数器,计4次
    i = 0
    # 创建一个列表
    r_list = []
    while True:
        # 随机选取行下标
        r = np.random.randint(low=0,high=index_num)
		# 创建一个r列表,选取四个不重复的聚类中心
        if r not in r_list:
            # 对聚类中心进行赋值
            r_list.append(r)
            # 四行替换为随机的行作为聚类中心
            center[i,:]=data[r,:]
        else:
            continue
        # 初始化中心的退出条件
        if len(r_list) == k:
            break
        i += 1
    return center

def distance(v1,v2):
    """
    距离运算
    :param v1: 点1
    :param v2: 点2
    :return: 距离
    """
    # 方法1:
    # 计算距离
    # sum_ = 0
    # # 将v1由二维降为1维(2,)
    # # 将矩阵转换为数组
    # # 矩阵视图 ----------矩阵.A -----------》数组
    # v1 = v1.A[0]
    # if v1.shape == v2.shape:
    #     for i in range(len(v1)):
    #         sum_ += (v1[i]-v2[i])**2
    # dist = np.sqrt(sum_)

    # 方法2
    dist = np.sqrt(np.sum(np.power((v1-v2),2)))
    return dist

def k_means_owns(data,k):
    """
    # 自实现k-means原理
    :param data: 数据
    :param k: 聚类的类别数目
    :return: None
    """
    # 初始化聚类中心----随机初始化
    # 随机在所有样本中选取四个聚类中心
    center = center_init(data,k)
    # 确定距离最近以及距离该聚类中心的距离数组的行数(应该是每个数据都有一个最小距离)
    index_num = data.shape[0]

    # 定义一个数组来保存 该样本最近的聚类中心以及距离该聚类中心的距离
    # 初始化全为0
    new_data = np.zeros(shape=(index_num,2))
    flag = True
    while flag:
        flag = False
    # 计算每一个训练样本与聚类中心的距离
    ## 双层循环 -- 外层 -- 训练样本
    #              内层 -- 聚类中心
        for i in range(index_num):
            min_dist = 10000000000000
            min_index = -1
            for j in range(k):
            ## 计算距离
            # 高维度的数组使用下标 会降维
            # 矩阵是特殊的二维数组
                dist = distance(data[i,:],center[j,:])
                # print(dist)
                if dist < min_dist:
                    min_dist = dist
                    min_index = j
            # 如果当前计算的样本属于聚类中心的类别与上次不一致
            if new_data[i,0] != min_index:
                flag = True
                new_data[i,:] = min_index,min_dist

        if flag:
            # 计算新的聚类中心
            # 计算每一簇的均值 --- 每一簇的中心
            for p in range(k):
                # 返回布尔数组
                bool_index = new_data[:,0] == p
                # print(bool_index)
                # 选定簇;选定k所对应索引的行
                p_cluster = data[bool_index,:]

                # 新的聚类中心
                center[p,:] = p_cluster[:,0].mean(),p_cluster[:,1].mean()
            # 如果新的聚类中心与上一次的聚类中心重合----结束
            # 如果这一次 所有样本所属的聚类中心 与上一次 所有样本所属的聚类中心的类别 一致 ---- 结束

    return new_data,center

def show_res_owns(data,new_data,center):
    """
    结果展示
    :param data: 原始数据
    :param new_data: 保存着各个样本最终的类别
    :param center: 最终的聚类中心
    :return: None
    """
    # 1. 创建画布
    plt.figure()
    # 需要更改RC参数让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei' # 影响负号,需要加下面的
    plt.rcParams['axes.unicode_minus'] = False


    # 设置颜色列表
    c_list = ['r','g','y','pink']
    marker_list = ['*','o','d','D']
    # 2. 绘图
    for i in range(data.shape[0]):
        # 绘制散点图
        plt.scatter(data[i,0],data[i,1],c=c_list[int(new_data[i,0])],marker=marker_list[int(new_data[i,0])])
    # 绘制聚类中心
    plt.plot(center[:,0],center[:,1],'bx',markersize=12)
    # 增加名称
    plt.title("聚类结果展示")
    # 保存图片
    plt.savefig("聚类结果.png")
    # 3. 展示
    plt.show()

def main():
    # 第一步:构建数据
    data = built_data() # 返回一个矩阵
    # print("data:\n",data)
    # print("data的类型:\n",type(data))
    # print("data的数据类型:\n",data.dtype)

    # 第二步:自实现k-means算法原理
    # 确定聚类的类别数目
    k = 4
    new_data, center = k_means_owns(data,k)


    # 第三步:结果展示
    show_res_owns(data,new_data,center)


if __name__ == '__main__':
    main()

9. KMeans算法实现聚类


import numpy as np  ## 科学计算库
import matplotlib.pyplot as plt  ## 数据可视化库
import pandas as pd  ## 数据处理库
from sklearn.cluster import KMeans # KMeans算法

def built_data():
    """
    构建数据
    :return: 数据
    """
    data = pd.read_table('test.txt',sep='\t',header=None)
    # 将data转换为矩阵
    data = np.mat(data.values)
    return data


def show_res(data,y_predict,center):
    """
    结果展示
    :param data: 原始数据
    :param new_data: 样本的预测类别
    :param center: 最终的聚类中心
    :return: None
    """
    # 1. 创建画布
    plt.figure()
    # 需要更改RC参数让其支持中文
    plt.rcParams['font.sans-serif'] = 'SimHei' # 影响负号,需要加下面的
    plt.rcParams['axes.unicode_minus'] = False

    # 设置颜色列表
    c_list = ['r','g','y','pink']
    marker_list = ['*','o','d','D']
    # 2. 绘图
    for i in range(data.shape[0]):
        # 绘制散点图
        plt.scatter(data[i,0],data[i,1],c=c_list[y_predict[i]],marker=marker_list[y_predict[i]])
    # 绘制聚类中心
    plt.plot(center[:,0],center[:,1],'bx',markersize=12)
    # 增加名称
    plt.title("聚类结果展示")
    # 3. 展示
    plt.show()

def main():
    # 第一步:构建数据
    data = built_data() # 返回一个矩阵

    # 2. 使用sllearn中的KMeans进行聚类分析
    # 确定聚类的类别数目
    k = 4
    # (1)构建算法实例
    # n_clusters指定聚类的类别
    km = KMeans(n_clusters=k)
    # (2)进行训练数据
    km.fit(data)
    # (3)验证模型的好坏-----即得到预测值
    y_predict = km.predict(data)
    # K-means 算法----聚类中心
    center = km.cluster_centers_
    print("预测类别:\n",y_predict)
    print("聚类中心:\n",center)

    # 3. 结果可视化
    show_res(data,y_predict,center)


if __name__ == '__main__':
    main()

发布了107 篇原创文章 · 获赞 43 · 访问量 6123

猜你喜欢

转载自blog.csdn.net/langdei/article/details/103243796