机器学习

PySpark-ml-分类-clustering

2019-08-05  本文已影响0人  NEO_X

更多信息https://blue-shadow.top/

更多信息在Github上:https://github.com/Shadow-Hunter-X

无督导学习

前面介绍的几种机器学习算法都是监督机器的学习,在已知目标变量或标签的位置,我们试图预测基于输入特性的输出。
无监督学习是不同的一种没有标记数据的感觉,我们不会试图预测任何输出因此,但试图找到有趣的模式,并提出
数据中的组,类似的值被组合在一起。

主要的方法

年龄 薪水 体重 身高
30 15k 62 172
40 25k 75 170
distance.png

=√((30-40)² + (15-25)² + (62-75)² + (172-170)²)
=√(100+100+169+4)
=19.3

还要其他计算距离的算法: Manhattan 距离 ; Mahalanobis距离 ;Chebyshev 距离等。

计算得到上述两个对象间的距离为19.3

K-Means算法

K代表数据集中划分类别的个数,现在对K-Menas算法中的一些概念的说明。

图心指的是中心的数据点,在一个集群的中心或一个组。它也是集群中最具有代表性的点,最大距离等距点到集群中的其他点。
每个集群或组包含不同数量的数据点到图心的质心最近

centroid.png

聚类的整个想法是最小化内光距离,这是集群的图心的数据点的内部距离最大限度的相互聚系距离,即两个之间的图心之间不同分类

var.png

示例代码

用的测试数据是 iris data(鸢尾科话)数据,由于这份数据在统计计算测试中经常用到,所以在网络上搜索下,就可以找到。

from pyspark.sql import SparkSession
import pyspark

from pyspark.sql.functions import * 
from pyspark.sql.types import *
from pyspark.sql.functions import rand, randn
from pyspark.ml.clustering import KMeans

spark = SparkSession.builder.appName('k_means').getOrCreate()  # 创建SparkSession对象

print("------------------读取数据-----------------")

df=spark.read.csv('iris_dataset.csv',inferSchema=True,header=True)  # 读取数据

print("------------------查看分析数据-----------------")

print((df.count(),len(df.columns)))         # 查看数据规模

# 查看列信息
df.printSchema()
df.columns            

df.orderBy(rand()).show(10,False)           # 查看数据,随机的方式

df.groupBy('species').count().orderBy('count',ascending=False).show(10,False) # 汇总查看数据

print("-----------------数据转换-------------------")

from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler    # 导入VerctorAssembler 将多个列合并成向量列的特征转换器,即将表中各列用一个类似list表示,输出预测列为单独一列。


input_cols=['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

# 将所有的属性转换为转化为一个vector
vec_assembler = VectorAssembler(inputCols = input_cols, outputCol='features')
final_data = vec_assembler.transform(df)

print("------------设定不同的K值,进行分类,计算平方误差之和------------")

errors=[]

for k in range(2,10):
    kmeans = KMeans(featuresCol='features',k=k)
    model = kmeans.fit(final_data)
    intra_distance = model.computeCost(final_data)
    errors.append(intra_distance)
    print("With K={}".format(k))
    print("Within Set Sum of Squared Errors = " + str(errors))
    print('--'*30)

print("-----------使用mathplot计算,汇总不同K值-----------------")

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

cluster_number = range(2,10)
plt.scatter(cluster_number,errors)
plt.xlabel('Number of Clusters (K)')
plt.ylabel('SSE')
plt.show()

# 通过图形,查看k=4时较为合适
kmeans = KMeans(featuresCol='features',k=4,)
model = kmeans.fit(final_data)

predictions=model.transform(final_data)

predictions.groupBy('species','prediction').count().show()      # 查看分类的数据

print("---------将数据转换为panda结构,并查看空间3d图心-----------")

pandas_df = predictions.toPandas()
pandas_df.sample(5)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

cluster_vis = plt.figure(figsize=(15,10)).gca(projection='3d')
cluster_vis.scatter(pandas_df.sepal_length, pandas_df.sepal_width, pandas_df.petal_length, c=pandas_df.prediction,depthshade=False)
plt.show()
Figure_1.png Figure_2.png part1.png part2.png part3.png

上一篇:PySpark-ml-推荐系统
下一篇:Oozie-关于Oozie

上一篇下一篇

猜你喜欢

热点阅读