使用Python进行无监督学习!想偷懒?不存在的!使用Python进行无监督学习!想偷懒?不存在的!

无监督学习是一种用于在数据中查找模式的机器学习技术。无监督算法给出的数据不带标记,只给出输入变量(X),没有相应的输出变量。在无监督学习中,算法自己去发现数据中有趣的结构。

使用Python进行无监督学习!想偷懒?不存在的!

人工智能研究总监严乐群解释说,非监督学习教学机器能够自主学习,而不需要被明确告知它们所做的一切是对是错,这是实现真正人工智能的关键。

监督与无监督学习

在监督学习中,系统试图从前面给出的例子中学习。(另一方面,在无监督学习中,系统试图直接从给出的例子中找到模式。)如果数据集被标记,它就会遇到监督问题,如果数据集没有标记,那么它就是一个监督问题。

进群:960410445 即可获取书十套PDF!

使用Python进行无监督学习!想偷懒?不存在的!

SRC

左边的图像是监督学习的一个例子;我们使用回归技术来寻找特征之间的最佳匹配线。而在无监督学习中,输入是基于特征分离的,预测是基于它所属的集群。

重要术语

特性:用于预测的输入变量。

预测:当提供一个输入示例时,模型s的输出。

示例:数据集的一行。示例包含一个或多个特性,可能还有一个标签。

标签:特性的结果。

为无监督学习准备数据

在本文中,我们使用Iris数据集进行第一次预测。该数据集包含一组150条记录,包含5个属性:花瓣长度、花瓣宽度、萼片长度、萼片宽度和类别。蝴蝶花,蝴蝶花和花色蝴蝶花是三个等级。对于我们的无监督算法,我们给出虹膜花的这四个特征,并预测它属于哪一类。

我们使用Python中的sklearn库加载Iris数据集,使用matplotlib实现数据可视化。下面是用于研究数据集的代码片段。

# Importing Modules
from sklearn import datasets
import matplotlib.pyplot as plt
# Loading dataset
iris_df = datasets.load_iris()
# Available methods on dataset
print(dir(iris_df))
# Features
print(iris_df.feature_names)
# Targets
print(iris_df.target)
# Target Names
print(iris_df.target_names)
label = {0: 'red', 1: 'blue', 2: 'green'}
# Dataset Slicing
x_axis = iris_df.data[:, 0] # Sepal Length
y_axis = iris_df.data[:, 2] # Sepal Width
# Plotting
plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()
['DESCR','data','feature_names','target','target_names'] 
['sepal length(cm)','sepal width(cm)','petal length(cm)','petal width(厘米)']
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
['setosa''versicolor''virginica']

使用Python进行无监督学习!想偷懒?不存在的!

紫罗兰:濑户草,绿色:杂色,黄色:弗吉尼亚

使用Python进行无监督学习!想偷懒?不存在的!

在上面的图像中,左边的图像是未分类的原始数据,右边的图像是聚类的(根据数据的特征进行分类)。当给定一个要预测的输入时,它会根据它的特性检查它所属的集群,然后进行预测。

Python中的K-Means聚类

K均值是一种迭代聚类算法,其目标是在每次迭代中寻找局部最大值。选择初始所需的集群数量。因为我们知道有3个类,所以我们编写算法将数据分组到3个类中,方法是将参数n个集群传递到KMeans模型中。现在随机将三个点(输入)分配到三个集群中。根据每个点之间的质心距离,下一个给定的输入被分离成受尊重的集群。现在,重新计算所有集群的质心。

集群的每个质心是定义结果组的特征值的集合。质心特征权值的检验可以定性地解释每个聚类所代表的组的类型。

从sklearn库中导入KMeans模型,进行特征拟合和预测。

K是Python中的实现。

# Importing Modules
from sklearn import datasets
from sklearn.cluster import KMeans
# Loading dataset
iris_df = datasets.load_iris()
# Declaring Model
model = KMeans(n_clusters=3)
# Fitting Model
model.fit(iris_df.data)
# Predicitng a single input
predicted_label = model.predict([[7.2, 3.5, 0.8, 1.6]])
# Prediction on the entire data
all_predictions = model.predict(iris_df.data)
# Printing Predictions
print(predicted_label)
print(all_predictions)
[0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 1 2 1 1 2 1 1 2 2 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 2 1 1 2]

分层聚类

分层聚类,顾名思义,是一种构建集群层次结构的算法。该算法首先将所有数据分配给自己的集群。然后将两个最近的集群连接到同一个集群中。最后,当只剩下一个集群时,该算法就结束了。

利用树状图可以显示层次聚类的完成情况。现在让我们看一个谷物数据分层聚类的例子。数据集可以在这里找到。

Python中的分层集群实现。

# Importing Modules
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
import pandas as pd
# Reading the DataFrame
seeds_df = pd.read_csv(
 "https://raw.githubusercontent.com/vihar/unsupervised-learning-with-python/master/seeds-less-rows.csv")
# Remove the grain species from the DataFrame, save for later
varieties = list(seeds_df.pop('grain_variety'))
# Extract the measurements as a NumPy array
samples = seeds_df.values
"""
Perform hierarchical clustering on samples using the
linkage() function with the method='complete' keyword argument.
Assign the result to mergings.
"""
mergings = linkage(samples, method='complete')
"""
Plot a dendrogram using the dendrogram() function on mergings,
specifying the keyword arguments labels=varieties, leaf_rotation=90,
and leaf_font_size=6.
"""
dendrogram(mergings,
 labels=varieties,
 leaf_rotation=90,
 leaf_font_size=6,
 )
plt.show()

使用Python进行无监督学习!想偷懒?不存在的!

K均值和分层聚类之间的差异

  • 层次聚类不能很好地处理大数据,K表示聚类可以。这是因为K均值的时间复杂度是线性的,即O(n),而层次聚类的时间复杂度是二次的,即O(n2)。
  • 在K均值聚类中,当我们从任意选择的聚类开始时,多次运行该算法生成的结果可能会有所不同。而结果在层次聚类中是可重复的。
  • 当星系团的形状是超球形(如二维的圆形,三维的球形)时,发现K 代表工作良好。
  • K-Means不允许有噪声的数据,而在分层中我们可以直接使用有噪声的数据集进行聚类。

t-SNE聚类

它是一种无监督的可视化学习方法。t-SNE代表t分布随机邻居嵌入。它将高维空间映射到可以可视化的二维或三维空间。具体地说,它通过一个二维或三维点对每个高维物体进行建模,其方法是用附近的点对相似的物体建模,用高概率的远点对不同的物体建模。

Python中Iris数据集的t-SNE聚类实现。

# Importing Modules
from sklearn import datasets
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# Loading dataset
iris_df = datasets.load_iris()
# Defining Model
model = TSNE(learning_rate=100)
# Fitting Model
transformed = model.fit_transform(iris_df.data)
# Plotting 2d t-Sne
x_axis = transformed[:, 0]
y_axis = transformed[:, 1]
plt.scatter(x_axis, y_axis, c=iris_df.target)
plt.show()

使用Python进行无监督学习!想偷懒?不存在的!

紫色:Setosa,绿色:Versicolor,黄色:Virginica

这里,由于Iris数据集具有四个特征(4d),将其转换成二维图表示。类似地,t-SNE模型可以应用于具有n个特征的数据集。

DBSCAN群集

DBSCAN(基于密度的噪声应用空间聚类)是一种常用的聚类算法,用于替代预测分析中的k均值。它不需要您输入集群的数量才能运行。但作为交换,您必须调优其他两个参数。

scikit-learn实现为eps和min示例参数提供了默认值,但是通常需要对它们进行调优。eps参数是在同一个邻域内需要考虑的两个数据点之间的最大距离。最小样本参数是一个邻域内被认为是一个集群的数据点的最小数量。

DBSCAN在Python中的聚类。

# Importing Modules
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA
# Load Dataset
iris = load_iris()
# Declaring Model
dbscan = DBSCAN()
# Fitting
dbscan.fit(iris.data)
# Transoring Using PCA
pca = PCA(n_components=2).fit(iris.data)
pca_2d = pca.transform(iris.data)
# Plot based on Class
for i in range(0, pca_2d.shape[0]):
 if dbscan.labels_[i] == 0:
 c1 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='r', marker='+')
 elif dbscan.labels_[i] == 1:
 c2 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='g', marker='o')
 elif dbscan.labels_[i] == -1:
 c3 = plt.scatter(pca_2d[i, 0], pca_2d[i, 1], c='b', marker='*')
plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Noise'])
plt.title('DBSCAN finds 2 clusters and Noise')
plt.show()

使用Python进行无监督学习!想偷懒?不存在的!

更多无监督技术:

  • 主成分分析(PCA)
  • 异常检测
  • 自动编码
  • 深信仰网
  • Hebbian学习
  • 生成对抗网络(GAN)
  • 自组织地图

猜你喜欢

转载自blog.csdn.net/qq_42156420/article/details/86488995